1 | void calculatePressure(int32_t dT) {
|
2 | static uint16_t CalibrationParameters[4];
|
3 | volatile uint32_t D1;
|
4 | volatile int64_t off, sens, SENSi, sens2, OFFi, OFF2, Ti, temp_square;
|
5 | static volatile uint32_t D1_1;
|
6 | static volatile int64_t off_1, sens_1;
|
7 | static volatile int32_t dT_1;
|
8 |
|
9 | if(!CalibrationParameters[C1]) {
|
10 | initSensorParametersPressure(CalibrationParameters);
|
11 | }
|
12 |
|
13 | I2C_0_read(I2C_ADDR_PRESSENSE, I2C_CMD_PRESSENSE_READ, 3);
|
14 | D1 = (au8_msgBuf[0]<<16 | au8_msgBuf[1]<<8 | au8_msgBuf[2]);
|
15 |
|
16 | off = ((int64_t)(CalibrationParameters[C2] << 16)) + ((int64_t)((CalibrationParameters[C4]*dT) >> 7));
|
17 | sens = ((int64_t)(CalibrationParameters[C1] << 15)) + ((int64_t)((CalibrationParameters[C3]*dT) >> 8));
|
18 |
|
19 | temp_square = (presSensor.temperature - 2000)*(presSensor.temperature - 2000);
|
20 |
|
21 | if(presSensor.temperature < 2000) {
|
22 | Ti = (int64_t)((3*dT*dT) >> 33);
|
23 | OFFi = 3*(temp_square >> 1);
|
24 | SENSi = 5*(temp_square >> 3);
|
25 |
|
26 | if(presSensor.temperature < - 1500) {
|
27 | temp_square = (presSensor.temperature + 1500)*(presSensor.temperature +1500);
|
28 | OFFi = OFFi + 7*temp_square;
|
29 | SENSi += 4*temp_square;
|
30 | }
|
31 | } else {
|
32 | Ti = (int64_t)((2*dT*dT) >> 37);
|
33 | OFFi = (temp_square >> 4);
|
34 | SENSi = 0;
|
35 | }
|
36 |
|
37 | presSensor.temperature2Order = presSensor.temperature - Ti;
|
38 | presSensor.pressure2Order = (((((uint64_t)D1*(uint64_t)(sens - SENSi)) >> 21) - (off-OFFi)) >> 13);
|
39 | }
|
40 |
|
41 | void initSensorParametersPressure(uint16_t sensorParameters[]) {
|
42 | for(int i = 0; i < 4; i++) {
|
43 | I2C_0_read(I2C_ADDR_PRESSENSE, I2C_REG_PRESSENSE_C1 + 2*i, 2);
|
44 | *(sensorParameters + i) = ((au8_msgBuf[0]<<8 | au8_msgBuf[1])); //compare Datasheet page 11
|
45 | }
|
46 | }
|
47 |
|
48 | int32_t calculateTemperatureAndReturnDifferentialTemperatur() {
|
49 | volatile int32_t dT;
|
50 | volatile uint32_t D2;
|
51 | volatile int64_t shift;
|
52 | static uint16_t CalibrationParameters[2];
|
53 |
|
54 | if(!CalibrationParameters[C5]) {
|
55 | initSensorParametersTemperature(CalibrationParameters);
|
56 | }
|
57 | I2C_0_read(I2C_ADDR_PRESSENSE, I2C_CMD_PRESSENSE_READ, 3);
|
58 |
|
59 | D2 = (au8_msgBuf[0]<<16|au8_msgBuf[1]<<8|au8_msgBuf[2]);
|
60 | dT = (int32_t)((D2 - (int32_t)(CalibrationParameters[C5] * 256)));
|
61 | shift = ((int64_t)dT*(int64_t)CalibrationParameters[C6])/8388608;
|
62 | presSensor.temperature = 2000 + shift;
|
63 |
|
64 | return dT;
|
65 | };
|
66 |
|
67 |
|
68 | void initSensorParametersTemperature(uint16_t sensorParameters[]) {
|
69 | for(int i = 0; i < 2; i++) {
|
70 | I2C_0_read(I2C_ADDR_PRESSENSE, I2C_REG_PRESSENSE_C5 + 2*i, 2);
|
71 | *(sensorParameters + i) = ((au8_msgBuf[0]<<8 | au8_msgBuf[1])); //compare Datasheet page 11
|
72 | }
|
73 | }
|
74 |
|
75 | // Die Routine wird alle 5 Millisekunden aufgerufen. Der Sensor benötigt circa 3 ms zum Wandeln der Werte und sollte genug Zeit haben.
|
76 | void pressureSensorRoutine() {
|
77 | static volatile uint8_t state = 0;
|
78 | static volatile int32_t dT;
|
79 | switch (state)
|
80 | {
|
81 | case 0:
|
82 | resetPresSens();
|
83 | state = 1;
|
84 | break;
|
85 | case 1:
|
86 | calculatePressure(dT);
|
87 | startTemperatureConversion();
|
88 | state = 2;
|
89 | break;
|
90 | case 2:
|
91 | dT = calculateTemperatureAndReturnDifferentialTemperatur();
|
92 | startPressureConversion();
|
93 | state = 1;
|
94 | break;
|
95 | default:
|
96 | state = 0;
|
97 | break;
|
98 | }
|
99 | }
|