Alek Boving / MS5837

Dependents:   project1

Committer:
alekboving
Date:
Tue Dec 01 15:01:44 2020 +0000
Revision:
0:dd665d08f973
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alekboving 0:dd665d08f973 1 #include <stdlib.h>
alekboving 0:dd665d08f973 2 #include "MS5837.h"
alekboving 0:dd665d08f973 3
alekboving 0:dd665d08f973 4
alekboving 0:dd665d08f973 5 /*
alekboving 0:dd665d08f973 6 * Sensor operating function according data sheet
alekboving 0:dd665d08f973 7 */
alekboving 0:dd665d08f973 8
alekboving 0:dd665d08f973 9 void MS5837::MS5837Init(void)
alekboving 0:dd665d08f973 10 {
alekboving 0:dd665d08f973 11 MS5837Reset();
alekboving 0:dd665d08f973 12 MS5837ReadProm();
alekboving 0:dd665d08f973 13 return;
alekboving 0:dd665d08f973 14 }
alekboving 0:dd665d08f973 15
alekboving 0:dd665d08f973 16 /* Send soft reset to the sensor */
alekboving 0:dd665d08f973 17 void MS5837::MS5837Reset(void)
alekboving 0:dd665d08f973 18 {
alekboving 0:dd665d08f973 19 /* transmit out 1 byte reset command */
alekboving 0:dd665d08f973 20 ms5837_tx_data[0] = ms5837_reset;
alekboving 0:dd665d08f973 21 if ( i2c.write( device_address, ms5837_tx_data, 1 ) );
alekboving 0:dd665d08f973 22 printf("send soft reset\n");
alekboving 0:dd665d08f973 23 wait_ms(20);
alekboving 0:dd665d08f973 24 }
alekboving 0:dd665d08f973 25
alekboving 0:dd665d08f973 26 /* read the sensor calibration data from rom */
alekboving 0:dd665d08f973 27 void MS5837::MS5837ReadProm(void)
alekboving 0:dd665d08f973 28 {
alekboving 0:dd665d08f973 29 uint8_t i,j;
alekboving 0:dd665d08f973 30 for (i=0; i<8; i++) {
alekboving 0:dd665d08f973 31 j = i;
alekboving 0:dd665d08f973 32 ms5837_tx_data[0] = ms5837_PROMread + (j<<1);
alekboving 0:dd665d08f973 33 if ( i2c.write( device_address, ms5837_tx_data, 1 ) );
alekboving 0:dd665d08f973 34 if ( i2c.read( device_address, ms5837_rx_data, 2 ) );
alekboving 0:dd665d08f973 35 C[i] = ms5837_rx_data[1] + (ms5837_rx_data[0]<<8);
alekboving 0:dd665d08f973 36 }
alekboving 0:dd665d08f973 37 }
alekboving 0:dd665d08f973 38
alekboving 0:dd665d08f973 39 /* Start the sensor pressure conversion */
alekboving 0:dd665d08f973 40 void MS5837::MS5837ConvertD1(void)
alekboving 0:dd665d08f973 41 {
alekboving 0:dd665d08f973 42 ms5837_tx_data[0] = ms5837_convD1;
alekboving 0:dd665d08f973 43 if ( i2c.write( device_address, ms5837_tx_data, 1 ) );
alekboving 0:dd665d08f973 44 }
alekboving 0:dd665d08f973 45
alekboving 0:dd665d08f973 46 /* Start the sensor temperature conversion */
alekboving 0:dd665d08f973 47 void MS5837:: MS5837ConvertD2(void)
alekboving 0:dd665d08f973 48 {
alekboving 0:dd665d08f973 49 ms5837_tx_data[0] = ms5837_convD2;
alekboving 0:dd665d08f973 50 if ( i2c.write( device_address, ms5837_tx_data, 1 ) );
alekboving 0:dd665d08f973 51 }
alekboving 0:dd665d08f973 52
alekboving 0:dd665d08f973 53 /* Read the previous started conversion results */
alekboving 0:dd665d08f973 54 int32_t MS5837::MS5837ReadADC(void)
alekboving 0:dd665d08f973 55 {
alekboving 0:dd665d08f973 56 int32_t adc;
alekboving 0:dd665d08f973 57 wait_ms(150);
alekboving 0:dd665d08f973 58 ms5837_tx_data[0] = ms5837_ADCread;
alekboving 0:dd665d08f973 59 if ( i2c.write( device_address, ms5837_tx_data, 1 ) );
alekboving 0:dd665d08f973 60 if ( i2c.read( device_address, ms5837_rx_data, 3 ) );
alekboving 0:dd665d08f973 61 adc = ms5837_rx_data[2] + (ms5837_rx_data[1]<<8) + (ms5837_rx_data[0]<<16);
alekboving 0:dd665d08f973 62 //printf("ADC value: %x\n", adc);
alekboving 0:dd665d08f973 63 return (adc);
alekboving 0:dd665d08f973 64 }
alekboving 0:dd665d08f973 65
alekboving 0:dd665d08f973 66 /* return the results */
alekboving 0:dd665d08f973 67 float MS5837::MS5837_Pressure (void)
alekboving 0:dd665d08f973 68 {
alekboving 0:dd665d08f973 69 return P_MS5837;
alekboving 0:dd665d08f973 70 }
alekboving 0:dd665d08f973 71 float MS5837::MS5837_Temperature (void)
alekboving 0:dd665d08f973 72 {
alekboving 0:dd665d08f973 73 return T_MS5837;
alekboving 0:dd665d08f973 74 }
alekboving 0:dd665d08f973 75
alekboving 0:dd665d08f973 76 /* Sensor reading and calculation procedure */
alekboving 0:dd665d08f973 77 void MS5837::Barometer_MS5837(void)
alekboving 0:dd665d08f973 78 {
alekboving 0:dd665d08f973 79 int32_t dT, temp;
alekboving 0:dd665d08f973 80 int64_t OFF, SENS, press;
alekboving 0:dd665d08f973 81
alekboving 0:dd665d08f973 82 //int32_t dT = 0;
alekboving 0:dd665d08f973 83 //int64_t SENS = 0;
alekboving 0:dd665d08f973 84 //int64_t OFF = 0;
alekboving 0:dd665d08f973 85 int32_t SENSi = 0;
alekboving 0:dd665d08f973 86 int32_t OFFi = 0;
alekboving 0:dd665d08f973 87 int32_t Ti = 0;
alekboving 0:dd665d08f973 88 int64_t OFF2 = 0;
alekboving 0:dd665d08f973 89 int64_t SENS2 = 0;
alekboving 0:dd665d08f973 90
alekboving 0:dd665d08f973 91 //no need to do this everytime!
alekboving 0:dd665d08f973 92
alekboving 0:dd665d08f973 93
alekboving 0:dd665d08f973 94 MS5837ConvertD1(); // start pressure conversion
alekboving 0:dd665d08f973 95 D1 = MS5837ReadADC(); // read the pressure value
alekboving 0:dd665d08f973 96 MS5837ConvertD2(); // start temperature conversion
alekboving 0:dd665d08f973 97 D2 = MS5837ReadADC(); // read the temperature value
alekboving 0:dd665d08f973 98 //printf("D1 = %d\n", D1);
alekboving 0:dd665d08f973 99 /* calculation according MS5837-01BA data sheet DA5837-01BA_006 */
alekboving 0:dd665d08f973 100 dT = D2 - ((uint32_t)C[5]* 256);
alekboving 0:dd665d08f973 101 OFF = (int64_t)C[2] * (1<<17) + ((int64_t)dT * (int64_t)C[4]) / (1<<6);
alekboving 0:dd665d08f973 102 SENS = (int64_t)C[1] * (1<<16) + ((int64_t)dT * (int64_t)C[3]) / (1<<7);
alekboving 0:dd665d08f973 103
alekboving 0:dd665d08f973 104 temp = 2000 + ((int64_t)dT * C[6]) / (1<<23);
alekboving 0:dd665d08f973 105 press = (((int64_t)D1 * SENS) / (1<<21) - OFF) / (1<<15);
alekboving 0:dd665d08f973 106 if((temp/100)<20){ //Low temp
alekboving 0:dd665d08f973 107 //Serial.println("here");
alekboving 0:dd665d08f973 108 Ti = (11*int64_t(dT)*int64_t(dT))/(34359738368LL);
alekboving 0:dd665d08f973 109 OFFi = (31*(temp-2000)*(temp-2000))/8;
alekboving 0:dd665d08f973 110 SENSi = (63*(temp-2000)*(temp-2000))/32;
alekboving 0:dd665d08f973 111 }
alekboving 0:dd665d08f973 112
alekboving 0:dd665d08f973 113 OFF2 = OFF-OFFi; //Calculate pressure and temp second order
alekboving 0:dd665d08f973 114 SENS2 = SENS-SENSi;
alekboving 0:dd665d08f973 115
alekboving 0:dd665d08f973 116 temp = (temp-Ti);
alekboving 0:dd665d08f973 117 press = (((D1*SENS2)/2097152l-OFF2)/32768l)/100;
alekboving 0:dd665d08f973 118
alekboving 0:dd665d08f973 119 T_MS5837 = (float) temp / 100.0f; // result of temperature in deg C in this var
alekboving 0:dd665d08f973 120 P_MS5837 = (float) press / 1.00f; // result of pressure in mBar in this var
alekboving 0:dd665d08f973 121
alekboving 0:dd665d08f973 122 }
alekboving 0:dd665d08f973 123
alekboving 0:dd665d08f973 124 float MS5837::depth(void) {
alekboving 0:dd665d08f973 125 //return (P_MS5837/100)*1.019716;
alekboving 0:dd665d08f973 126 return ((P_MS5837*100)-101300)/(fluidDensity*9.80665);
alekboving 0:dd665d08f973 127
alekboving 0:dd665d08f973 128 }
alekboving 0:dd665d08f973 129
alekboving 0:dd665d08f973 130 float MS5837::altitude(void) {
alekboving 0:dd665d08f973 131 //return (P_MS5837/100)*1.019716;
alekboving 0:dd665d08f973 132 return (1-pow((P_MS5837/1013.25),0.190284))*145366.45*0.3048;
alekboving 0:dd665d08f973 133
alekboving 0:dd665d08f973 134 }