Updated MS5837 Library to add support for the MS5837_30BA Sensor.

Dependents:   AUV_depth_sensor_072319

Committer:
JohnSarge
Date:
Tue Jul 23 13:38:32 2019 +0000
Revision:
4:d9ba4ce3e1d8
Parent:
3:128270625e55
Updated comments.

Who changed what in which revision?

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