Skip to content

Commit c7d0f83

Browse files
vsky279marcelstoer
authored andcommitted
Update sensor driver for BME680 to 3.5.9 (#2969)
1 parent 9a2579d commit c7d0f83

File tree

2 files changed

+193
-165
lines changed

2 files changed

+193
-165
lines changed

app/modules/bme680.c

Lines changed: 75 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,10 @@ static uint8_t r8u(uint8_t reg) {
6868
return ret[0];
6969
}
7070

71-
/* This part of code is coming from the original bme680.c driver by Bosch.
71+
// replace 'dev->calib.' with 'bme680_data.'
72+
// replace 'dev->amb_temp' with 'amb_temp'
73+
74+
/**\mainpage
7275
* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
7376
*
7477
* Redistribution and use in source and binary forms, with or without
@@ -108,20 +111,13 @@ static uint8_t r8u(uint8_t reg) {
108111
* other rights of third parties which may result from its use.
109112
* No license is granted by implication or otherwise under any patent or
110113
* patent rights of the copyright holder.
114+
*
115+
* File bme680.c
116+
* @date 19 Jun 2018
117+
* @version 3.5.9
118+
*
111119
*/
112120

113-
/**static variables */
114-
/**Look up table for the possible gas range values */
115-
uint32_t lookupTable1[16] = { UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647),
116-
UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2130303777), UINT32_C(2147483647),
117-
UINT32_C(2147483647), UINT32_C(2143188679), UINT32_C(2136746228), UINT32_C(2147483647), UINT32_C(2126008810),
118-
UINT32_C(2147483647), UINT32_C(2147483647) };
119-
/**Look up table for the possible gas range values */
120-
uint32_t lookupTable2[16] = { UINT32_C(4096000000), UINT32_C(2048000000), UINT32_C(1024000000), UINT32_C(512000000),
121-
UINT32_C(255744255), UINT32_C(127110228), UINT32_C(64000000), UINT32_C(32258064), UINT32_C(16016016), UINT32_C(
122-
8000000), UINT32_C(4000000), UINT32_C(2000000), UINT32_C(1000000), UINT32_C(500000), UINT32_C(250000),
123-
UINT32_C(125000) };
124-
125121
static uint8_t calc_heater_res(uint16_t temp)
126122
{
127123
uint8_t heatr_res;
@@ -132,9 +128,7 @@ static uint8_t calc_heater_res(uint16_t temp)
132128
int32_t var5;
133129
int32_t heatr_res_x100;
134130

135-
if (temp < 200) /* Cap temperature */
136-
temp = 200;
137-
else if (temp > 400)
131+
if (temp > 400) /* Cap temperature */
138132
temp = 400;
139133

140134
var1 = (((int32_t) amb_temp * bme680_data.par_gh3) / 1000) * 256;
@@ -173,12 +167,12 @@ static int16_t calc_temperature(uint32_t temp_adc)
173167
int64_t var3;
174168
int16_t calc_temp;
175169

176-
var1 = ((int32_t) temp_adc / 8) - ((int32_t) bme680_data.par_t1 * 2);
177-
var2 = (var1 * (int32_t) bme680_data.par_t2) / 2048;
178-
var3 = ((var1 / 2) * (var1 / 2)) / 4096;
179-
var3 = ((var3) * ((int32_t) bme680_data.par_t3 * 16)) / 16384;
170+
var1 = ((int32_t) temp_adc >> 3) - ((int32_t) bme680_data.par_t1 << 1);
171+
var2 = (var1 * (int32_t) bme680_data.par_t2) >> 11;
172+
var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
173+
var3 = ((var3) * ((int32_t) bme680_data.par_t3 << 4)) >> 14;
180174
bme680_data.t_fine = (int32_t) (var2 + var3);
181-
calc_temp = (int16_t) (((bme680_data.t_fine * 5) + 128) / 256);
175+
calc_temp = (int16_t) (((bme680_data.t_fine * 5) + 128) >> 8);
182176

183177
return calc_temp;
184178
}
@@ -188,27 +182,37 @@ static uint32_t calc_pressure(uint32_t pres_adc)
188182
int32_t var1;
189183
int32_t var2;
190184
int32_t var3;
191-
int32_t calc_pres;
192-
193-
var1 = (((int32_t) bme680_data.t_fine) / 2) - 64000;
194-
var2 = ((var1 / 4) * (var1 / 4)) / 2048;
195-
var2 = ((var2) * (int32_t) bme680_data.par_p6) / 4;
196-
var2 = var2 + ((var1 * (int32_t) bme680_data.par_p5) * 2);
197-
var2 = (var2 / 4) + ((int32_t) bme680_data.par_p4 * 65536);
198-
var1 = ((var1 / 4) * (var1 / 4)) / 8192;
199-
var1 = (((var1) * ((int32_t) bme680_data.par_p3 * 32)) / 8) + (((int32_t) bme680_data.par_p2 * var1) / 2);
200-
var1 = var1 / 262144;
201-
var1 = ((32768 + var1) * (int32_t) bme680_data.par_p1) / 32768;
202-
calc_pres = (int32_t) (1048576 - pres_adc);
203-
calc_pres = (int32_t) ((calc_pres - (var2 / 4096)) * (3125));
204-
calc_pres = ((calc_pres / var1) * 2);
205-
var1 = ((int32_t) bme680_data.par_p9 * (int32_t) (((calc_pres / 8) * (calc_pres / 8)) / 8192)) / 4096;
206-
var2 = ((int32_t) (calc_pres / 4) * (int32_t) bme680_data.par_p8) / 8192;
207-
var3 = ((int32_t) (calc_pres / 256) * (int32_t) (calc_pres / 256) * (int32_t) (calc_pres / 256)
208-
* (int32_t) bme680_data.par_p10) / 131072;
209-
calc_pres = (int32_t) (calc_pres) + ((var1 + var2 + var3 + ((int32_t) bme680_data.par_p7 * 128)) / 16);
210-
211-
return (uint32_t) calc_pres;
185+
int32_t pressure_comp;
186+
187+
var1 = (((int32_t)bme680_data.t_fine) >> 1) - 64000;
188+
var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) *
189+
(int32_t)bme680_data.par_p6) >> 2;
190+
var2 = var2 + ((var1 * (int32_t)bme680_data.par_p5) << 1);
191+
var2 = (var2 >> 2) + ((int32_t)bme680_data.par_p4 << 16);
192+
var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
193+
((int32_t)bme680_data.par_p3 << 5)) >> 3) +
194+
(((int32_t)bme680_data.par_p2 * var1) >> 1);
195+
var1 = var1 >> 18;
196+
var1 = ((32768 + var1) * (int32_t)bme680_data.par_p1) >> 15;
197+
pressure_comp = 1048576 - pres_adc;
198+
pressure_comp = (int32_t)((pressure_comp - (var2 >> 12)) * ((uint32_t)3125));
199+
if (pressure_comp >= BME680_MAX_OVERFLOW_VAL)
200+
pressure_comp = ((pressure_comp / var1) << 1);
201+
else
202+
pressure_comp = ((pressure_comp << 1) / var1);
203+
var1 = ((int32_t)bme680_data.par_p9 * (int32_t)(((pressure_comp >> 3) *
204+
(pressure_comp >> 3)) >> 13)) >> 12;
205+
var2 = ((int32_t)(pressure_comp >> 2) *
206+
(int32_t)bme680_data.par_p8) >> 13;
207+
var3 = ((int32_t)(pressure_comp >> 8) * (int32_t)(pressure_comp >> 8) *
208+
(int32_t)(pressure_comp >> 8) *
209+
(int32_t)bme680_data.par_p10) >> 17;
210+
211+
pressure_comp = (int32_t)(pressure_comp) + ((var1 + var2 + var3 +
212+
((int32_t)bme680_data.par_p7 << 7)) >> 4);
213+
214+
return (uint32_t)pressure_comp;
215+
212216
}
213217

214218
static uint32_t calc_humidity(uint16_t hum_adc)
@@ -222,19 +226,19 @@ static uint32_t calc_humidity(uint16_t hum_adc)
222226
int32_t temp_scaled;
223227
int32_t calc_hum;
224228

225-
temp_scaled = (((int32_t) bme680_data.t_fine * 5) + 128) / 256;
229+
temp_scaled = (((int32_t) bme680_data.t_fine * 5) + 128) >> 8;
226230
var1 = (int32_t) (hum_adc - ((int32_t) ((int32_t) bme680_data.par_h1 * 16)))
227-
- (((temp_scaled * (int32_t) bme680_data.par_h3) / ((int32_t) 100)) / 2);
231+
- (((temp_scaled * (int32_t) bme680_data.par_h3) / ((int32_t) 100)) >> 1);
228232
var2 = ((int32_t) bme680_data.par_h2
229-
* (((temp_scaled * (int32_t) bme680_data.par_h4) / ((int32_t) 100))
230-
+ (((temp_scaled * ((temp_scaled * (int32_t) bme680_data.par_h5) / ((int32_t) 100))) / 64)
231-
/ ((int32_t) 100)) + (int32_t) (1 * 16384))) / 1024;
233+
* (((temp_scaled * (int32_t) bme680_data.par_h4) / ((int32_t) 100))
234+
+ (((temp_scaled * ((temp_scaled * (int32_t) bme680_data.par_h5) / ((int32_t) 100))) >> 6)
235+
/ ((int32_t) 100)) + (int32_t) (1 << 14))) >> 10;
232236
var3 = var1 * var2;
233-
var4 = (int32_t) bme680_data.par_h6 * 128;
234-
var4 = ((var4) + ((temp_scaled * (int32_t) bme680_data.par_h7) / ((int32_t) 100))) / 16;
235-
var5 = ((var3 / 16384) * (var3 / 16384)) / 1024;
236-
var6 = (var4 * var5) / 2;
237-
calc_hum = (((var3 + var6) / 1024) * ((int32_t) 1000)) / 4096;
237+
var4 = (int32_t) bme680_data.par_h6 << 7;
238+
var4 = ((var4) + ((temp_scaled * (int32_t) bme680_data.par_h7) / ((int32_t) 100))) >> 4;
239+
var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
240+
var6 = (var4 * var5) >> 1;
241+
calc_hum = (((var3 + var6) >> 10) * ((int32_t) 1000)) >> 12;
238242

239243
if (calc_hum > 100000) /* Cap at 100%rH */
240244
calc_hum = 100000;
@@ -244,21 +248,36 @@ static uint32_t calc_humidity(uint16_t hum_adc)
244248
return (uint32_t) calc_hum;
245249
}
246250

251+
252+
/**static variables */
253+
/**Look up table 1 for the possible gas range values */
254+
uint32_t lookupTable1[16] = { UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647),
255+
UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2130303777),
256+
UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2143188679), UINT32_C(2136746228),
257+
UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2147483647) };
258+
/**Look up table 2 for the possible gas range values */
259+
uint32_t lookupTable2[16] = { UINT32_C(4096000000), UINT32_C(2048000000), UINT32_C(1024000000), UINT32_C(512000000),
260+
UINT32_C(255744255), UINT32_C(127110228), UINT32_C(64000000), UINT32_C(32258064), UINT32_C(16016016),
261+
UINT32_C(8000000), UINT32_C(4000000), UINT32_C(2000000), UINT32_C(1000000), UINT32_C(500000),
262+
UINT32_C(250000), UINT32_C(125000) };
263+
247264
static uint32_t calc_gas_resistance(uint16_t gas_res_adc, uint8_t gas_range)
248265
{
249266
int64_t var1;
250267
uint64_t var2;
251268
int64_t var3;
252269
uint32_t calc_gas_res;
253270

254-
var1 = (int64_t) ((1340 + (5 * (int64_t) bme680_data.range_sw_err)) * ((int64_t) lookupTable1[gas_range])) / 65536;
255-
var2 = (((int64_t) ((int64_t) gas_res_adc * 32768) - (int64_t) (16777216)) + var1);
256-
var3 = (((int64_t) lookupTable2[gas_range] * (int64_t) var1) / 512);
257-
calc_gas_res = (uint32_t) ((var3 + ((int64_t) var2 / 2)) / (int64_t) var2);
271+
var1 = (int64_t) ((1340 + (5 * (int64_t) bme680_data.range_sw_err)) *
272+
((int64_t) lookupTable1[gas_range])) >> 16;
273+
var2 = (((int64_t) ((int64_t) gas_res_adc << 15) - (int64_t) (16777216)) + var1);
274+
var3 = (((int64_t) lookupTable2[gas_range] * (int64_t) var1) >> 9);
275+
calc_gas_res = (uint32_t) ((var3 + ((int64_t) var2 >> 1)) / (int64_t) var2);
258276

259277
return calc_gas_res;
260278
}
261279

280+
262281
uint16_t calc_dur()
263282
{
264283
uint32_t tph_dur; /* Calculate in us */

0 commit comments

Comments
 (0)