Mercurial > public > ostc4
comparison Small_CPU/Src/pressure.c @ 332:39f146ccdb1b
Merged in Ideenmodellierer/ostc4/I2C_Improvment (pull request #30)
I2C Improvment
author | heinrichsweikamp <bitbucket@heinrichsweikamp.com> |
---|---|
date | Thu, 18 Jul 2019 14:26:56 +0000 |
parents | b4c578caaafb |
children | c11ce8c885d3 |
comparison
equal
deleted
inserted
replaced
326:2559a3f0f1f2 | 332:39f146ccdb1b |
---|---|
26 | 26 |
27 /* surface time | 27 /* surface time |
28 the last 30 minutes will be saved once per minute in a endless loop | 28 the last 30 minutes will be saved once per minute in a endless loop |
29 at the beginning of a dive the oldest value will be used | 29 at the beginning of a dive the oldest value will be used |
30 */ | 30 */ |
31 | 31 #include "math.h" |
32 #include "scheduler.h" | 32 #include "scheduler.h" |
33 #include "pressure.h" | 33 #include "pressure.h" |
34 #include "i2c.h" | 34 #include "i2c.h" |
35 #include "rtc.h" | 35 #include "rtc.h" |
36 | 36 |
44 #define CMD_ADC_1024 0x04 // ADC OSR=1024 | 44 #define CMD_ADC_1024 0x04 // ADC OSR=1024 |
45 #define CMD_ADC_2048 0x06 // ADC OSR=2056 | 45 #define CMD_ADC_2048 0x06 // ADC OSR=2056 |
46 #define CMD_ADC_4096 0x08 // ADC OSR=4096 | 46 #define CMD_ADC_4096 0x08 // ADC OSR=4096 |
47 #define CMD_PROM_RD 0xA0 // Prom read command | 47 #define CMD_PROM_RD 0xA0 // Prom read command |
48 | 48 |
49 #define PRESSURE_HISTORY_SIZE (8u) | |
50 #define PRESSURE_JUMP_VALID_MBAR (500.0f) /* values are measure several times a second => jumps > 5m very unlikely */ | |
51 | |
49 static uint16_t get_ci_by_coef_num(uint8_t coef_num); | 52 static uint16_t get_ci_by_coef_num(uint8_t coef_num); |
50 //void pressure_calculation_new(void); | 53 //void pressure_calculation_new(void); |
51 //void pressure_calculation_old(void); | 54 //void pressure_calculation_old(void); |
52 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void); | 55 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void); |
53 static uint8_t crc4(uint16_t n_prom[]); | 56 static uint8_t crc4(uint16_t n_prom[]); |
72 short UT1 = -1; | 75 short UT1 = -1; |
73 short C6plus100 = -1; | 76 short C6plus100 = -1; |
74 */ | 77 */ |
75 | 78 |
76 static float ambient_temperature = 0; | 79 static float ambient_temperature = 0; |
77 static float ambient_pressure_mbar = 0; | 80 static float ambient_pressure_mbar = 1000.0; |
78 static float surface_pressure_mbar = 1000; | 81 static float surface_pressure_mbar = 1000.0; |
79 static float surface_ring_mbar[31] = { 0 }; | 82 static float surface_ring_mbar[31] = { 0 }; |
83 | |
84 static float pressure_history_mbar[PRESSURE_HISTORY_SIZE]; | |
80 | 85 |
81 uint8_t secondCounterSurfaceRing = 0; | 86 uint8_t secondCounterSurfaceRing = 0; |
82 | 87 |
83 float get_temperature(void) | 88 float get_temperature(void) |
84 { | 89 { |
102 for(int i=1; i<31; i++) | 107 for(int i=1; i<31; i++) |
103 surface_ring_mbar[i] = ambient_pressure_mbar; | 108 surface_ring_mbar[i] = ambient_pressure_mbar; |
104 surface_pressure_mbar = ambient_pressure_mbar; | 109 surface_pressure_mbar = ambient_pressure_mbar; |
105 } | 110 } |
106 | 111 |
112 void init_pressure_history(void) | |
113 { | |
114 for(int i=0; i<PRESSURE_HISTORY_SIZE; i++) | |
115 { | |
116 pressure_history_mbar[i] = 1000.0; | |
117 } | |
118 } | |
107 | 119 |
108 /* the ring has one place with 0 | 120 /* the ring has one place with 0 |
109 * after that comes the oldest value | 121 * after that comes the oldest value |
110 * the new pressure is written in this hole | 122 * the new pressure is written in this hole |
111 * the oldest value is read and then the new hole | 123 * the oldest value is read and then the new hole |
117 if(secondCounterSurfaceRing < 60) | 129 if(secondCounterSurfaceRing < 60) |
118 return; | 130 return; |
119 | 131 |
120 secondCounterSurfaceRing = 0; | 132 secondCounterSurfaceRing = 0; |
121 | 133 |
122 int hole; | 134 if(is_init_pressure_done()) |
123 for(hole=30;hole>0;hole--) | 135 { |
124 if(surface_ring_mbar[hole] == 0) { break; } | 136 int hole; |
125 | 137 for(hole=30;hole>0;hole--) |
126 surface_ring_mbar[hole] = ambient_pressure_mbar; | 138 if(surface_ring_mbar[hole] == 0) { break; } |
127 | 139 |
128 hole++; | 140 surface_ring_mbar[hole] = ambient_pressure_mbar; |
129 if(hole > 30) | 141 |
130 hole = 0; | 142 hole++; |
131 surface_pressure_mbar = surface_ring_mbar[hole]; | 143 if(hole > 30) |
132 surface_ring_mbar[hole] = 0; | 144 hole = 0; |
145 surface_pressure_mbar = surface_ring_mbar[hole]; | |
146 surface_ring_mbar[hole] = 0; | |
147 } | |
133 } | 148 } |
134 | 149 |
135 #ifdef DEMOMODE | 150 #ifdef DEMOMODE |
136 float demo_modify_temperature_helper(float bottom_mbar_diff_to_surface) | 151 float demo_modify_temperature_helper(float bottom_mbar_diff_to_surface) |
137 { | 152 { |
207 return 0; | 222 return 0; |
208 } | 223 } |
209 } | 224 } |
210 #endif | 225 #endif |
211 | 226 |
212 | 227 uint8_t is_init_pressure_done(void) |
213 /* called just once on power on */ | 228 { |
214 /* TBD old DR5 code? */ | 229 return pressureSensorInitSuccess; |
215 void init_pressure_DRx(void) | 230 } |
216 { | 231 |
217 uint8_t resetCommand[1] = {0x1E}; | 232 uint8_t init_pressure(void) |
218 | 233 { |
219 I2C_Master_Transmit( DEVICE_PRESSURE, resetCommand, 1); | 234 uint8_t buffer[1]; |
235 buffer[0] = 0x1e; | |
236 uint8_t retValue = 0xFF; | |
237 | |
238 pressureSensorInitSuccess = false; | |
239 init_pressure_history(); | |
240 | |
241 /* Send reset request to pressure sensor */ | |
242 retValue = I2C_Master_Transmit( DEVICE_PRESSURE, buffer, 1); | |
243 if(retValue != HAL_OK) | |
244 { | |
245 return (HAL_StatusTypeDef)retValue; | |
246 } | |
220 HAL_Delay(3); | 247 HAL_Delay(3); |
221 | 248 |
222 C[1] = get_ci_by_coef_num(0x02); | 249 for(uint8_t i=0;i<8;i++) |
223 C[2] = get_ci_by_coef_num(0x04); | 250 { |
224 C[3] = get_ci_by_coef_num(0x06); | 251 C[i] = get_ci_by_coef_num(i); |
225 C[4] = get_ci_by_coef_num(0x08); | 252 } |
226 C[5] = get_ci_by_coef_num(0x0A); | 253 n_crc = crc4(C); // no evaluation at the moment hw 151026 |
227 C[6] = get_ci_by_coef_num(0x0C); | 254 |
228 | |
229 C5_x_2p8 = C[5] * 256; | 255 C5_x_2p8 = C[5] * 256; |
230 C2_x_2p16 = C[2] * 65536; | 256 C2_x_2p16 = C[2] * 65536; |
231 C1_x_2p15 = C[1] * 32768; | 257 C1_x_2p15 = C[1] * 32768; |
232 pressure_update(); | |
233 } | |
234 | |
235 uint8_t is_init_pressure_done(void) | |
236 { | |
237 return pressureSensorInitSuccess; | |
238 } | |
239 | |
240 uint8_t init_pressure(void) | |
241 { | |
242 uint8_t buffer[1]; | |
243 buffer[0] = 0x1e; | |
244 uint8_t retValue = 0xFF; | |
245 | |
246 | |
247 retValue = I2C_Master_Transmit( DEVICE_PRESSURE, buffer, 1); | |
248 if(retValue != HAL_OK) | |
249 { | |
250 return (HAL_StatusTypeDef)retValue; | |
251 } | |
252 HAL_Delay(3); | |
253 | |
254 for(uint8_t i=0;i<8;i++) | |
255 { | |
256 C[i] = get_ci_by_coef_num(i); | |
257 } | |
258 n_crc = crc4(C); // no evaluation at the moment hw 151026 | |
259 | |
260 C5_x_2p8 = C[5] * 256; | |
261 C2_x_2p16 = C[2] * 65536; | |
262 C1_x_2p15 = C[1] * 32768; | |
263 | 258 |
264 if(global.I2C_SystemStatus == HAL_OK) | 259 if(global.I2C_SystemStatus == HAL_OK) |
265 { | 260 { |
266 pressureSensorInitSuccess = 1; | 261 pressureSensorInitSuccess = 1; |
267 } | 262 retValue = pressure_update(); |
268 return pressure_update(); | 263 |
264 } | |
265 return retValue; | |
269 } | 266 } |
270 | 267 |
271 | 268 |
272 static uint32_t get_adc(void) | 269 static uint32_t get_adc(void) |
273 { | 270 { |
414 return; | 411 return; |
415 | 412 |
416 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(); | 413 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(); |
417 } | 414 } |
418 | 415 |
416 static uint8_t pressure_plausible(float pressurevalue) | |
417 { | |
418 static uint8_t pressurewriteindex = 0; | |
419 uint8_t retval = 0; | |
420 uint8_t index; | |
421 float pressure_average = 0; | |
422 | |
423 for(index = 0; index < PRESSURE_HISTORY_SIZE; index++) | |
424 { | |
425 pressure_average += pressure_history_mbar[index]; | |
426 } | |
427 pressure_average /= PRESSURE_HISTORY_SIZE; | |
428 if(pressure_average == 1000.0) /* first pressure calculation */ | |
429 { | |
430 if(fabs(pressurevalue - pressure_average) < 11000.0) /* just in case a reset occure during dive assume value equal < 100m as valid */ | |
431 { | |
432 for(index = 0; index < PRESSURE_HISTORY_SIZE; index++) | |
433 { | |
434 pressure_history_mbar[index] = pressurevalue; /* set history to current value */ | |
435 retval = 1; | |
436 } | |
437 } | |
438 } | |
439 else | |
440 { | |
441 if(fabs(pressurevalue - pressure_average) < PRESSURE_JUMP_VALID_MBAR) | |
442 pressure_history_mbar[pressurewriteindex++] = pressurevalue; | |
443 pressurewriteindex &= 0x7; /* wrap around if necessary */ | |
444 retval = 1; | |
445 } | |
446 | |
447 return retval; | |
448 } | |
449 | |
419 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void) | 450 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void) |
420 { | 451 { |
421 uint32_t local_D1; // ADC value of the pressure conversion | 452 uint32_t local_D1; // ADC value of the pressure conversion |
422 uint32_t local_D2; // ADC value of the temperature conversion | 453 uint32_t local_D2; // ADC value of the temperature conversion |
423 int32_t local_Px10; // compensated pressure value | 454 int32_t local_Px10; // compensated pressure value |
424 int32_t local_Tx100; // compensated temperature value | 455 int32_t local_Tx100; // compensated temperature value |
425 int64_t local_dT; // int32_t, difference between actual and measured temperature | 456 int64_t local_dT; // int32_t, difference between actual and measured temperature |
426 int64_t local_OFF; // offset at actual temperature | 457 int64_t local_OFF; // offset at actual temperature |
427 int64_t local_SENS; // sensitivity at actual temperature | 458 int64_t local_SENS; // sensitivity at actual temperature |
459 | |
460 float calc_pressure; | |
428 | 461 |
429 int64_t T2; | 462 int64_t T2; |
430 int64_t OFF2; | 463 int64_t OFF2; |
431 int64_t SENS2; | 464 int64_t SENS2; |
432 | 465 |
477 local_Px10 = (int32_t)( | 510 local_Px10 = (int32_t)( |
478 (((int64_t)((local_D1 * local_SENS) / 2097152)) - local_OFF) | 511 (((int64_t)((local_D1 * local_SENS) / 2097152)) - local_OFF) |
479 / 8192 );// )) / 10; // pow(2,21), pow(2,13) | 512 / 8192 );// )) / 10; // pow(2,21), pow(2,13) |
480 | 513 |
481 ambient_temperature = ((float)local_Tx100) / 100; | 514 ambient_temperature = ((float)local_Tx100) / 100; |
482 ambient_pressure_mbar = ((float)local_Px10) / 10; | 515 |
516 calc_pressure = ((float)local_Px10) / 10; | |
517 if(pressure_plausible(calc_pressure)) | |
518 { | |
519 ambient_pressure_mbar = calc_pressure; | |
520 } | |
483 } | 521 } |
484 | 522 |
485 | 523 |
486 /* | 524 /* |
487 void pressure_calculation_new(void) | 525 void pressure_calculation_new(void) |