Mercurial > public > ostc4
annotate Small_CPU/Src/pressure.c @ 481:89f6857276f8 Improve_Button_Sleep
Bugfix calculation of string center position:
Strings shown on the right side at surface mode use special characters ('\016' and '\017') to switch font size. Headline strings like "Desaturation" could also be set to the target font directly, because they do not contain mixed font sizes, but nethertheless they are using the special characters.
The function calculating the offset needed to display the strinter with center alignment did not consider the small font size => misalignment during string display. To avoid this an evaluation of the special characters has been added to the helper function.
author | ideenmodellierer |
---|---|
date | Mon, 18 May 2020 21:51:08 +0200 |
parents | 3fe9cc747c5c |
children | 9eeab3fead8f |
rev | line source |
---|---|
38 | 1 /** |
2 ****************************************************************************** | |
3 * @file pressure.c | |
4 * @author heinrichs weikamp gmbh | |
5 * @date 2014 | |
6 * @version V0.0.2 | |
7 * @since 20-Oct-2016 | |
8 * @brief | |
9 * | |
10 @verbatim | |
11 ============================================================================== | |
12 ##### How to use ##### | |
13 ============================================================================== | |
14 V0.0.2 18-Oct-2016 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015 | |
15 | |
16 @endverbatim | |
17 ****************************************************************************** | |
18 * @attention | |
19 * | |
20 * <h2><center>© COPYRIGHT(c) 2016 heinrichs weikamp</center></h2> | |
21 * | |
22 ****************************************************************************** | |
23 */ | |
24 | |
25 | |
26 | |
27 /* surface time | |
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 | |
30 */ | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
31 #include "math.h" |
241
2b9775f71e30
cleanup: factor out I2C1_Status() and cleanup type
Jan Mulder <jlmulder@xs4all.nl>
parents:
186
diff
changeset
|
32 #include "scheduler.h" |
38 | 33 #include "pressure.h" |
34 #include "i2c.h" | |
35 #include "rtc.h" | |
36 | |
37 #define CMD_RESET 0x1E // ADC reset command | |
38 #define CMD_ADC_READ 0x00 // ADC read command | |
39 #define CMD_ADC_CONV 0x40 // ADC conversion command | |
40 #define CMD_ADC_D1 0x00 // ADC D1 conversion | |
41 #define CMD_ADC_D2 0x10 // ADC D2 conversion | |
42 #define CMD_ADC_256 0x00 // ADC OSR=256 | |
43 #define CMD_ADC_512 0x02 // ADC OSR=512 | |
44 #define CMD_ADC_1024 0x04 // ADC OSR=1024 | |
45 #define CMD_ADC_2048 0x06 // ADC OSR=2056 | |
46 #define CMD_ADC_4096 0x08 // ADC OSR=4096 | |
47 #define CMD_PROM_RD 0xA0 // Prom read command | |
48 | |
352 | 49 /* remove comment to use a predefined profile for pressure changes instead of real world data */ |
50 /* #define SIMULATE_PRESSURE */ | |
51 | |
52 #define PRESSURE_SURFACE_MAX_MBAR (1030.0f) /* It is unlikely that pressure at surface is greater than this value => clip to it */ | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
53 |
352 | 54 #define PRESSURE_SURFACE_QUE (30u) /* history buffer [minutes] for past pressure measurements */ |
55 #define PRESSURE_SURFACE_EVA_WINDOW (15u) /* Number of entries evaluated during instability test. Used to avoid detection while dive enters water */ | |
56 #define PRESSURE_SURFACE_STABLE_LIMIT (10u) /* Define pressure as stable if delta (mBar) is below this value */ | |
57 #define PRESSURE_SURFACE_DETECT_STABLE_CNT (5u) /* Event count to detect stable condition */ | |
58 #define PRESSURE_SURFACE_UNSTABLE_LIMIT (50u) /* Define pressure as not stable if delta (mBar) is larger than this value */ | |
59 #define PRESSURE_SURFACE_DETECT_UNSTABLE_CNT (3u) /* Event count to detect unstable condition */ | |
60 | |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
61 |
356 | 62 static uint8_t PRESSURE_ADDRESS = DEVICE_PRESSURE_MS5803; /* Default Address */ |
63 | |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
64 static uint16_t get_ci_by_coef_num(uint8_t coef_num); |
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
65 //void pressure_calculation_new(void); |
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
66 //void pressure_calculation_old(void); |
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
67 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void); |
356 | 68 //static uint8_t crc4(uint16_t n_prom[]); |
38 | 69 |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
70 static HAL_StatusTypeDef pressure_sensor_get_data(void); |
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
71 static uint32_t get_adc(void); |
38 | 72 uint8_t pressureSensorInitSuccess = 0; |
73 | |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
74 static uint16_t C[8] = { 1 }; |
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
75 static uint32_t D1 = 1; |
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
76 static uint32_t D2 = 1; |
356 | 77 //static uint8_t n_crc; |
38 | 78 |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
79 static int64_t C5_x_2p8 = 1; |
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
80 static int64_t C2_x_2p16 = 1; |
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
81 static int64_t C1_x_2p15 = 1; |
38 | 82 |
83 /* | |
84 short C2plus10000 = -1; | |
85 short C3plus200 = -1; | |
86 short C4minus250 = -1; | |
87 short UT1 = -1; | |
88 short C6plus100 = -1; | |
89 */ | |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
90 static float pressure_offset = 0.0; /* Offset value which may be specified by the user via PC Software */ |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
91 static float temperature_offset = 0.0; /* Offset value which may be specified by the user via PC Software */ |
38 | 92 |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
93 static float ambient_temperature = 0; |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
94 static float ambient_pressure_mbar = 1000.0; |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
95 static float surface_pressure_mbar = 1000.0; |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
96 static float surface_ring_mbar[PRESSURE_SURFACE_QUE] = { 0 }; |
38 | 97 |
352 | 98 static uint8_t surface_pressure_writeIndex = 0; |
99 static float surface_pressure_stable_value = 0; | |
100 static uint8_t surface_pressure_stable = 0; | |
101 | |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
102 static uint8_t secondCounterSurfaceRing = 0; |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
103 static uint8_t avgCount = 0; |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
104 static float runningAvg = 0; |
38 | 105 |
106 float get_temperature(void) | |
107 { | |
108 return ambient_temperature; | |
109 } | |
110 | |
111 float get_pressure_mbar(void) | |
112 { | |
113 return ambient_pressure_mbar; | |
114 } | |
115 | |
116 float get_surface_mbar(void) | |
117 { | |
118 return surface_pressure_mbar; | |
119 } | |
120 | |
121 | |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
122 void init_surface_ring(uint8_t force) |
38 | 123 { |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
124 if((surface_ring_mbar[0] == 0) || (force)) /* only initialize once. Keep value in place in case of an i2c recovery */ |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
125 { |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
126 secondCounterSurfaceRing = 0; /* restart calculation */ |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
127 avgCount = 0; |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
128 runningAvg = 0; |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
129 |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
130 for(int i=0; i<PRESSURE_SURFACE_QUE; i++) |
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
131 surface_ring_mbar[i] = ambient_pressure_mbar; |
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
132 surface_pressure_mbar = ambient_pressure_mbar; |
352 | 133 surface_pressure_writeIndex = 0; /* index of the oldest value in the ring buffer */ |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
134 } |
38 | 135 } |
136 | |
352 | 137 uint8_t is_surface_pressure_stable(void) |
138 { | |
139 return surface_pressure_stable; | |
140 } | |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
141 |
352 | 142 float set_last_surface_pressure_stable(void) |
143 { | |
144 surface_pressure_mbar = surface_pressure_stable_value; | |
145 return surface_pressure_stable_value; | |
146 } | |
147 | |
148 /* iterate backward through the history memory and evaluate the changes pressure changes during the last 30 minutes */ | |
149 void evaluate_surface_pressure() | |
150 { | |
151 uint8_t index; | |
152 float lastvalue; | |
153 uint8_t stablecnt = 0; | |
154 uint8_t unstablecnt = 0; | |
155 uint8_t EvaluationWindow = PRESSURE_SURFACE_QUE - PRESSURE_SURFACE_EVA_WINDOW; /* do not use the latest 15 values to avoid unstable condition due to something like fin handling */ | |
156 uint8_t EvaluatedValues = 0; | |
157 | |
158 lastvalue = surface_ring_mbar[surface_pressure_writeIndex]; | |
159 surface_pressure_stable_value = surface_ring_mbar[surface_pressure_writeIndex]; /* default: if no stable value is found return the oldest value */ | |
160 index = surface_pressure_writeIndex; | |
161 surface_pressure_stable = 1; | |
162 | |
163 if(index == 0) | |
164 { | |
165 index = PRESSURE_SURFACE_QUE - 1; | |
166 } | |
167 else | |
168 { | |
169 index = index - 1; | |
170 } | |
171 do | |
172 { | |
173 if((EvaluatedValues < EvaluationWindow) && | |
174 (fabs(surface_pressure_stable_value - surface_ring_mbar[index]) > PRESSURE_SURFACE_UNSTABLE_LIMIT)) /* unusual change during last 30 minutes */ | |
175 { | |
176 unstablecnt++; | |
177 if(unstablecnt > PRESSURE_SURFACE_DETECT_UNSTABLE_CNT) | |
178 { | |
179 surface_pressure_stable = 0; | |
180 } | |
181 } | |
182 /* search for a value which does not change for several iterations */ | |
183 if (fabs(lastvalue - surface_ring_mbar[index]) < PRESSURE_SURFACE_STABLE_LIMIT) | |
184 { | |
185 stablecnt++; | |
186 } | |
187 else | |
188 { | |
189 stablecnt = 0; | |
190 } | |
191 if ((stablecnt >= PRESSURE_SURFACE_DETECT_STABLE_CNT) && (surface_pressure_stable == 0)&&(surface_pressure_stable_value == surface_ring_mbar[surface_pressure_writeIndex])) /* pressure is unstable => search for new stable value */ | |
192 { | |
193 surface_pressure_stable_value = surface_ring_mbar[index]; | |
194 unstablecnt = 0; | |
195 } | |
196 | |
197 lastvalue = surface_ring_mbar[index]; | |
198 | |
199 if(index == 0) | |
200 { | |
201 index = PRESSURE_SURFACE_QUE - 1; | |
202 } | |
203 else | |
204 { | |
205 index = index - 1; | |
206 } | |
207 EvaluatedValues++; | |
208 } while (index != surface_pressure_writeIndex); | |
209 } | |
38 | 210 void update_surface_pressure(uint8_t call_rhythm_seconds) |
211 { | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
212 if(is_init_pressure_done()) |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
213 { |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
214 runningAvg = (runningAvg * avgCount + ambient_pressure_mbar) / (avgCount +1); |
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
215 avgCount++; |
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
216 secondCounterSurfaceRing += call_rhythm_seconds; |
38 | 217 |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
218 if(secondCounterSurfaceRing >= 60) |
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
219 { |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
220 if(runningAvg < PRESSURE_SURFACE_MAX_MBAR) |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
221 { |
352 | 222 surface_ring_mbar[surface_pressure_writeIndex] = runningAvg; |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
223 } |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
224 else |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
225 { |
352 | 226 surface_ring_mbar[surface_pressure_writeIndex] = PRESSURE_SURFACE_MAX_MBAR; |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
227 } |
352 | 228 surface_pressure_writeIndex++; /* the write index is now pointing to the oldest value in the buffer which will be overwritten next time */ |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
229 |
352 | 230 if(surface_pressure_writeIndex == PRESSURE_SURFACE_QUE) |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
231 { |
352 | 232 surface_pressure_writeIndex = 0; |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
233 } |
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
234 |
352 | 235 surface_pressure_mbar = surface_ring_mbar[surface_pressure_writeIndex]; /* 30 minutes old measurement */ |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
236 |
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
237 secondCounterSurfaceRing = 0; |
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
238 avgCount = 1; /* use the current value as starting point but restart the weight decrement of the measurements */ |
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
239 } |
352 | 240 evaluate_surface_pressure(); |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
241 } |
38 | 242 } |
243 | |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
244 #ifdef DEMOMODE |
38 | 245 float demo_modify_temperature_helper(float bottom_mbar_diff_to_surface) |
246 { | |
247 const float temperature_surface = 31.0; | |
248 const float temperature_bottom = 14.0; | |
249 | |
250 const float temperature_difference = temperature_bottom - temperature_surface; | |
251 | |
252 // range 0.0 - 1.0 | |
253 float position_now = (ambient_pressure_mbar - surface_pressure_mbar) / bottom_mbar_diff_to_surface; | |
254 | |
255 if(position_now <= 0) | |
256 return temperature_surface; | |
257 | |
258 if(position_now >= 1) | |
259 return temperature_bottom; | |
260 | |
261 return temperature_surface + (temperature_difference * position_now); | |
262 } | |
263 | |
264 | |
265 uint32_t demo_modify_temperature_and_pressure(int32_t divetime_in_seconds, uint8_t subseconds, float ceiling_mbar) | |
266 { | |
267 | |
268 const float descent_rate = 4000/60; | |
269 const float ascent_rate = 1000/60; | |
270 const uint32_t seconds_descend = (1 * 60) + 30; | |
271 const uint32_t turbo_seconds_at_bottom_start = (0 * 60) + 0; | |
272 const uint32_t seconds_descend_and_bottomtime = seconds_descend + turbo_seconds_at_bottom_start + (2 * 60) + 0; | |
273 uint32_t time_elapsed_in_seconds; | |
274 static float ambient_pressure_mbar_memory = 0; | |
275 static uint32_t time_last_call = 0; | |
276 | |
277 if(divetime_in_seconds <= seconds_descend) | |
278 { | |
279 ambient_pressure_mbar = (divetime_in_seconds * descent_rate) + ((float)(subseconds) * descent_rate) + surface_pressure_mbar; | |
280 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend); | |
281 | |
282 time_last_call = divetime_in_seconds; | |
283 return 0; | |
284 } | |
285 else | |
286 if(divetime_in_seconds <= seconds_descend + turbo_seconds_at_bottom_start) | |
287 { | |
288 ambient_pressure_mbar = (seconds_descend * descent_rate) + surface_pressure_mbar; | |
289 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend); | |
290 ambient_pressure_mbar_memory = ambient_pressure_mbar; | |
291 time_last_call = divetime_in_seconds; | |
292 return turbo_seconds_at_bottom_start; | |
293 } | |
294 else | |
295 if(divetime_in_seconds <= seconds_descend_and_bottomtime) | |
296 { | |
297 ambient_pressure_mbar = (seconds_descend * descent_rate) + surface_pressure_mbar; | |
298 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend); | |
299 ambient_pressure_mbar_memory = ambient_pressure_mbar; | |
300 time_last_call = divetime_in_seconds; | |
301 return 0; | |
302 } | |
303 else | |
304 { | |
305 time_elapsed_in_seconds = divetime_in_seconds - time_last_call; | |
306 ambient_pressure_mbar = ambient_pressure_mbar_memory - time_elapsed_in_seconds * ascent_rate; | |
307 | |
308 if(ambient_pressure_mbar < surface_pressure_mbar) | |
309 ambient_pressure_mbar = surface_pressure_mbar; | |
310 else if(ambient_pressure_mbar < ceiling_mbar) | |
311 ambient_pressure_mbar = ceiling_mbar; | |
312 | |
313 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend); | |
314 ambient_pressure_mbar_memory = ambient_pressure_mbar; | |
315 time_last_call = divetime_in_seconds; | |
316 return 0; | |
317 } | |
318 } | |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
319 #endif |
38 | 320 |
321 uint8_t is_init_pressure_done(void) | |
322 { | |
323 return pressureSensorInitSuccess; | |
324 } | |
325 | |
326 uint8_t init_pressure(void) | |
327 { | |
328 uint8_t buffer[1]; | |
356 | 329 buffer[0] = 0x1E; // Reset Command |
38 | 330 uint8_t retValue = 0xFF; |
331 | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
332 pressureSensorInitSuccess = false; |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
333 |
356 | 334 /* Probe new sensor first */ |
335 retValue = I2C_Master_Transmit( DEVICE_PRESSURE_MS5837, buffer, 1); | |
336 if(retValue != HAL_OK) | |
337 { | |
338 PRESSURE_ADDRESS = DEVICE_PRESSURE_MS5803; // use old sensor | |
339 HAL_Delay(100); | |
340 MX_I2C1_Init(); | |
341 if (global.I2C_SystemStatus != HAL_OK) | |
342 { | |
343 if (MX_I2C1_TestAndClear() == GPIO_PIN_RESET) { | |
344 MX_I2C1_TestAndClear(); // do it a second time | |
345 } | |
346 MX_I2C1_Init(); | |
347 } | |
348 } | |
349 else | |
350 { | |
351 PRESSURE_ADDRESS = DEVICE_PRESSURE_MS5837; // Success, use new sensor | |
352 } | |
353 HAL_Delay(3); //2.8ms according to datasheet | |
354 | |
355 buffer[0] = 0x1E; // Reset Command | |
356 retValue = 0xFF; | |
357 | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
358 /* Send reset request to pressure sensor */ |
356 | 359 retValue = I2C_Master_Transmit( PRESSURE_ADDRESS, buffer, 1); |
38 | 360 if(retValue != HAL_OK) |
361 { | |
362 return (HAL_StatusTypeDef)retValue; | |
363 } | |
356 | 364 HAL_Delay(3); //2.8ms according to datasheet |
38 | 365 |
356 | 366 for(uint8_t i=0;i<7;i++) |
38 | 367 { |
368 C[i] = get_ci_by_coef_num(i); | |
369 } | |
356 | 370 // n_crc = crc4(C); // no evaluation at the moment hw 151026 |
38 | 371 |
372 C5_x_2p8 = C[5] * 256; | |
373 C2_x_2p16 = C[2] * 65536; | |
374 C1_x_2p15 = C[1] * 32768; | |
375 | |
241
2b9775f71e30
cleanup: factor out I2C1_Status() and cleanup type
Jan Mulder <jlmulder@xs4all.nl>
parents:
186
diff
changeset
|
376 if(global.I2C_SystemStatus == HAL_OK) |
38 | 377 { |
378 pressureSensorInitSuccess = 1; | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
379 retValue = pressure_update(); |
38 | 380 } |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
381 return retValue; |
38 | 382 } |
383 | |
384 | |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
385 static uint32_t get_adc(void) |
38 | 386 { |
387 uint8_t buffer[1]; | |
388 uint8_t resivebuf[4]; | |
474
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
389 uint32_t answer = 0xFFFFFFFF; |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
390 |
38 | 391 buffer[0] = 0x00; // Get ADC |
474
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
392 if(I2C_Master_Transmit( PRESSURE_ADDRESS, buffer, 1) == HAL_OK) |
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
393 { |
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
394 if(I2C_Master_Receive( PRESSURE_ADDRESS, resivebuf, 4) == HAL_OK) |
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
395 { |
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
396 resivebuf[3] = 0; |
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
397 answer = 256*256 *(uint32_t)resivebuf[0] + 256 * (uint32_t)resivebuf[1] + (uint32_t)resivebuf[2]; |
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
398 } |
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
399 } |
38 | 400 return answer; |
401 } | |
402 | |
403 | |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
404 static uint16_t get_ci_by_coef_num(uint8_t coef_num) |
38 | 405 { |
406 uint8_t resivebuf[2]; | |
407 | |
408 uint8_t cmd = CMD_PROM_RD+coef_num*2; | |
356 | 409 I2C_Master_Transmit( PRESSURE_ADDRESS, &cmd, 1); |
410 I2C_Master_Receive( PRESSURE_ADDRESS, resivebuf, 2); | |
38 | 411 return (256*(uint16_t)resivebuf[0]) + (uint16_t)resivebuf[1]; |
412 } | |
413 | |
414 | |
415 | |
416 uint8_t pressure_update(void) | |
417 { | |
418 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT; | |
419 | |
420 statusReturn = pressure_sensor_get_data(); | |
421 pressure_calculation(); | |
422 return (uint8_t)statusReturn; | |
423 } | |
424 | |
276
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
425 /* Switch between pressure and temperature measurement with every successful read operation */ |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
426 void pressure_update_alternating(void) |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
427 { |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
428 static uint8_t getTemperature= 0; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
429 |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
430 if(getTemperature) |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
431 { |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
432 if(pressure_sensor_get_temperature_raw() == HAL_OK) |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
433 { |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
434 getTemperature = 0; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
435 } |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
436 } |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
437 else |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
438 { |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
439 if(pressure_sensor_get_pressure_raw() == HAL_OK) |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
440 { |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
441 getTemperature = 1; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
442 } |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
443 } |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
444 pressure_calculation(); |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
445 return; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
446 } |
38 | 447 |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
448 static uint32_t pressure_sensor_get_one_value(uint8_t cmd, HAL_StatusTypeDef *statusReturn) |
38 | 449 { |
450 uint8_t command = CMD_ADC_CONV + cmd; | |
474
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
451 uint32_t adcValue = 0; |
38 | 452 HAL_StatusTypeDef statusReturnTemp = HAL_TIMEOUT; |
453 | |
356 | 454 statusReturnTemp = I2C_Master_Transmit( PRESSURE_ADDRESS, &command, 1); |
38 | 455 |
456 if(statusReturn) | |
457 { | |
458 *statusReturn = statusReturnTemp; | |
459 } | |
479 | 460 |
461 switch (cmd & 0x0f) // wait necessary conversion time | |
38 | 462 { |
479 | 463 case CMD_ADC_256 : HAL_Delay(1); break; |
464 case CMD_ADC_512 : HAL_Delay(3); break; | |
465 case CMD_ADC_1024: HAL_Delay(4); break; | |
466 case CMD_ADC_2048: HAL_Delay(6); break; | |
467 case CMD_ADC_4096: HAL_Delay(10); break; | |
468 default: | |
469 break; | |
470 } | |
471 adcValue = get_adc(); | |
472 if(adcValue == 0xFFFFFFFF) | |
473 { | |
474 if(statusReturn) | |
474
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
475 { |
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
476 *statusReturn = HAL_ERROR; |
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
477 } |
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
478 } |
4be72d55b09a
Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents:
403
diff
changeset
|
479 return adcValue; |
38 | 480 } |
481 | |
482 | |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
483 static HAL_StatusTypeDef pressure_sensor_get_data(void) |
38 | 484 { |
276
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
485 uint32_t requestedValue = 0; |
38 | 486 HAL_StatusTypeDef statusReturn1 = HAL_TIMEOUT; |
487 HAL_StatusTypeDef statusReturn2 = HAL_TIMEOUT; | |
488 | |
276
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
489 |
38 | 490 |
276
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
491 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D2 + CMD_ADC_1024, &statusReturn2); |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
492 if (statusReturn2 == HAL_OK) |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
493 { |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
494 D2 = requestedValue; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
495 } |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
496 |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
497 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D1 + CMD_ADC_1024, &statusReturn1); |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
498 if (statusReturn1 == HAL_OK) |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
499 { |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
500 D1 = requestedValue; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
501 } |
38 | 502 if(statusReturn2 > statusReturn1) // if anything is not HAL_OK (0x00) or worse |
503 return statusReturn2; | |
504 else | |
505 return statusReturn1; | |
506 } | |
507 | |
508 | |
276
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
509 HAL_StatusTypeDef pressure_sensor_get_pressure_raw(void) |
38 | 510 { |
276
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
511 uint32_t requestedValue = 0; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
512 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
513 |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
514 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D1 + CMD_ADC_1024, &statusReturn); |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
515 if (statusReturn == HAL_OK) |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
516 { |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
517 D1 = requestedValue; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
518 } |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
519 |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
520 return statusReturn; |
38 | 521 } |
522 | |
523 | |
276
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
524 HAL_StatusTypeDef pressure_sensor_get_temperature_raw(void) |
38 | 525 { |
276
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
526 uint32_t requestedValue = 0; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
527 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
528 |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
529 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D2 + CMD_ADC_1024, &statusReturn); |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
530 if (statusReturn == HAL_OK) |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
531 { |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
532 D2 = requestedValue; |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
533 } |
8e9c502c0b06
Rework pressure/ temperature data aquisition
ideenmodellierer
parents:
241
diff
changeset
|
534 return statusReturn; |
38 | 535 } |
536 | |
537 | |
352 | 538 #ifdef SIMULATE_PRESSURE |
539 void pressure_simulation() | |
540 { | |
541 static uint32_t tickstart = 0; | |
542 static float pressure_sim_mbar = 0; | |
543 static uint32_t passedSecond = 0; | |
544 static uint32_t secondtick = 0; | |
545 | |
546 uint32_t lasttick = 0; | |
547 | |
548 | |
549 | |
550 if( tickstart == 0) | |
551 { | |
552 tickstart = HAL_GetTick(); /* init time stamp */ | |
553 secondtick = tickstart; | |
554 pressure_sim_mbar = 1000; | |
555 } | |
556 | |
557 lasttick = HAL_GetTick(); | |
558 if(time_elapsed_ms(secondtick,lasttick) > 1000) /* one second passed since last tick */ | |
559 { | |
560 secondtick = lasttick; | |
561 passedSecond++; | |
562 | |
563 #ifdef DIVE_AFTER_LANDING | |
564 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */ | |
565 else if(passedSecond < 300) pressure_sim_mbar -= 1.0; /* decrease pressure in 5 minutes target 770mbar => delta 330 */ | |
566 else if(passedSecond < 900) pressure_sim_mbar += 0.0; /*stay stable 10 minutes*/ | |
567 else if(passedSecond < 1500) pressure_sim_mbar += 0.5; /* return to 1 bar in 10 Minutes*/ | |
568 else if(passedSecond < 1800) pressure_sim_mbar += 0.0; /* 5 minutes break */ | |
569 else if(passedSecond < 2000) pressure_sim_mbar += 10.0; /* start dive */ | |
570 else if(passedSecond < 2300) pressure_sim_mbar += 0.0; /* stay on depth */ | |
571 else if(passedSecond < 2500) pressure_sim_mbar -= 10.0; /* return to surface */ | |
572 else pressure_sim_mbar = 1000.0; /* final state */ | |
573 #else /* short dive */ | |
574 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */ | |
575 else if(passedSecond < 180) pressure_sim_mbar += 10.0; /* Start dive */ | |
576 else if(passedSecond < 300) pressure_sim_mbar += 0.0; /*stay on depth*/ | |
577 else if(passedSecond < 460) pressure_sim_mbar -= 10.0; /* return to surface */ | |
578 else if(passedSecond < 600) pressure_sim_mbar += 0.0; /* stay */ | |
579 else if(passedSecond < 610) pressure_sim_mbar = 1000.0; /* get ready for second dive */ | |
580 else if(passedSecond < 780) pressure_sim_mbar += 10.0; /* Start dive */ | |
581 else if(passedSecond < 900) pressure_sim_mbar += 0.0; /*stay on depth*/ | |
582 else if(passedSecond < 1060) pressure_sim_mbar -= 10.0; /* return to surface */ | |
583 else if(passedSecond < 1200) pressure_sim_mbar += 0.0; /* stay */ | |
584 else pressure_sim_mbar = 1000.0; /* final state */ | |
585 #endif | |
586 } | |
587 | |
588 | |
589 ambient_pressure_mbar = pressure_sim_mbar; | |
590 ambient_temperature = 25.0; | |
591 return; | |
592 } | |
593 | |
594 #endif | |
595 | |
38 | 596 void pressure_calculation(void) |
597 { | |
241
2b9775f71e30
cleanup: factor out I2C1_Status() and cleanup type
Jan Mulder <jlmulder@xs4all.nl>
parents:
186
diff
changeset
|
598 if(global.I2C_SystemStatus != HAL_OK) |
38 | 599 return; |
352 | 600 |
601 #ifdef SIMULATE_PRESSURE | |
602 pressure_simulation(); | |
603 #else | |
38 | 604 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(); |
352 | 605 #endif |
38 | 606 } |
607 | |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
608 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void) |
38 | 609 { |
335
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
610 static float runningAvg = 0; |
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
611 static uint8_t avgCnt = 0; |
c11ce8c885d3
Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents:
331
diff
changeset
|
612 |
38 | 613 uint32_t local_D1; // ADC value of the pressure conversion |
614 uint32_t local_D2; // ADC value of the temperature conversion | |
615 int32_t local_Px10; // compensated pressure value | |
616 int32_t local_Tx100; // compensated temperature value | |
617 int64_t local_dT; // int32_t, difference between actual and measured temperature | |
618 int64_t local_OFF; // offset at actual temperature | |
619 int64_t local_SENS; // sensitivity at actual temperature | |
620 | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
621 float calc_pressure; |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
622 |
38 | 623 int64_t T2; |
624 int64_t OFF2; | |
625 int64_t SENS2; | |
626 | |
627 local_D1 = D1; | |
628 local_D2 = D2; | |
629 | |
630 local_dT = ((int64_t)local_D2) - ((int64_t)C[5]) * 256; //pow(2,8); | |
631 local_OFF = ((int64_t)C[2]) * 65536 + local_dT * ((int64_t)C[4]) / 128; // pow(2,16), pow(2,7) | |
632 local_SENS = ((int64_t)C[1]) * 32768 + local_dT * ((int64_t)C[3]) / 256; // pow(2,15), pow(2,8) | |
633 | |
634 local_Tx100 = (int32_t)(2000 + (local_dT * ((int64_t)C[6])) / 8388608);// pow(2,23) | |
635 | |
636 | |
637 if(local_Tx100 < 2000) // low temperature | |
638 { | |
639 T2 = 3 * local_dT; | |
640 T2 *= local_dT; | |
641 T2 /= 8589934592; | |
642 | |
643 OFF2 = ((int64_t)local_Tx100) - 2000; | |
644 OFF2 *= OFF2; | |
645 OFF2 *= 3; | |
646 OFF2 /= 2; | |
647 | |
648 SENS2 = ((int64_t)local_Tx100) - 2000; | |
649 SENS2 *= SENS2; | |
650 SENS2 *= 5; | |
651 SENS2 /= 8; | |
652 | |
653 local_Tx100 -= (int32_t)T2; | |
654 local_OFF -= OFF2; | |
655 local_SENS -= SENS2; | |
656 } | |
657 else | |
658 { | |
659 T2 = 7 * local_dT; | |
660 T2 *= local_dT; | |
661 T2 /= 137438953472; | |
662 | |
663 OFF2 = ((int64_t)local_Tx100) - 2000; | |
664 OFF2 *= OFF2; | |
665 OFF2 /= 16; | |
666 | |
667 local_Tx100 -= (int32_t)T2; | |
668 local_OFF -= OFF2; | |
669 } | |
670 | |
671 local_Px10 = (int32_t)( | |
672 (((int64_t)((local_D1 * local_SENS) / 2097152)) - local_OFF) | |
673 / 8192 );// )) / 10; // pow(2,21), pow(2,13) | |
674 | |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
675 ambient_temperature = ((float)local_Tx100) / 100; |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
676 ambient_temperature += temperature_offset; |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
677 |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
678 calc_pressure = ((float)local_Px10) / 10; |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
679 calc_pressure += pressure_offset; |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
680 |
480 | 681 runningAvg = (avgCnt * runningAvg + calc_pressure) / (avgCnt + 1); |
682 if (avgCnt < 10) /* build an average considering the last measurements to have a weight "1 of 10" */ | |
683 { /* Main reason for this is the jitter of up to +-10 HPa in surface mode which is caused */ | |
684 avgCnt++; /* by the measurement range of the sensor which is focused on under water pressure measurement */ | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
276
diff
changeset
|
685 } |
480 | 686 ambient_pressure_mbar = runningAvg; |
38 | 687 } |
688 | |
689 | |
690 /* taken from AN520 by meas-spec.com dated 9. Aug. 2011 | |
691 * short and int are both 16bit according to AVR/GCC google results | |
692 */ | |
356 | 693 /*static uint8_t crc4(uint16_t n_prom[]) |
38 | 694 { |
695 uint16_t cnt; // simple counter | |
696 uint16_t n_rem; // crc reminder | |
697 uint16_t crc_read; // original value of the crc | |
698 uint8_t n_bit; | |
699 n_rem = 0x00; | |
700 crc_read=n_prom[7]; //save read CRC | |
701 n_prom[7]=(0xFF00 & (n_prom[7])); //CRC byte is replaced by 0 | |
702 for (cnt = 0; cnt < 16; cnt++) // operation is performed on bytes | |
703 { // choose LSB or MSB | |
704 if (cnt%2==1) n_rem ^= (uint16_t) ((n_prom[cnt>>1]) & 0x00FF); | |
705 else n_rem ^= (uint16_t) (n_prom[cnt>>1]>>8); | |
706 for (n_bit = 8; n_bit > 0; n_bit--) | |
707 { | |
708 if (n_rem & (0x8000)) | |
709 { | |
710 n_rem = (n_rem << 1) ^ 0x3000; | |
711 } | |
712 else | |
713 { | |
714 n_rem = (n_rem << 1); | |
715 } | |
716 } | |
717 } | |
718 n_rem= (0x000F & (n_rem >> 12)); // // final 4-bit reminder is CRC code | |
719 n_prom[7]=crc_read; // restore the crc_read to its original place | |
720 return (n_rem ^ 0x00); | |
721 } | |
356 | 722 |
38 | 723 void test_calculation(void) |
724 { | |
725 C1 = 29112; | |
726 C2 = 26814; | |
727 C3 = 19125; | |
728 C4 = 17865; | |
729 C5 = 32057; | |
730 C6 = 31305; | |
731 | |
732 C2_x_2p16 = C2 * 65536; | |
733 C1_x_2p15 = C1 * 32768; | |
734 | |
735 D1 = 4944364; | |
736 D2 = 8198974; | |
737 pressure_calculation() ; | |
738 }; | |
739 */ | |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
740 void pressure_set_offset (float pressureOffset, float temperatureOffset) |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
741 { |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
742 if(pressure_offset != pressureOffset) /* we received a new value => reinit surface que */ |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
743 { |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
744 ambient_pressure_mbar -= pressure_offset; /* revert old value */ |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
745 ambient_pressure_mbar += pressureOffset; /* apply new offset */ |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
746 init_surface_ring(1); |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
747 } |
38 | 748 |
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
749 pressure_offset = pressureOffset; |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
750 temperature_offset = temperatureOffset; |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
751 } |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
752 |
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents:
335
diff
changeset
|
753 |