Blue Robotics Bar02 Pressure Sensor sample MS5837-02BA Pressure Sensor
Dependents: Bar02_MS5837-02BA OCE360_Project
Fork of MS5837 by
MS5837.cpp@2:365c8caabc0e, 2018-07-17 (annotated)
- Committer:
- yuuitirou528
- Date:
- Tue Jul 17 16:35:51 2018 +0000
- Revision:
- 2:365c8caabc0e
- Parent:
- 1:ee71a13b8e68
Pressure Correction
Who changed what in which revision?
User | Revision | Line number | New 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 */ |
yuuitirou528 | 1:ee71a13b8e68 | 100 | dT = D2 - ((uint32_t)C[5]* 256); |
yuuitirou528 | 1:ee71a13b8e68 | 101 | OFF = (int64_t)C[2] * (1<<17) + ((int64_t)dT * (int64_t)C[4]) / (1<<6); |
yuuitirou528 | 1:ee71a13b8e68 | 102 | SENS = (int64_t)C[1] * (1<<16) + ((int64_t)dT * (int64_t)C[3]) / (1<<7); |
aolgu003 | 0:0c2c06ab8e72 | 103 | |
yuuitirou528 | 1:ee71a13b8e68 | 104 | temp = 2000 + ((int64_t)dT * C[6]) / (1<<23); |
yuuitirou528 | 1:ee71a13b8e68 | 105 | press = (((int64_t)D1 * SENS) / (1<<21) - OFF) / (1<<15); |
yuuitirou528 | 1:ee71a13b8e68 | 106 | if((temp/100)<20){ //Low temp |
yuuitirou528 | 1:ee71a13b8e68 | 107 | //Serial.println("here"); |
yuuitirou528 | 1:ee71a13b8e68 | 108 | Ti = (11*int64_t(dT)*int64_t(dT))/(34359738368LL); |
yuuitirou528 | 1:ee71a13b8e68 | 109 | OFFi = (31*(temp-2000)*(temp-2000))/8; |
yuuitirou528 | 1:ee71a13b8e68 | 110 | SENSi = (63*(temp-2000)*(temp-2000))/32; |
yuuitirou528 | 1:ee71a13b8e68 | 111 | } |
yuuitirou528 | 1:ee71a13b8e68 | 112 | |
yuuitirou528 | 1:ee71a13b8e68 | 113 | OFF2 = OFF-OFFi; //Calculate pressure and temp second order |
yuuitirou528 | 1:ee71a13b8e68 | 114 | SENS2 = SENS-SENSi; |
yuuitirou528 | 1:ee71a13b8e68 | 115 | |
yuuitirou528 | 1:ee71a13b8e68 | 116 | temp = (temp-Ti); |
yuuitirou528 | 2:365c8caabc0e | 117 | press = (((D1*SENS2)/2097152l-OFF2)/32768l); |
yuuitirou528 | 1:ee71a13b8e68 | 118 | |
aolgu003 | 0:0c2c06ab8e72 | 119 | T_MS5837 = (float) temp / 100.0f; // result of temperature in deg C in this var |
yuuitirou528 | 2:365c8caabc0e | 120 | P_MS5837 = (float) press / 100.0f; // result of pressure in mBar in this var |
aolgu003 | 0:0c2c06ab8e72 | 121 | |
aolgu003 | 0:0c2c06ab8e72 | 122 | } |
aolgu003 | 0:0c2c06ab8e72 | 123 | |
aolgu003 | 0:0c2c06ab8e72 | 124 | float MS5837::depth(void) { |
yuuitirou528 | 1:ee71a13b8e68 | 125 | //return (P_MS5837/100)*1.019716; |
yuuitirou528 | 1:ee71a13b8e68 | 126 | return ((P_MS5837*100)-101300)/(fluidDensity*9.80665); |
yuuitirou528 | 1:ee71a13b8e68 | 127 | |
yuuitirou528 | 1:ee71a13b8e68 | 128 | } |
yuuitirou528 | 1:ee71a13b8e68 | 129 | |
yuuitirou528 | 1:ee71a13b8e68 | 130 | float MS5837::altitude(void) { |
yuuitirou528 | 1:ee71a13b8e68 | 131 | //return (P_MS5837/100)*1.019716; |
yuuitirou528 | 1:ee71a13b8e68 | 132 | return (1-pow((P_MS5837/1013.25),0.190284))*145366.45*0.3048; |
yuuitirou528 | 1:ee71a13b8e68 | 133 | |
aolgu003 | 0:0c2c06ab8e72 | 134 | } |