annotate Small_CPU/Src/pressure.c @ 331:b4c578caaafb I2C_Improvment

Added plausibility check for pressure values In case of I2C communication problems at startup the dc jumped into dive mode with depth up to 300m. As no CRC is applied a bit flip may also occure during normal operation without detection => added a plausibility check if last measured value fits to the last measurements
author ideenmodellierer
date Wed, 17 Jul 2019 22:43:51 +0200
parents 8e9c502c0b06
children c11ce8c885d3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
1 /**
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
2 ******************************************************************************
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
3 * @file pressure.c
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
4 * @author heinrichs weikamp gmbh
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
5 * @date 2014
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
6 * @version V0.0.2
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
7 * @since 20-Oct-2016
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
8 * @brief
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
9 *
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
10 @verbatim
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
11 ==============================================================================
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
12 ##### How to use #####
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
13 ==============================================================================
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
14 V0.0.2 18-Oct-2016 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
15
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
16 @endverbatim
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
17 ******************************************************************************
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
18 * @attention
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
19 *
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
20 * <h2><center>&copy; COPYRIGHT(c) 2016 heinrichs weikamp</center></h2>
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
21 *
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
22 ******************************************************************************
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
23 */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
24
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
25
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
26
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
27 /* surface time
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
28 the last 30 minutes will be saved once per minute in a endless loop
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
29 at the beginning of a dive the oldest value will be used
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
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
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
33 #include "pressure.h"
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
34 #include "i2c.h"
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
35 #include "rtc.h"
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
36
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
37 #define CMD_RESET 0x1E // ADC reset command
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
38 #define CMD_ADC_READ 0x00 // ADC read command
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
39 #define CMD_ADC_CONV 0x40 // ADC conversion command
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
40 #define CMD_ADC_D1 0x00 // ADC D1 conversion
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
41 #define CMD_ADC_D2 0x10 // ADC D2 conversion
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
42 #define CMD_ADC_256 0x00 // ADC OSR=256
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
43 #define CMD_ADC_512 0x02 // ADC OSR=512
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
44 #define CMD_ADC_1024 0x04 // ADC OSR=1024
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
45 #define CMD_ADC_2048 0x06 // ADC OSR=2056
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
46 #define CMD_ADC_4096 0x08 // ADC OSR=4096
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
47 #define CMD_PROM_RD 0xA0 // Prom read command
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
48
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
49 #define PRESSURE_HISTORY_SIZE (8u)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
50 #define PRESSURE_JUMP_VALID_MBAR (500.0f) /* values are measure several times a second => jumps > 5m very unlikely */
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
51
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
52 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
53 //void pressure_calculation_new(void);
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
54 //void pressure_calculation_old(void);
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
55 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void);
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
56 static uint8_t crc4(uint16_t n_prom[]);
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
57
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
58 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
59 static uint32_t get_adc(void);
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
60 uint8_t pressureSensorInitSuccess = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
61
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
62 static uint16_t C[8] = { 1 };
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
63 static uint32_t D1 = 1;
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
64 static uint32_t D2 = 1;
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
65 static uint8_t n_crc;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
66
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
67 static int64_t C5_x_2p8 = 1;
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
68 static int64_t C2_x_2p16 = 1;
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
69 static int64_t C1_x_2p15 = 1;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
70
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
71 /*
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
72 short C2plus10000 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
73 short C3plus200 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
74 short C4minus250 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
75 short UT1 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
76 short C6plus100 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
77 */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
78
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
79 static float ambient_temperature = 0;
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
80 static float ambient_pressure_mbar = 1000.0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
81 static float surface_pressure_mbar = 1000.0;
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
82 static float surface_ring_mbar[31] = { 0 };
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
83
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
84 static float pressure_history_mbar[PRESSURE_HISTORY_SIZE];
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
85
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
86 uint8_t secondCounterSurfaceRing = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
87
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
88 float get_temperature(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
89 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
90 return ambient_temperature;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
91 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
92
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
93 float get_pressure_mbar(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
94 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
95 return ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
96 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
97
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
98 float get_surface_mbar(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
99 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
100 return surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
101 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
102
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
103
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
104 void init_surface_ring(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
105 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
106 surface_ring_mbar[0] = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
107 for(int i=1; i<31; i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
108 surface_ring_mbar[i] = ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
109 surface_pressure_mbar = ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
110 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
111
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
112 void init_pressure_history(void)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
113 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
114 for(int i=0; i<PRESSURE_HISTORY_SIZE; i++)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
115 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
116 pressure_history_mbar[i] = 1000.0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
117 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
118 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
119
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
120 /* the ring has one place with 0
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
121 * after that comes the oldest value
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
122 * the new pressure is written in this hole
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
123 * the oldest value is read and then the new hole
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
124 */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
125 void update_surface_pressure(uint8_t call_rhythm_seconds)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
126 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
127 secondCounterSurfaceRing += call_rhythm_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
128
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
129 if(secondCounterSurfaceRing < 60)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
130 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
131
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
132 secondCounterSurfaceRing = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
133
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
134 if(is_init_pressure_done())
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
135 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
136 int hole;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
137 for(hole=30;hole>0;hole--)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
138 if(surface_ring_mbar[hole] == 0) { break; }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
139
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
140 surface_ring_mbar[hole] = ambient_pressure_mbar;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
141
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
142 hole++;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
143 if(hole > 30)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
144 hole = 0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
145 surface_pressure_mbar = surface_ring_mbar[hole];
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
146 surface_ring_mbar[hole] = 0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
147 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
148 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
149
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
150 #ifdef DEMOMODE
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
151 float demo_modify_temperature_helper(float bottom_mbar_diff_to_surface)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
152 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
153 const float temperature_surface = 31.0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
154 const float temperature_bottom = 14.0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
155
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
156 const float temperature_difference = temperature_bottom - temperature_surface;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
157
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
158 // range 0.0 - 1.0
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
159 float position_now = (ambient_pressure_mbar - surface_pressure_mbar) / bottom_mbar_diff_to_surface;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
160
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
161 if(position_now <= 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
162 return temperature_surface;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
163
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
164 if(position_now >= 1)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
165 return temperature_bottom;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
166
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
167 return temperature_surface + (temperature_difference * position_now);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
168 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
169
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
170
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
171 uint32_t demo_modify_temperature_and_pressure(int32_t divetime_in_seconds, uint8_t subseconds, float ceiling_mbar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
172 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
173
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
174 const float descent_rate = 4000/60;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
175 const float ascent_rate = 1000/60;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
176 const uint32_t seconds_descend = (1 * 60) + 30;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
177 const uint32_t turbo_seconds_at_bottom_start = (0 * 60) + 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
178 const uint32_t seconds_descend_and_bottomtime = seconds_descend + turbo_seconds_at_bottom_start + (2 * 60) + 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
179 uint32_t time_elapsed_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
180 static float ambient_pressure_mbar_memory = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
181 static uint32_t time_last_call = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
182
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
183 if(divetime_in_seconds <= seconds_descend)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
184 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
185 ambient_pressure_mbar = (divetime_in_seconds * descent_rate) + ((float)(subseconds) * descent_rate) + surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
186 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
187
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
188 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
189 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
190 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
191 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
192 if(divetime_in_seconds <= seconds_descend + turbo_seconds_at_bottom_start)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
193 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
194 ambient_pressure_mbar = (seconds_descend * descent_rate) + surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
195 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
196 ambient_pressure_mbar_memory = ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
197 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
198 return turbo_seconds_at_bottom_start;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
199 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
200 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
201 if(divetime_in_seconds <= seconds_descend_and_bottomtime)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
202 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
203 ambient_pressure_mbar = (seconds_descend * descent_rate) + surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
204 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
205 ambient_pressure_mbar_memory = ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
206 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
207 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
208 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
209 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
210 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
211 time_elapsed_in_seconds = divetime_in_seconds - time_last_call;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
212 ambient_pressure_mbar = ambient_pressure_mbar_memory - time_elapsed_in_seconds * ascent_rate;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
213
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
214 if(ambient_pressure_mbar < surface_pressure_mbar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
215 ambient_pressure_mbar = surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
216 else if(ambient_pressure_mbar < ceiling_mbar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
217 ambient_pressure_mbar = ceiling_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
218
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
219 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
220 ambient_pressure_mbar_memory = ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
221 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
222 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
223 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
224 }
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
225 #endif
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
226
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
227 uint8_t is_init_pressure_done(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
228 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
229 return pressureSensorInitSuccess;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
230 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
231
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
232 uint8_t init_pressure(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
233 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
234 uint8_t buffer[1];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
235 buffer[0] = 0x1e;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
236 uint8_t retValue = 0xFF;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
237
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
238 pressureSensorInitSuccess = false;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
239 init_pressure_history();
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
240
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
241 /* Send reset request to pressure sensor */
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
242 retValue = I2C_Master_Transmit( DEVICE_PRESSURE, buffer, 1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
243 if(retValue != HAL_OK)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
244 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
245 return (HAL_StatusTypeDef)retValue;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
246 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
247 HAL_Delay(3);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
248
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
249 for(uint8_t i=0;i<8;i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
250 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
251 C[i] = get_ci_by_coef_num(i);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
252 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
253 n_crc = crc4(C); // no evaluation at the moment hw 151026
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
254
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
255 C5_x_2p8 = C[5] * 256;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
256 C2_x_2p16 = C[2] * 65536;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
257 C1_x_2p15 = C[1] * 32768;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
258
241
2b9775f71e30 cleanup: factor out I2C1_Status() and cleanup type
Jan Mulder <jlmulder@xs4all.nl>
parents: 186
diff changeset
259 if(global.I2C_SystemStatus == HAL_OK)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
260 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
261 pressureSensorInitSuccess = 1;
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
262 retValue = pressure_update();
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
263
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
264 }
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
265 return retValue;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
266 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
267
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
268
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
269 static uint32_t get_adc(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
270 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
271 uint8_t buffer[1];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
272 uint8_t resivebuf[4];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
273 uint32_t answer = 0;
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
274
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
275 buffer[0] = 0x00; // Get ADC
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
276 I2C_Master_Transmit( DEVICE_PRESSURE, buffer, 1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
277 I2C_Master_Receive( DEVICE_PRESSURE, resivebuf, 4);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
278 resivebuf[3] = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
279 answer = 256*256 *(uint32_t)resivebuf[0] + 256 * (uint32_t)resivebuf[1] + (uint32_t)resivebuf[2];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
280
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
281 return answer;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
282 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
283
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
284
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
285 static uint16_t get_ci_by_coef_num(uint8_t coef_num)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
286 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
287 uint8_t resivebuf[2];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
288
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
289 uint8_t cmd = CMD_PROM_RD+coef_num*2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
290 I2C_Master_Transmit( DEVICE_PRESSURE, &cmd, 1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
291 I2C_Master_Receive( DEVICE_PRESSURE, resivebuf, 2);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
292 return (256*(uint16_t)resivebuf[0]) + (uint16_t)resivebuf[1];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
293 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
294
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
295
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
296
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
297 uint8_t pressure_update(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
298 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
299 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
300
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
301 statusReturn = pressure_sensor_get_data();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
302 pressure_calculation();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
303 return (uint8_t)statusReturn;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
304 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
305
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
306 /* Switch between pressure and temperature measurement with every successful read operation */
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
307 void pressure_update_alternating(void)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
308 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
309 static uint8_t getTemperature= 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
310
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
311 if(getTemperature)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
312 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
313 if(pressure_sensor_get_temperature_raw() == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
314 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
315 getTemperature = 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
316 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
317 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
318 else
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
319 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
320 if(pressure_sensor_get_pressure_raw() == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
321 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
322 getTemperature = 1;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
323 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
324 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
325 pressure_calculation();
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
326 return;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
327 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
328
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
329 static uint32_t pressure_sensor_get_one_value(uint8_t cmd, HAL_StatusTypeDef *statusReturn)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
330 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
331 uint8_t command = CMD_ADC_CONV + cmd;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
332 HAL_StatusTypeDef statusReturnTemp = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
333
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
334 statusReturnTemp = I2C_Master_Transmit( DEVICE_PRESSURE, &command, 1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
335
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
336 if(statusReturn)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
337 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
338 *statusReturn = statusReturnTemp;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
339 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
340
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
341 switch (cmd & 0x0f) // wait necessary conversion time
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
342 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
343 case CMD_ADC_256 : HAL_Delay(1); break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
344 case CMD_ADC_512 : HAL_Delay(3); break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
345 case CMD_ADC_1024: HAL_Delay(4); break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
346 case CMD_ADC_2048: HAL_Delay(6); break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
347 case CMD_ADC_4096: HAL_Delay(10); break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
348 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
349 return get_adc();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
350 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
351
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
352
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
353 static HAL_StatusTypeDef pressure_sensor_get_data(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
354 {
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
355 uint32_t requestedValue = 0;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
356 HAL_StatusTypeDef statusReturn1 = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
357 HAL_StatusTypeDef statusReturn2 = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
358
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
359
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
360
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
361 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D2 + CMD_ADC_1024, &statusReturn2);
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
362 if (statusReturn2 == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
363 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
364 D2 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
365 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
366
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
367 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D1 + CMD_ADC_1024, &statusReturn1);
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
368 if (statusReturn1 == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
369 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
370 D1 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
371 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
372 if(statusReturn2 > statusReturn1) // if anything is not HAL_OK (0x00) or worse
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
373 return statusReturn2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
374 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
375 return statusReturn1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
376 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
377
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
378
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
379 HAL_StatusTypeDef pressure_sensor_get_pressure_raw(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
380 {
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
381 uint32_t requestedValue = 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
382 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
383
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
384 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D1 + CMD_ADC_1024, &statusReturn);
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
385 if (statusReturn == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
386 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
387 D1 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
388 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
389
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
390 return statusReturn;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
391 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
392
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
393
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
394 HAL_StatusTypeDef pressure_sensor_get_temperature_raw(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
395 {
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
396 uint32_t requestedValue = 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
397 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
398
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
399 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D2 + CMD_ADC_1024, &statusReturn);
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
400 if (statusReturn == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
401 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
402 D2 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
403 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
404 return statusReturn;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
405 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
406
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
407
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
408 void pressure_calculation(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
409 {
241
2b9775f71e30 cleanup: factor out I2C1_Status() and cleanup type
Jan Mulder <jlmulder@xs4all.nl>
parents: 186
diff changeset
410 if(global.I2C_SystemStatus != HAL_OK)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
411 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
412
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
413 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
414 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
415
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
416 static uint8_t pressure_plausible(float pressurevalue)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
417 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
418 static uint8_t pressurewriteindex = 0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
419 uint8_t retval = 0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
420 uint8_t index;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
421 float pressure_average = 0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
422
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
423 for(index = 0; index < PRESSURE_HISTORY_SIZE; index++)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
424 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
425 pressure_average += pressure_history_mbar[index];
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
426 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
427 pressure_average /= PRESSURE_HISTORY_SIZE;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
428 if(pressure_average == 1000.0) /* first pressure calculation */
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
429 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
430 if(fabs(pressurevalue - pressure_average) < 11000.0) /* just in case a reset occure during dive assume value equal < 100m as valid */
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
431 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
432 for(index = 0; index < PRESSURE_HISTORY_SIZE; index++)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
433 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
434 pressure_history_mbar[index] = pressurevalue; /* set history to current value */
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
435 retval = 1;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
436 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
437 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
438 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
439 else
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
440 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
441 if(fabs(pressurevalue - pressure_average) < PRESSURE_JUMP_VALID_MBAR)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
442 pressure_history_mbar[pressurewriteindex++] = pressurevalue;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
443 pressurewriteindex &= 0x7; /* wrap around if necessary */
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
444 retval = 1;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
445 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
446
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
447 return retval;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
448 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
449
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
450 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
451 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
452 uint32_t local_D1; // ADC value of the pressure conversion
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
453 uint32_t local_D2; // ADC value of the temperature conversion
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
454 int32_t local_Px10; // compensated pressure value
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
455 int32_t local_Tx100; // compensated temperature value
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
456 int64_t local_dT; // int32_t, difference between actual and measured temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
457 int64_t local_OFF; // offset at actual temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
458 int64_t local_SENS; // sensitivity at actual temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
459
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
460 float calc_pressure;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
461
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
462 int64_t T2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
463 int64_t OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
464 int64_t SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
465
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
466 local_D1 = D1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
467 local_D2 = D2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
468
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
469 local_dT = ((int64_t)local_D2) - ((int64_t)C[5]) * 256; //pow(2,8);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
470 local_OFF = ((int64_t)C[2]) * 65536 + local_dT * ((int64_t)C[4]) / 128; // pow(2,16), pow(2,7)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
471 local_SENS = ((int64_t)C[1]) * 32768 + local_dT * ((int64_t)C[3]) / 256; // pow(2,15), pow(2,8)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
472
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
473 local_Tx100 = (int32_t)(2000 + (local_dT * ((int64_t)C[6])) / 8388608);// pow(2,23)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
474
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
475
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
476 if(local_Tx100 < 2000) // low temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
477 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
478 T2 = 3 * local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
479 T2 *= local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
480 T2 /= 8589934592;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
481
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
482 OFF2 = ((int64_t)local_Tx100) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
483 OFF2 *= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
484 OFF2 *= 3;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
485 OFF2 /= 2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
486
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
487 SENS2 = ((int64_t)local_Tx100) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
488 SENS2 *= SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
489 SENS2 *= 5;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
490 SENS2 /= 8;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
491
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
492 local_Tx100 -= (int32_t)T2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
493 local_OFF -= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
494 local_SENS -= SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
495 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
496 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
497 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
498 T2 = 7 * local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
499 T2 *= local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
500 T2 /= 137438953472;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
501
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
502 OFF2 = ((int64_t)local_Tx100) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
503 OFF2 *= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
504 OFF2 /= 16;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
505
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
506 local_Tx100 -= (int32_t)T2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
507 local_OFF -= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
508 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
509
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
510 local_Px10 = (int32_t)(
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
511 (((int64_t)((local_D1 * local_SENS) / 2097152)) - local_OFF)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
512 / 8192 );// )) / 10; // pow(2,21), pow(2,13)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
513
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
514 ambient_temperature = ((float)local_Tx100) / 100;
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
515
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
516 calc_pressure = ((float)local_Px10) / 10;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
517 if(pressure_plausible(calc_pressure))
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
518 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
519 ambient_pressure_mbar = calc_pressure;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
520 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
521 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
522
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
523
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
524 /*
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
525 void pressure_calculation_new(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
526 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
527 #define POW2_8 (256)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
528 #define POW2_17 (131072)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
529 #define POW2_6 (64)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
530 #define POW2_16 (65536)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
531 #define POW2_7 (128)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
532 #define POW2_23 (8388608)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
533 #define POW2_21 (2097152)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
534 #define POW2_15 (32768)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
535 #define POW2_13 (8192)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
536 #define POW2_37 (137438953472)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
537 #define POW2_4 (16)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
538 #define POW2_33 (8589934592)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
539 #define POW2_3 (8)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
540
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
541 int32_t P; // compensated pressure value
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
542 int32_t T; // compensated temperature value
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
543 int32_t dT; // difference between actual and measured temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
544 int64_t OFF; // offset at actual temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
545 int64_t SENS;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
546
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
547 int32_t T2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
548 int64_t OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
549 int64_t SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
550
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
551 dT = ((int32_t)D2) - ((int32_t)C[5]) * POW2_8;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
552 OFF = ((int64_t)C[2]) * POW2_16 + ((int64_t)dT) * ((int64_t)C[4]) / POW2_7;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
553 SENS = ((int64_t)C[1]) * POW2_15 + ((int64_t)dT) * ((int64_t)C[3]) / POW2_8;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
554
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
555 T = 2000 + (dT * ((int32_t)C[6])) / POW2_23;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
556
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
557
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
558 if(T < 2000) // low temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
559 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
560 T2 = 3 * dT * dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
561 T2 /= POW2_33;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
562 OFF2 = ((int64_t)T) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
563 OFF2 *= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
564 OFF2 *= 3;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
565 OFF2 /= 2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
566 SENS2 = ((int64_t)T) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
567 SENS2 *= SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
568 SENS2 *= 5;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
569 SENS2 /= POW2_3;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
570 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
571 else // high temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
572 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
573 T2 = 7 * dT * dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
574 T2 /= POW2_37;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
575 OFF2 = ((int64_t)T) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
576 OFF2 *= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
577 OFF2 /= POW2_4;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
578 SENS2 = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
579 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
580
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
581 T = T - T2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
582 OFF = OFF - OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
583 SENS = SENS - SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
584
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
585 P = (int32_t)(((((int64_t)D1) * SENS) / POW2_21 - OFF) / POW2_13);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
586
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
587 ambient_temperature = ((float)T) / 100;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
588 ambient_pressure_mbar = ((float)P) / 10;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
589 }
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
590 */
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
591
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
592 /*
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
593 void pressure_calculation_old(void) {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
594 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
595 double ambient_temperature_centigrad = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
596 double ambient_pressure_decimbar = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
597
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
598 // static for debug
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
599 static int64_t dt = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
600 static int64_t temp = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
601 static int64_t ms_off = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
602 static int64_t sens = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
603 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
604 static int64_t ms_off2 = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
605 static int64_t sens2 = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
606 static int64_t t2 = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
607
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
608 if((D2 == 0) || (D1 == 0))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
609 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
610 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
611
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
612 // dT = D2 - C[5] * POW2_8;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
613 // T = 2000 + (dT * C[6]) / POW2_23;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
614 dt = (int64_t)D2 - C5_x_2p8;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
615 //temp ; // in 10 milliGrad Celcius
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
616 ambient_temperature_centigrad = 2000 + dt * C[6] / 8388608;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
617
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
618
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
619 if(ambient_temperature_centigrad < 2000) // low temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
620 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
621 t2 = 3 * dt;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
622 t2 *= dt;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
623 t2 /= 8589934592;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
624 ms_off2 = ambient_temperature_centigrad - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
625 ms_off2 *= ms_off2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
626 sens2 = ms_off2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
627 ms_off2 *= 3;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
628 ms_off2 /= 2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
629 sens2 *= 5;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
630 sens2 /= 8;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
631 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
632 else // high temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
633 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
634 t2 = 7 * dt;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
635 t2 *= dt;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
636 t2 /= 137438953472;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
637 ms_off2 = ambient_temperature_centigrad - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
638 ms_off2 *= ms_off2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
639 ms_off2 /= 16;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
640 sens2 = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
641 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
642
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
643
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
644 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
645
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
646 // pressure
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
647 // OFF = C[2] * POW2_16 + dT * C[4] / POW2_7;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
648 // SENS = C[1] * POW2_15 + dT * C[3] / POW2_8;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
649 ms_off = C[4] * dt;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
650 ms_off /= 128;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
651 ms_off += C2_x_2p16;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
652 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
653 sens = C[3] * dt;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
654 sens /= 256;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
655 sens += C1_x_2p15;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
656
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
657 // 2nd order correction
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
658 ambient_temperature_centigrad -= t2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
659 ms_off -= ms_off2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
660 sens -= sens2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
661
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
662 ambient_temperature = ambient_temperature_centigrad / 100;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
663 // P = (D1 * SENS / POW2_21 - OFF) / POW2_13;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
664 temp = D1 * sens;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
665 temp /= 2097152;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
666 temp -= ms_off;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
667 temp /= 8192;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
668 ambient_pressure_decimbar = temp; // to float/double
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
669 ambient_pressure_mbar = ambient_pressure_decimbar / 10;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
670 }
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
671 */
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
672
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
673
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
674 /* taken from AN520 by meas-spec.com dated 9. Aug. 2011
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
675 * short and int are both 16bit according to AVR/GCC google results
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
676 */
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
677 static uint8_t crc4(uint16_t n_prom[])
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
678 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
679 uint16_t cnt; // simple counter
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
680 uint16_t n_rem; // crc reminder
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
681 uint16_t crc_read; // original value of the crc
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
682 uint8_t n_bit;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
683 n_rem = 0x00;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
684 crc_read=n_prom[7]; //save read CRC
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
685 n_prom[7]=(0xFF00 & (n_prom[7])); //CRC byte is replaced by 0
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
686 for (cnt = 0; cnt < 16; cnt++) // operation is performed on bytes
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
687 { // choose LSB or MSB
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
688 if (cnt%2==1) n_rem ^= (uint16_t) ((n_prom[cnt>>1]) & 0x00FF);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
689 else n_rem ^= (uint16_t) (n_prom[cnt>>1]>>8);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
690 for (n_bit = 8; n_bit > 0; n_bit--)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
691 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
692 if (n_rem & (0x8000))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
693 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
694 n_rem = (n_rem << 1) ^ 0x3000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
695 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
696 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
697 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
698 n_rem = (n_rem << 1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
699 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
700 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
701 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
702 n_rem= (0x000F & (n_rem >> 12)); // // final 4-bit reminder is CRC code
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
703 n_prom[7]=crc_read; // restore the crc_read to its original place
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
704 return (n_rem ^ 0x00);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
705 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
706 /*
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
707 void test_calculation(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
708 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
709 C1 = 29112;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
710 C2 = 26814;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
711 C3 = 19125;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
712 C4 = 17865;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
713 C5 = 32057;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
714 C6 = 31305;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
715
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
716 C2_x_2p16 = C2 * 65536;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
717 C1_x_2p15 = C1 * 32768;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
718
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
719 D1 = 4944364;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
720 D2 = 8198974;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
721 pressure_calculation() ;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
722 };
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
723 */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
724