Mercurial > public > ostc4
comparison Small_CPU/Src/pressure.c @ 188:ddc21166d25b
Merged in janlmulder/ostc4/cleanup-2 (pull request #5)
Trivial cleanup
author | heinrichsweikamp <bitbucket@heinrichsweikamp.com> |
---|---|
date | Fri, 15 Mar 2019 12:55:58 +0000 |
parents | f11f0bf6ef2d |
children | 2b9775f71e30 |
comparison
equal
deleted
inserted
replaced
185:1bb24fd3fc92 | 188:ddc21166d25b |
---|---|
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 | 49 static uint16_t get_ci_by_coef_num(uint8_t coef_num); |
50 //uint16_t get_ci(uint8_t cmd); | 50 //void pressure_calculation_new(void); |
51 //uint8_t get_ci_crc(void); | 51 //void pressure_calculation_old(void); |
52 uint16_t get_ci_by_coef_num(uint8_t coef_num); | 52 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void); |
53 void pressure_calculation_new(void); | 53 static uint8_t crc4(uint16_t n_prom[]); |
54 void pressure_calculation_old(void); | 54 |
55 void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void); | 55 static HAL_StatusTypeDef pressure_sensor_get_data(void); |
56 | 56 static uint32_t get_adc(void); |
57 uint8_t crc4(uint16_t n_prom[]); | |
58 | |
59 HAL_StatusTypeDef pressure_sensor_get_data(void); | |
60 uint32_t get_adc(void); | |
61 uint8_t pressureSensorInitSuccess = 0; | 57 uint8_t pressureSensorInitSuccess = 0; |
62 | 58 |
63 //void test_calculation(void); | 59 static uint16_t C[8] = { 1 }; |
64 | 60 static uint32_t D1 = 1; |
65 uint16_t C[8] = { 1 }; | 61 static uint32_t D2 = 1; |
66 uint32_t D1 = 1; | 62 static uint8_t n_crc; |
67 uint32_t D2 = 1; | 63 |
68 uint8_t n_crc; | 64 static int64_t C5_x_2p8 = 1; |
69 | 65 static int64_t C2_x_2p16 = 1; |
70 int64_t C5_x_2p8 = 1; | 66 static int64_t C1_x_2p15 = 1; |
71 int64_t C2_x_2p16 = 1; | |
72 int64_t C1_x_2p15 = 1; | |
73 | 67 |
74 /* | 68 /* |
75 short C2plus10000 = -1; | 69 short C2plus10000 = -1; |
76 short C3plus200 = -1; | 70 short C3plus200 = -1; |
77 short C4minus250 = -1; | 71 short C4minus250 = -1; |
78 short UT1 = -1; | 72 short UT1 = -1; |
79 short C6plus100 = -1; | 73 short C6plus100 = -1; |
80 */ | 74 */ |
81 | 75 |
82 float ambient_temperature = 0; | 76 static float ambient_temperature = 0; |
83 float ambient_pressure_mbar = 0; | 77 static float ambient_pressure_mbar = 0; |
84 float surface_pressure_mbar = 1000; | 78 static float surface_pressure_mbar = 1000; |
85 float surface_ring_mbar[31] = { 0 }; | 79 static float surface_ring_mbar[31] = { 0 }; |
86 | 80 |
87 uint8_t secondCounterSurfaceRing = 0; | 81 uint8_t secondCounterSurfaceRing = 0; |
88 | 82 |
89 float get_temperature(void) | 83 float get_temperature(void) |
90 { | 84 { |
91 return ambient_temperature; | 85 return ambient_temperature; |
92 } | 86 } |
93 | 87 |
94 //float test = 1000; | |
95 | |
96 float get_pressure_mbar(void) | 88 float get_pressure_mbar(void) |
97 { | 89 { |
98 // return test; | |
99 return ambient_pressure_mbar; | 90 return ambient_pressure_mbar; |
100 } | 91 } |
101 | |
102 | 92 |
103 float get_surface_mbar(void) | 93 float get_surface_mbar(void) |
104 { | 94 { |
105 return surface_pressure_mbar; | 95 return surface_pressure_mbar; |
106 } | 96 } |
140 hole = 0; | 130 hole = 0; |
141 surface_pressure_mbar = surface_ring_mbar[hole]; | 131 surface_pressure_mbar = surface_ring_mbar[hole]; |
142 surface_ring_mbar[hole] = 0; | 132 surface_ring_mbar[hole] = 0; |
143 } | 133 } |
144 | 134 |
145 | 135 #ifdef DEMOMODE |
146 float demo_modify_temperature_helper(float bottom_mbar_diff_to_surface) | 136 float demo_modify_temperature_helper(float bottom_mbar_diff_to_surface) |
147 { | 137 { |
148 const float temperature_surface = 31.0; | 138 const float temperature_surface = 31.0; |
149 const float temperature_bottom = 14.0; | 139 const float temperature_bottom = 14.0; |
150 | 140 |
215 ambient_pressure_mbar_memory = ambient_pressure_mbar; | 205 ambient_pressure_mbar_memory = ambient_pressure_mbar; |
216 time_last_call = divetime_in_seconds; | 206 time_last_call = divetime_in_seconds; |
217 return 0; | 207 return 0; |
218 } | 208 } |
219 } | 209 } |
210 #endif | |
220 | 211 |
221 | 212 |
222 /* called just once on power on */ | 213 /* called just once on power on */ |
214 /* TBD old DR5 code? */ | |
223 void init_pressure_DRx(void) | 215 void init_pressure_DRx(void) |
224 { | 216 { |
225 uint8_t resetCommand[1] = {0x1E}; | 217 uint8_t resetCommand[1] = {0x1E}; |
226 | 218 |
227 I2C_Master_Transmit( DEVICE_PRESSURE, resetCommand, 1); | 219 I2C_Master_Transmit( DEVICE_PRESSURE, resetCommand, 1); |
275 } | 267 } |
276 return pressure_update(); | 268 return pressure_update(); |
277 } | 269 } |
278 | 270 |
279 | 271 |
280 uint32_t get_adc(void) | 272 static uint32_t get_adc(void) |
281 { | 273 { |
282 uint8_t buffer[1]; | 274 uint8_t buffer[1]; |
283 uint8_t resivebuf[4]; | 275 uint8_t resivebuf[4]; |
284 uint32_t answer = 0; | 276 uint32_t answer = 0; |
285 // | 277 |
286 buffer[0] = 0x00; // Get ADC | 278 buffer[0] = 0x00; // Get ADC |
287 I2C_Master_Transmit( DEVICE_PRESSURE, buffer, 1); | 279 I2C_Master_Transmit( DEVICE_PRESSURE, buffer, 1); |
288 I2C_Master_Receive( DEVICE_PRESSURE, resivebuf, 4); | 280 I2C_Master_Receive( DEVICE_PRESSURE, resivebuf, 4); |
289 resivebuf[3] = 0; | 281 resivebuf[3] = 0; |
290 answer = 256*256 *(uint32_t)resivebuf[0] + 256 * (uint32_t)resivebuf[1] + (uint32_t)resivebuf[2]; | 282 answer = 256*256 *(uint32_t)resivebuf[0] + 256 * (uint32_t)resivebuf[1] + (uint32_t)resivebuf[2]; |
291 | 283 |
292 return answer; | 284 return answer; |
293 } | 285 } |
294 | 286 |
295 | 287 |
296 uint16_t get_ci_by_coef_num(uint8_t coef_num) | 288 static uint16_t get_ci_by_coef_num(uint8_t coef_num) |
297 { | 289 { |
298 uint8_t resivebuf[2]; | 290 uint8_t resivebuf[2]; |
299 | 291 |
300 uint8_t cmd = CMD_PROM_RD+coef_num*2; | 292 uint8_t cmd = CMD_PROM_RD+coef_num*2; |
301 I2C_Master_Transmit( DEVICE_PRESSURE, &cmd, 1); | 293 I2C_Master_Transmit( DEVICE_PRESSURE, &cmd, 1); |
313 pressure_calculation(); | 305 pressure_calculation(); |
314 return (uint8_t)statusReturn; | 306 return (uint8_t)statusReturn; |
315 } | 307 } |
316 | 308 |
317 | 309 |
318 uint32_t pressure_sensor_get_one_value(uint8_t cmd, HAL_StatusTypeDef *statusReturn) | 310 static uint32_t pressure_sensor_get_one_value(uint8_t cmd, HAL_StatusTypeDef *statusReturn) |
319 { | 311 { |
320 uint8_t command = CMD_ADC_CONV + cmd; | 312 uint8_t command = CMD_ADC_CONV + cmd; |
321 HAL_StatusTypeDef statusReturnTemp = HAL_TIMEOUT; | 313 HAL_StatusTypeDef statusReturnTemp = HAL_TIMEOUT; |
322 | 314 |
323 statusReturnTemp = I2C_Master_Transmit( DEVICE_PRESSURE, &command, 1); | 315 statusReturnTemp = I2C_Master_Transmit( DEVICE_PRESSURE, &command, 1); |
337 } | 329 } |
338 return get_adc(); | 330 return get_adc(); |
339 } | 331 } |
340 | 332 |
341 | 333 |
342 HAL_StatusTypeDef pressure_sensor_get_data(void) | 334 static HAL_StatusTypeDef pressure_sensor_get_data(void) |
343 { | 335 { |
344 HAL_StatusTypeDef statusReturn1 = HAL_TIMEOUT; | 336 HAL_StatusTypeDef statusReturn1 = HAL_TIMEOUT; |
345 HAL_StatusTypeDef statusReturn2 = HAL_TIMEOUT; | 337 HAL_StatusTypeDef statusReturn2 = HAL_TIMEOUT; |
346 | 338 |
347 D2 = pressure_sensor_get_one_value(CMD_ADC_D2 + CMD_ADC_4096, &statusReturn1); | 339 D2 = pressure_sensor_get_one_value(CMD_ADC_D2 + CMD_ADC_4096, &statusReturn1); |
370 { | 362 { |
371 if(I2C1_Status() != HAL_OK) | 363 if(I2C1_Status() != HAL_OK) |
372 return; | 364 return; |
373 | 365 |
374 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(); | 366 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(); |
375 return; | 367 } |
376 | 368 |
377 // before October 2016: pressure_calculation_old(); | 369 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void) |
378 | |
379 // pressure_calculation_new(); | |
380 } | |
381 | |
382 void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void) | |
383 { | 370 { |
384 uint32_t local_D1; // ADC value of the pressure conversion | 371 uint32_t local_D1; // ADC value of the pressure conversion |
385 uint32_t local_D2; // ADC value of the temperature conversion | 372 uint32_t local_D2; // ADC value of the temperature conversion |
386 int32_t local_Px10; // compensated pressure value | 373 int32_t local_Px10; // compensated pressure value |
387 int32_t local_Tx100; // compensated temperature value | 374 int32_t local_Tx100; // compensated temperature value |
444 ambient_temperature = ((float)local_Tx100) / 100; | 431 ambient_temperature = ((float)local_Tx100) / 100; |
445 ambient_pressure_mbar = ((float)local_Px10) / 10; | 432 ambient_pressure_mbar = ((float)local_Px10) / 10; |
446 } | 433 } |
447 | 434 |
448 | 435 |
436 /* | |
449 void pressure_calculation_new(void) | 437 void pressure_calculation_new(void) |
450 { | 438 { |
451 #define POW2_8 (256) | 439 #define POW2_8 (256) |
452 #define POW2_17 (131072) | 440 #define POW2_17 (131072) |
453 #define POW2_6 (64) | 441 #define POW2_6 (64) |
509 P = (int32_t)(((((int64_t)D1) * SENS) / POW2_21 - OFF) / POW2_13); | 497 P = (int32_t)(((((int64_t)D1) * SENS) / POW2_21 - OFF) / POW2_13); |
510 | 498 |
511 ambient_temperature = ((float)T) / 100; | 499 ambient_temperature = ((float)T) / 100; |
512 ambient_pressure_mbar = ((float)P) / 10; | 500 ambient_pressure_mbar = ((float)P) / 10; |
513 } | 501 } |
514 | 502 */ |
515 | 503 |
504 /* | |
516 void pressure_calculation_old(void) { | 505 void pressure_calculation_old(void) { |
517 // | 506 // |
518 double ambient_temperature_centigrad = 0; | 507 double ambient_temperature_centigrad = 0; |
519 double ambient_pressure_decimbar = 0; | 508 double ambient_pressure_decimbar = 0; |
520 | 509 |
526 // | 515 // |
527 static int64_t ms_off2 = 0; | 516 static int64_t ms_off2 = 0; |
528 static int64_t sens2 = 0; | 517 static int64_t sens2 = 0; |
529 static int64_t t2 = 0; | 518 static int64_t t2 = 0; |
530 | 519 |
531 /* info | |
532 uint16_t C[8] = { 1 }; | |
533 uint32_t D1 = 1; | |
534 uint32_t D2 = 1; | |
535 uint8_t n_crc; | |
536 */ | |
537 if((D2 == 0) || (D1 == 0)) | 520 if((D2 == 0) || (D1 == 0)) |
538 return; | 521 return; |
539 // | 522 // |
540 | 523 |
541 // dT = D2 - C[5] * POW2_8; | 524 // dT = D2 - C[5] * POW2_8; |
595 temp -= ms_off; | 578 temp -= ms_off; |
596 temp /= 8192; | 579 temp /= 8192; |
597 ambient_pressure_decimbar = temp; // to float/double | 580 ambient_pressure_decimbar = temp; // to float/double |
598 ambient_pressure_mbar = ambient_pressure_decimbar / 10; | 581 ambient_pressure_mbar = ambient_pressure_decimbar / 10; |
599 } | 582 } |
583 */ | |
600 | 584 |
601 | 585 |
602 /* taken from AN520 by meas-spec.com dated 9. Aug. 2011 | 586 /* taken from AN520 by meas-spec.com dated 9. Aug. 2011 |
603 * short and int are both 16bit according to AVR/GCC google results | 587 * short and int are both 16bit according to AVR/GCC google results |
604 */ | 588 */ |
605 uint8_t crc4(uint16_t n_prom[]) | 589 static uint8_t crc4(uint16_t n_prom[]) |
606 { | 590 { |
607 uint16_t cnt; // simple counter | 591 uint16_t cnt; // simple counter |
608 uint16_t n_rem; // crc reminder | 592 uint16_t n_rem; // crc reminder |
609 uint16_t crc_read; // original value of the crc | 593 uint16_t crc_read; // original value of the crc |
610 uint8_t n_bit; | 594 uint8_t n_bit; |