Updated version with comments
Dependencies: IMU MODSERIAL Servo mbed
Fork of RTOS_Controller_v3 by
MS5837/MS5837.cpp@11:1b838130dc8c, 2016-12-12 (annotated)
- Committer:
- aolgu003
- Date:
- Mon Dec 12 04:29:24 2016 +0000
- Revision:
- 11:1b838130dc8c
- Parent:
- 7:396fa2a8648d
Added comments
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
aolgu003 | 7:396fa2a8648d | 1 | #include <stdlib.h> |
aolgu003 | 7:396fa2a8648d | 2 | #include "MS5837.h" |
aolgu003 | 7:396fa2a8648d | 3 | |
aolgu003 | 7:396fa2a8648d | 4 | |
aolgu003 | 7:396fa2a8648d | 5 | /* |
aolgu003 | 7:396fa2a8648d | 6 | * Sensor operating function according data sheet |
aolgu003 | 7:396fa2a8648d | 7 | */ |
aolgu003 | 7:396fa2a8648d | 8 | |
aolgu003 | 7:396fa2a8648d | 9 | void MS5837::MS5837Init(void) |
aolgu003 | 7:396fa2a8648d | 10 | { |
aolgu003 | 7:396fa2a8648d | 11 | MS5837Reset(); |
aolgu003 | 7:396fa2a8648d | 12 | MS5837ReadProm(); |
aolgu003 | 7:396fa2a8648d | 13 | return; |
aolgu003 | 7:396fa2a8648d | 14 | } |
aolgu003 | 7:396fa2a8648d | 15 | |
aolgu003 | 7:396fa2a8648d | 16 | /* Send soft reset to the sensor */ |
aolgu003 | 7:396fa2a8648d | 17 | void MS5837::MS5837Reset(void) |
aolgu003 | 7:396fa2a8648d | 18 | { |
aolgu003 | 7:396fa2a8648d | 19 | /* transmit out 1 byte reset command */ |
aolgu003 | 7:396fa2a8648d | 20 | ms5837_tx_data[0] = ms5837_reset; |
aolgu003 | 7:396fa2a8648d | 21 | if ( i2c.write( device_address, ms5837_tx_data, 1 ) ); |
aolgu003 | 7:396fa2a8648d | 22 | //printf("send soft reset"); |
aolgu003 | 7:396fa2a8648d | 23 | wait_ms(20); |
aolgu003 | 7:396fa2a8648d | 24 | } |
aolgu003 | 7:396fa2a8648d | 25 | |
aolgu003 | 7:396fa2a8648d | 26 | /* read the sensor calibration data from rom */ |
aolgu003 | 7:396fa2a8648d | 27 | void MS5837::MS5837ReadProm(void) |
aolgu003 | 7:396fa2a8648d | 28 | { |
aolgu003 | 7:396fa2a8648d | 29 | uint8_t i,j; |
aolgu003 | 7:396fa2a8648d | 30 | for (i=0; i<8; i++) { |
aolgu003 | 7:396fa2a8648d | 31 | j = i; |
aolgu003 | 7:396fa2a8648d | 32 | ms5837_tx_data[0] = ms5837_PROMread + (j<<1); |
aolgu003 | 7:396fa2a8648d | 33 | if ( i2c.write( device_address, ms5837_tx_data, 1 ) ); |
aolgu003 | 7:396fa2a8648d | 34 | if ( i2c.read( device_address, ms5837_rx_data, 2 ) ); |
aolgu003 | 7:396fa2a8648d | 35 | C[i] = ms5837_rx_data[1] + (ms5837_rx_data[0]<<8); |
aolgu003 | 7:396fa2a8648d | 36 | } |
aolgu003 | 7:396fa2a8648d | 37 | } |
aolgu003 | 7:396fa2a8648d | 38 | |
aolgu003 | 7:396fa2a8648d | 39 | /* Start the sensor pressure conversion */ |
aolgu003 | 7:396fa2a8648d | 40 | void MS5837::MS5837ConvertD1(void) |
aolgu003 | 7:396fa2a8648d | 41 | { |
aolgu003 | 7:396fa2a8648d | 42 | ms5837_tx_data[0] = ms5837_convD1; |
aolgu003 | 7:396fa2a8648d | 43 | if ( i2c.write( device_address, ms5837_tx_data, 1 ) ); |
aolgu003 | 7:396fa2a8648d | 44 | } |
aolgu003 | 7:396fa2a8648d | 45 | |
aolgu003 | 7:396fa2a8648d | 46 | /* Start the sensor temperature conversion */ |
aolgu003 | 7:396fa2a8648d | 47 | void MS5837:: MS5837ConvertD2(void) |
aolgu003 | 7:396fa2a8648d | 48 | { |
aolgu003 | 7:396fa2a8648d | 49 | ms5837_tx_data[0] = ms5837_convD2; |
aolgu003 | 7:396fa2a8648d | 50 | if ( i2c.write( device_address, ms5837_tx_data, 1 ) ); |
aolgu003 | 7:396fa2a8648d | 51 | } |
aolgu003 | 7:396fa2a8648d | 52 | |
aolgu003 | 7:396fa2a8648d | 53 | /* Read the previous started conversion results */ |
aolgu003 | 7:396fa2a8648d | 54 | int32_t MS5837::MS5837ReadADC(void) |
aolgu003 | 7:396fa2a8648d | 55 | { |
aolgu003 | 7:396fa2a8648d | 56 | int32_t adc; |
aolgu003 | 7:396fa2a8648d | 57 | wait_ms(150); |
aolgu003 | 7:396fa2a8648d | 58 | ms5837_tx_data[0] = ms5837_ADCread; |
aolgu003 | 7:396fa2a8648d | 59 | if ( i2c.write( device_address, ms5837_tx_data, 1 ) ); |
aolgu003 | 7:396fa2a8648d | 60 | if ( i2c.read( device_address, ms5837_rx_data, 3 ) ); |
aolgu003 | 7:396fa2a8648d | 61 | adc = ms5837_rx_data[2] + (ms5837_rx_data[1]<<8) + (ms5837_rx_data[0]<<16); |
aolgu003 | 7:396fa2a8648d | 62 | return (adc); |
aolgu003 | 7:396fa2a8648d | 63 | } |
aolgu003 | 7:396fa2a8648d | 64 | |
aolgu003 | 7:396fa2a8648d | 65 | /* return the results */ |
aolgu003 | 7:396fa2a8648d | 66 | float MS5837::MS5837_Pressure (void) |
aolgu003 | 7:396fa2a8648d | 67 | { |
aolgu003 | 7:396fa2a8648d | 68 | return P_MS5837; |
aolgu003 | 7:396fa2a8648d | 69 | } |
aolgu003 | 7:396fa2a8648d | 70 | float MS5837::MS5837_Temperature (void) |
aolgu003 | 7:396fa2a8648d | 71 | { |
aolgu003 | 7:396fa2a8648d | 72 | return T_MS5837; |
aolgu003 | 7:396fa2a8648d | 73 | } |
aolgu003 | 7:396fa2a8648d | 74 | |
aolgu003 | 7:396fa2a8648d | 75 | /* Sensor reading and calculation procedure */ |
aolgu003 | 7:396fa2a8648d | 76 | void MS5837::Barometer_MS5837(void) |
aolgu003 | 7:396fa2a8648d | 77 | { |
aolgu003 | 7:396fa2a8648d | 78 | int32_t dT, temp; |
aolgu003 | 7:396fa2a8648d | 79 | int64_t OFF, SENS, press; |
aolgu003 | 7:396fa2a8648d | 80 | |
aolgu003 | 7:396fa2a8648d | 81 | //no need to do this everytime! |
aolgu003 | 7:396fa2a8648d | 82 | //MS5837Reset(); // reset the sensor |
aolgu003 | 7:396fa2a8648d | 83 | //MS5837ReadProm(); // read the calibration values |
aolgu003 | 7:396fa2a8648d | 84 | |
aolgu003 | 7:396fa2a8648d | 85 | |
aolgu003 | 7:396fa2a8648d | 86 | MS5837ConvertD1(); // start pressure conversion |
aolgu003 | 7:396fa2a8648d | 87 | D1 = MS5837ReadADC(); // read the pressure value |
aolgu003 | 7:396fa2a8648d | 88 | MS5837ConvertD2(); // start temperature conversion |
aolgu003 | 7:396fa2a8648d | 89 | D2 = MS5837ReadADC(); // read the temperature value |
aolgu003 | 7:396fa2a8648d | 90 | |
aolgu003 | 7:396fa2a8648d | 91 | /* calculation according MS5837-01BA data sheet DA5837-01BA_006 */ |
aolgu003 | 7:396fa2a8648d | 92 | dT = D2 - (C[5]* 256); |
aolgu003 | 7:396fa2a8648d | 93 | OFF = (int64_t)C[2] * (1<<16) + ((int64_t)dT * (int64_t)C[4]) / (1<<7); |
aolgu003 | 7:396fa2a8648d | 94 | SENS = (int64_t)C[1] * (1<<15) + ((int64_t)dT * (int64_t)C[3]) / (1<<8); |
aolgu003 | 7:396fa2a8648d | 95 | |
aolgu003 | 7:396fa2a8648d | 96 | temp = 2000 + (dT * C[6]) / (1<<23); |
aolgu003 | 7:396fa2a8648d | 97 | T_MS5837 = (float) temp / 100.0f; // result of temperature in deg C in this var |
aolgu003 | 7:396fa2a8648d | 98 | press = (((int64_t)D1 * SENS) / (1<<21) - OFF) / (1<<13); |
aolgu003 | 7:396fa2a8648d | 99 | P_MS5837 = (float) press / 10.0f; // result of pressure in mBar in this var |
aolgu003 | 7:396fa2a8648d | 100 | } |