High resolution barometer and altimeter using i2c mode

Dependents:   Q2_Stabi

Fork of ms5611 by Kevin Braun

Committer:
Decimus
Date:
Mon May 30 08:10:56 2016 +0000
Revision:
12:af100556f99e
Parent:
11:e0417b67a4b5
[+] Some renaming ang adding getGyro

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:f97f410d4a21 1 #ifndef MS5611_H
loopsva 0:f97f410d4a21 2 #define MS5611_H
loopsva 0:f97f410d4a21 3
loopsva 0:f97f410d4a21 4 #include "mbed.h"
loopsva 0:f97f410d4a21 5
loopsva 11:e0417b67a4b5 6 //#define MS5611i2cLOWLEVEL 1 //if the use of low-level I2C routines is needed
loopsva 11:e0417b67a4b5 7 //#warning "MS5611 using low level I2C routines"
loopsva 5:0d7b229474c6 8
loopsva 5:0d7b229474c6 9 #define SEA_PRESS 1013.25 //default sea level pressure level in mb
loopsva 5:0d7b229474c6 10 #define KNOWNALT 327.0 //default known altitude, 5200 Franklin Dr., 94588
loopsva 5:0d7b229474c6 11 #define INHG 0.02952998751 //convert mb to in/Hg constant
loopsva 5:0d7b229474c6 12 #define MB 33.8638815 //convert in/Hg to mb constant
loopsva 5:0d7b229474c6 13 #define FTMETERS 0.3048 //convert feet to meters
loopsva 5:0d7b229474c6 14
loopsva 5:0d7b229474c6 15
loopsva 0:f97f410d4a21 16 /** Software routines to access the Measurement Specialties' MS5611-01BA03
loopsva 0:f97f410d4a21 17 * Variometer Module using the I2C bus option. The MS5611 is a 24 bit
loopsva 0:f97f410d4a21 18 * temperature and pressure transducer for high accuracy Barometer and
loopsva 0:f97f410d4a21 19 * Altimeter applications. It also includes compensation coefficients
loopsva 0:f97f410d4a21 20 * stored within the device.
loopsva 0:f97f410d4a21 21 *
loopsva 0:f97f410d4a21 22 * Code adapted from Measurement Specialties:
loopsva 0:f97f410d4a21 23 * "AN520 C-code example for MS56xx, MS57xx (except analog sensor), and
loopsva 0:f97f410d4a21 24 * MS58xx series pressure sensors"
loopsva 0:f97f410d4a21 25 *
loopsva 0:f97f410d4a21 26 * Note: AN520 has not been updated for use with the MS5611. Changes
loopsva 0:f97f410d4a21 27 * were necessary to "calcPT()" in order to correct scaling of
loopsva 0:f97f410d4a21 28 * pressure readings.
loopsva 0:f97f410d4a21 29 *
loopsva 0:f97f410d4a21 30 * Features:
loopsva 0:f97f410d4a21 31 * Altitude resolution to 10cm
loopsva 0:f97f410d4a21 32 * Fast conversion down to 1 ms
loopsva 0:f97f410d4a21 33 * Low power, 1 μA (standby < 0.15 μA)
loopsva 0:f97f410d4a21 34 * QFN package 5.0 x 3.0 x 1.0 mm^3
loopsva 0:f97f410d4a21 35 * Supply voltage 1.8 to 3.6 V
loopsva 0:f97f410d4a21 36 * Integrated digital pressure sensor (24 bit DeltaSigma ADC)
loopsva 0:f97f410d4a21 37 * Operating range: 10 to 1200 mbar, -40 to +85 °C
loopsva 0:f97f410d4a21 38 * I2C and SPI interface up to 20 MHz
loopsva 0:f97f410d4a21 39 * No external components (Internal oscillator)
loopsva 0:f97f410d4a21 40 * Excellent long term stability
loopsva 0:f97f410d4a21 41 *
loopsva 0:f97f410d4a21 42 * @code
loopsva 0:f97f410d4a21 43 * #include "mbed.h"
loopsva 0:f97f410d4a21 44 * #include "ms5611.h"
loopsva 0:f97f410d4a21 45 *
loopsva 7:90ee2168baa7 46 * //ms5611 ms(p9, p10); // i2c pins used
loopsva 7:90ee2168baa7 47 * ms5611 ms(p9, p10, ms5611::CSBpin_0); // NEW!! with rev 7. User can set polarity of CSB pin
loopsva 7:90ee2168baa7 48 * //ms5611 ms(p9, p10, ms5611::CSBpin_1);
loopsva 7:90ee2168baa7 49 *
loopsva 0:f97f410d4a21 50 * Serial pc(USBTX, USBRX); // local terminal interface
loopsva 0:f97f410d4a21 51 *
loopsva 0:f97f410d4a21 52 *
loopsva 0:f97f410d4a21 53 * int main (void) {
loopsva 0:f97f410d4a21 54 * pc.baud(921600); // set up USB serial speed
loopsva 0:f97f410d4a21 55 *
loopsva 0:f97f410d4a21 56 * // set up the ms5611
loopsva 0:f97f410d4a21 57 * pc.printf("\n\nInitializing the MS5611..\n");
loopsva 0:f97f410d4a21 58 * ms.cmd_reset();
loopsva 0:f97f410d4a21 59 * pc.printf("Ready\n");
loopsva 0:f97f410d4a21 60 *
loopsva 0:f97f410d4a21 61 * while(1) {
loopsva 6:41c370fa1f7b 62 * double Temp = ms.calcTemp(); //calculate press and temp, then returns current temperature in degC
loopsva 6:41c370fa1f7b 63 * double Press = ms.calcPressure(); //calculate press and temp, then returns current pressure in mb
loopsva 6:41c370fa1f7b 64 * double GetPress = ms.getPressure(); //returns current pressure in mb. Does no calculations. Ususally done after calcTemp()
loopsva 6:41c370fa1f7b 65 * double Altitude = ms.getAltitudeFT(1013.25); //enter pressure at sea level in mb, returns altitude in feet
loopsva 6:41c370fa1f7b 66 * double PressSeaLvlFT = ms.getSeaLevelBaroFT(327.2); //enter known altitude in feet, returns sea level pressure in mb
loopsva 6:41c370fa1f7b 67 * double PressSeaLvlM = ms.getAltitudeFT(99.73); //enter known altitude in meters, returns seal level pressure in mb
loopsva 6:41c370fa1f7b 68 *
loopsva 6:41c370fa1f7b 69 * pc.printf("Temp: %.2f degC\n", Temp);
loopsva 6:41c370fa1f7b 70 * pc.printf("Barometer: %.1f mB %.3f in/Hg\n", Press, Press * 0.0295301);
loopsva 6:41c370fa1f7b 71 * pc.printf("Alt: %.1f ft\n", Altitude);
loopsva 6:41c370fa1f7b 72 * pc.printf("Sea_Lvl: %.1f ft %.2f m\n", PressSeaLvlFT, PressSeaLvlM);
loopsva 0:f97f410d4a21 73 * wait(2.0);
loopsva 0:f97f410d4a21 74 * }
loopsva 0:f97f410d4a21 75 * }
loopsva 0:f97f410d4a21 76 *
loopsva 0:f97f410d4a21 77 * @endcode
loopsva 0:f97f410d4a21 78 */
loopsva 0:f97f410d4a21 79
loopsva 0:f97f410d4a21 80 //_____ M A C R O S
loopsva 0:f97f410d4a21 81
loopsva 7:90ee2168baa7 82 #define MS5611_ADDR_W 0xEE // Module address write mode (CSBpin = 0);
loopsva 0:f97f410d4a21 83 #define MS5611_ADDR_R 0xEF // Module address read mode
loopsva 0:f97f410d4a21 84 #define MS5611_CMD_RESET 0x1E // ADC reset command
loopsva 0:f97f410d4a21 85 #define MS5611_CMD_ADC_READ 0x00 // ADC read command
loopsva 0:f97f410d4a21 86 #define MS5611_CMD_ADC_CONV 0x40 // ADC conversion command
loopsva 0:f97f410d4a21 87 #define MS5611_CMD_ADC_D1 0x00 // ADC D1 conversion
loopsva 0:f97f410d4a21 88 #define MS5611_CMD_ADC_D2 0x10 // ADC D2 conversion
loopsva 0:f97f410d4a21 89 #define MS5611_CMD_ADC_256 0x00 // ADC OSR=256
loopsva 0:f97f410d4a21 90 #define MS5611_CMD_ADC_512 0x02 // ADC OSR=512
loopsva 0:f97f410d4a21 91 #define MS5611_CMD_ADC_1024 0x04 // ADC OSR=1024
loopsva 0:f97f410d4a21 92 #define MS5611_CMD_ADC_2048 0x06 // ADC OSR=2048
loopsva 0:f97f410d4a21 93 #define MS5611_CMD_ADC_4096 0x08 // ADC OSR=4096
loopsva 0:f97f410d4a21 94 #define MS5611_CMD_PROM_RD 0xA0 // Prom read command
loopsva 0:f97f410d4a21 95
loopsva 2:05804ed70748 96 /** Create ms5611 controller class
loopsva 2:05804ed70748 97 *
loopsva 2:05804ed70748 98 * @param ms5611 class
loopsva 2:05804ed70748 99 *
loopsva 2:05804ed70748 100 */
loopsva 1:94a46b4fed9d 101 class ms5611 {
loopsva 0:f97f410d4a21 102
loopsva 0:f97f410d4a21 103 public:
loopsva 7:90ee2168baa7 104 enum CSBpolarity {
loopsva 7:90ee2168baa7 105 CSBpin_0, //CSB pin is grounded, I2C address is 0xEE and 0xEF
loopsva 7:90ee2168baa7 106 CSBpin_1, //CSB pin is tied to Vdd, I2C address is 0xEC and 0xED
loopsva 7:90ee2168baa7 107 };
loopsva 0:f97f410d4a21 108 /** Create a MS5611 object using the specified I2C object
loopsva 7:90ee2168baa7 109 * - User fixed I2C address 0xEE, CSB pin = 0
loopsva 7:90ee2168baa7 110 * - This is the default legacy constructor
loopsva 7:90ee2168baa7 111 * @param sda - mbed I2C interface pin
loopsva 7:90ee2168baa7 112 * @param scl - mbed I2C interface pin
loopsva 0:f97f410d4a21 113 */
loopsva 0:f97f410d4a21 114 ms5611(PinName sda, PinName scl);
loopsva 7:90ee2168baa7 115 /** Create a MS5611 object using the specified I2C object
loopsva 7:90ee2168baa7 116 * - User defined use of the CSB pin
loopsva 7:90ee2168baa7 117 * - CSB pin = 0, user set I2C address to 0xEE
loopsva 7:90ee2168baa7 118 * - CSB pin = 1, user set I2C address to 0xEC
loopsva 7:90ee2168baa7 119 * @param sda - mbed I2C interface pin
loopsva 7:90ee2168baa7 120 * @param scl - mbed I2C interface pin
loopsva 7:90ee2168baa7 121 * @param ms5611::CSBpin_0 - CSB pin tied to ground
loopsva 7:90ee2168baa7 122 * @param ms5611::CSBpin_1 - CSB pin tied to VDD
loopsva 7:90ee2168baa7 123 */
loopsva 7:90ee2168baa7 124 ms5611(PinName sda, PinName scl, CSBpolarity CSBpin);
loopsva 0:f97f410d4a21 125 /** Initialize the MS5611 and set up the coefficients
loopsva 0:f97f410d4a21 126 * First - reset the MS5611
loopsva 0:f97f410d4a21 127 * Second - load coefficient values from the MS5611 PROM
loopsva 0:f97f410d4a21 128 * Third - calculate coefficient checksum
loopsva 0:f97f410d4a21 129 * This routine only needs to be run once at boot up
loopsva 0:f97f410d4a21 130 *
loopsva 0:f97f410d4a21 131 * @param NONE
loopsva 0:f97f410d4a21 132 */
loopsva 0:f97f410d4a21 133 void cmd_reset();
loopsva 0:f97f410d4a21 134 /** Calculate and return compensated temperature
loopsva 0:f97f410d4a21 135 * Returns double temperature in degC
loopsva 0:f97f410d4a21 136 *
loopsva 0:f97f410d4a21 137 * @param NONE
loopsva 0:f97f410d4a21 138 */
loopsva 0:f97f410d4a21 139 double calcTemp();
loopsva 0:f97f410d4a21 140 /** Calculate and return compensated barometric pressure
loopsva 0:f97f410d4a21 141 * Returns double pressure in millibars
loopsva 0:f97f410d4a21 142 *
loopsva 0:f97f410d4a21 143 * @param NONE
loopsva 0:f97f410d4a21 144 */
loopsva 0:f97f410d4a21 145 double calcPressure();
loopsva 3:c2d1b0d432ad 146 /** Return compensated barometric pressure
loopsva 3:c2d1b0d432ad 147 * Returns double pressure in millibars
loopsva 3:c2d1b0d432ad 148 * DOES NOT RE-CALCULATE FIRST!!!
loopsva 3:c2d1b0d432ad 149 * Saves time if you calcTemp(); first
loopsva 3:c2d1b0d432ad 150 *
loopsva 3:c2d1b0d432ad 151 * @param NONE
loopsva 3:c2d1b0d432ad 152 */
loopsva 3:c2d1b0d432ad 153 double getPressure();
loopsva 3:c2d1b0d432ad 154 /** Calculate and returns altitude in feet
loopsva 5:0d7b229474c6 155 * Returns float altitude in feet
loopsva 3:c2d1b0d432ad 156 *
loopsva 5:0d7b229474c6 157 * @param float known pressure (mB) at sea level
loopsva 3:c2d1b0d432ad 158 */
Decimus 12:af100556f99e 159 float getAltitude();
loopsva 3:c2d1b0d432ad 160 float getAltitudeFT(float sea_pressure);
loopsva 5:0d7b229474c6 161 /** Calculate and returns sea level baro
loopsva 5:0d7b229474c6 162 * Returns float seal level barometer in feet
loopsva 5:0d7b229474c6 163 *
loopsva 5:0d7b229474c6 164 * @param float known altitude in feet
loopsva 5:0d7b229474c6 165 */
loopsva 5:0d7b229474c6 166 float getSeaLevelBaroFT(float known_alt);
loopsva 5:0d7b229474c6 167 /** Calculate and returns sea level baro
loopsva 5:0d7b229474c6 168 * Returns float seal level barometer in meters
loopsva 5:0d7b229474c6 169 *
loopsva 5:0d7b229474c6 170 * @param float known altitude in meters
loopsva 5:0d7b229474c6 171 */
loopsva 5:0d7b229474c6 172 float getSeaLevelBaroM(float known_alt);
Decimus 12:af100556f99e 173
Decimus 12:af100556f99e 174 uint8_t calcPT();
Decimus 12:af100556f99e 175
loopsva 0:f97f410d4a21 176
loopsva 0:f97f410d4a21 177 private:
loopsva 11:e0417b67a4b5 178 #if not defined MS5611i2cLOWLEVEL
loopsva 11:e0417b67a4b5 179 char cobuf[3];
loopsva 11:e0417b67a4b5 180 #endif
loopsva 11:e0417b67a4b5 181 uint8_t _i2cWAddr;
loopsva 11:e0417b67a4b5 182 uint8_t _i2cRAddr;
loopsva 0:f97f410d4a21 183 int m_i2c_start(bool readMode);
loopsva 11:e0417b67a4b5 184 void m_i2c_stop();
loopsva 11:e0417b67a4b5 185 uint8_t m_i2c_write(uint8_t data);
loopsva 11:e0417b67a4b5 186 uint8_t m_i2c_readAck();
loopsva 11:e0417b67a4b5 187 uint8_t m_i2c_readNak();
loopsva 11:e0417b67a4b5 188 void m_i2c_send(uint8_t cmd);
loopsva 0:f97f410d4a21 189 void loadCoefs();
loopsva 11:e0417b67a4b5 190 uint64_t cmd_adc(uint8_t cmd);
loopsva 11:e0417b67a4b5 191 uint32_t cmd_prom(uint8_t coef_num);
loopsva 11:e0417b67a4b5 192 uint8_t crc4(uint32_t n_prom[]);
loopsva 11:e0417b67a4b5 193 uint32_t PTbuffer[8]; // calibration coefficients
Decimus 12:af100556f99e 194
Decimus 12:af100556f99e 195 uint8_t step;
Decimus 12:af100556f99e 196 int32_t D1, D2;
loopsva 0:f97f410d4a21 197
loopsva 0:f97f410d4a21 198 protected:
loopsva 0:f97f410d4a21 199 I2C _i2c;
loopsva 0:f97f410d4a21 200
loopsva 0:f97f410d4a21 201
loopsva 0:f97f410d4a21 202 };
loopsva 0:f97f410d4a21 203 #endif