Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of ms5611 by
ms5611.h@12:af100556f99e, 2016-05-30 (annotated)
- 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?
| User | Revision | Line number | New 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 |
