Library for use on MS5803 devices

Dependents:   MS5803-Demo mbed_PI_Depth robfish_pressuresensors_encoderQEI sensor_library_test ... more

Committer:
rkk
Date:
Thu Jul 24 04:19:39 2014 +0000
Revision:
0:d558dda1e821
Child:
1:a1f3bd291a0c
tested for use on MS5803-14BA

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rkk 0:d558dda1e821 1 /*
rkk 0:d558dda1e821 2 Permission is hereby granted, free of charge, to any person obtaining a copy
rkk 0:d558dda1e821 3 of this software and associated documentation files (the "Software"), to deal
rkk 0:d558dda1e821 4 in the Software without restriction, including without limitation the rights
rkk 0:d558dda1e821 5 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
rkk 0:d558dda1e821 6 copies of the Software, and to permit persons to whom the Software is
rkk 0:d558dda1e821 7 furnished to do so, subject to the following conditions:
rkk 0:d558dda1e821 8
rkk 0:d558dda1e821 9 The above copyright notice and this permission notice shall be included in
rkk 0:d558dda1e821 10 all copies or substantial portions of the Software.
rkk 0:d558dda1e821 11
rkk 0:d558dda1e821 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
rkk 0:d558dda1e821 13 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
rkk 0:d558dda1e821 14 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
rkk 0:d558dda1e821 15 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
rkk 0:d558dda1e821 16 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
rkk 0:d558dda1e821 17 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
rkk 0:d558dda1e821 18 THE SOFTWARE.
rkk 0:d558dda1e821 19
rkk 0:d558dda1e821 20 * Barometer Sensor (Altimeter) MS5803-01BA of MEAS Switzerland (www.meas-spec.com).
rkk 0:d558dda1e821 21 * The driver uses I2C mode (sensor PS pin low).
rkk 0:d558dda1e821 22 * Other types of MEAS are compatible but not tested.
rkk 0:d558dda1e821 23 * Written by Raig Kaufer distribute freely!
rkk 0:d558dda1e821 24 */
rkk 0:d558dda1e821 25
rkk 0:d558dda1e821 26 #include <stdlib.h>
rkk 0:d558dda1e821 27 #include "MS5803.h"
rkk 0:d558dda1e821 28
rkk 0:d558dda1e821 29
rkk 0:d558dda1e821 30 /*
rkk 0:d558dda1e821 31 * Sensor operating function according data sheet
rkk 0:d558dda1e821 32 */
rkk 0:d558dda1e821 33
rkk 0:d558dda1e821 34 /* Send soft reset to the sensor */
rkk 0:d558dda1e821 35 void MS5803::MS5803Reset(void) {
rkk 0:d558dda1e821 36 /* transmit out 1 byte reset command */
rkk 0:d558dda1e821 37 ms5803_tx_data[0] = ms5803_reset;
rkk 0:d558dda1e821 38 if ( i2c.write( device_address, ms5803_tx_data, 1 ) );
rkk 0:d558dda1e821 39 printf('send soft reset');
rkk 0:d558dda1e821 40 wait_ms(20);
rkk 0:d558dda1e821 41 }
rkk 0:d558dda1e821 42
rkk 0:d558dda1e821 43 /* read the sensor calibration data from rom */
rkk 0:d558dda1e821 44 void MS5803::MS5803ReadProm(void) {
rkk 0:d558dda1e821 45 uint8_t i,j;
rkk 0:d558dda1e821 46 for (i=0; i<8; i++) {
rkk 0:d558dda1e821 47 j = i;
rkk 0:d558dda1e821 48 ms5803_tx_data[0] = ms5803_PROMread + (j<<1);
rkk 0:d558dda1e821 49 if ( i2c.write( device_address, ms5803_tx_data, 1 ) );
rkk 0:d558dda1e821 50 if ( i2c.read( device_address, ms5803_rx_data, 2 ) );
rkk 0:d558dda1e821 51 C[i] = ms5803_rx_data[1] + (ms5803_rx_data[0]<<8);
rkk 0:d558dda1e821 52 }
rkk 0:d558dda1e821 53 }
rkk 0:d558dda1e821 54
rkk 0:d558dda1e821 55 /* Start the sensor pressure conversion */
rkk 0:d558dda1e821 56 void MS5803::MS5803ConvertD1(void) {
rkk 0:d558dda1e821 57 ms5803_tx_data[0] = ms5803_convD1;
rkk 0:d558dda1e821 58 if ( i2c.write( device_address, ms5803_tx_data, 1 ) );
rkk 0:d558dda1e821 59 }
rkk 0:d558dda1e821 60
rkk 0:d558dda1e821 61 /* Start the sensor temperature conversion */
rkk 0:d558dda1e821 62 void MS5803:: MS5803ConvertD2(void) {
rkk 0:d558dda1e821 63 ms5803_tx_data[0] = ms5803_convD2;
rkk 0:d558dda1e821 64 if ( i2c.write( device_address, ms5803_tx_data, 1 ) );
rkk 0:d558dda1e821 65 }
rkk 0:d558dda1e821 66
rkk 0:d558dda1e821 67 /* Read the privious started conversion results */
rkk 0:d558dda1e821 68 int32_t MS5803::MS5803ReadADC(void) {
rkk 0:d558dda1e821 69 int32_t adc;
rkk 0:d558dda1e821 70 wait_ms(150);
rkk 0:d558dda1e821 71 ms5803_tx_data[0] = ms5803_ADCread;
rkk 0:d558dda1e821 72 if ( i2c.write( device_address, ms5803_tx_data, 1 ) );
rkk 0:d558dda1e821 73 if ( i2c.read( device_address, ms5803_rx_data, 3 ) );
rkk 0:d558dda1e821 74 adc = ms5803_rx_data[2] + (ms5803_rx_data[1]<<8) + (ms5803_rx_data[0]<<16);
rkk 0:d558dda1e821 75 return (adc);
rkk 0:d558dda1e821 76 }
rkk 0:d558dda1e821 77
rkk 0:d558dda1e821 78 /* return the results */
rkk 0:d558dda1e821 79 float MS5803::MS5803_Pressure (void) {
rkk 0:d558dda1e821 80 return P_MS5803;
rkk 0:d558dda1e821 81 }
rkk 0:d558dda1e821 82 float MS5803::MS5803_Temperature (void) {
rkk 0:d558dda1e821 83 return T_MS5803;
rkk 0:d558dda1e821 84 }
rkk 0:d558dda1e821 85
rkk 0:d558dda1e821 86 /* Sensor reading and calculation procedure */
rkk 0:d558dda1e821 87 void MS5803::Barometer_MS5803(void) {
rkk 0:d558dda1e821 88 int32_t dT, temp;
rkk 0:d558dda1e821 89 int64_t OFF, SENS, press;
rkk 0:d558dda1e821 90
rkk 0:d558dda1e821 91 MS5803Reset(); // reset the sensor
rkk 0:d558dda1e821 92 MS5803ReadProm(); // read the calibration values
rkk 0:d558dda1e821 93 MS5803ConvertD1(); // start pressure conversion
rkk 0:d558dda1e821 94 D1 = MS5803ReadADC(); // read the pressure value
rkk 0:d558dda1e821 95 MS5803ConvertD2(); // start temperature conversion
rkk 0:d558dda1e821 96 D2 = MS5803ReadADC(); // read the temperature value
rkk 0:d558dda1e821 97
rkk 0:d558dda1e821 98 /* calculation according MS5803-01BA data sheet DA5803-01BA_006 */
rkk 0:d558dda1e821 99 dT = D2 - (C[5]* 256);
rkk 0:d558dda1e821 100 OFF = (int64_t)C[2] * (1<<16) + ((int64_t)dT * (int64_t)C[4]) / (1<<7);
rkk 0:d558dda1e821 101 SENS = (int64_t)C[1] * (1<<15) + ((int64_t)dT * (int64_t)C[3]) / (1<<8);
rkk 0:d558dda1e821 102
rkk 0:d558dda1e821 103 temp = 2000 + (dT * C[6]) / (1<<23);
rkk 0:d558dda1e821 104 T_MS5803 = (float) temp / 100.0f; // result of temperature in deg C in this var
rkk 0:d558dda1e821 105 press = (((int64_t)D1 * SENS) / (1<<21) - OFF) / (1<<15);
rkk 0:d558dda1e821 106 P_MS5803 = (float) press / 100.0f; // result of pressure in mBar in this var
rkk 0:d558dda1e821 107 }