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 //!
loopsva 0:f97f410d4a21 2 //! @file an520_I2C.c,v
loopsva 0:f97f410d4a21 3 //!
loopsva 0:f97f410d4a21 4 //! Copyright (c) 2009 MEAS Switzerland
loopsva 0:f97f410d4a21 5 //!
loopsva 0:f97f410d4a21 6 //!
loopsva 0:f97f410d4a21 7 //!
loopsva 0:f97f410d4a21 8 //! @brief This C code is for starter reference only. It is written for the
loopsva 0:f97f410d4a21 9 //! MEAS Switzerland MS56xx pressure sensor modules and Atmel Atmega644p
loopsva 0:f97f410d4a21 10 //! microcontroller.
loopsva 0:f97f410d4a21 11 //!
loopsva 0:f97f410d4a21 12 //! @version 1.0 $Id: an520_I2C.c,v 1.0
loopsva 0:f97f410d4a21 13 //!
loopsva 0:f97f410d4a21 14 //! @todo
loopsva 0:f97f410d4a21 15
loopsva 0:f97f410d4a21 16 #include "mbed.h"
loopsva 0:f97f410d4a21 17 #include "ms5611.h"
loopsva 0:f97f410d4a21 18
loopsva 5:0d7b229474c6 19 double P; // compensated pressure value (mB)
loopsva 5:0d7b229474c6 20 double T; // compensated temperature value (degC)
loopsva 5:0d7b229474c6 21 double A; // altitude (ft)
loopsva 5:0d7b229474c6 22 double S; // sea level barometer (mB)
loopsva 2:05804ed70748 23
loopsva 2:05804ed70748 24 uint32_t C[8]; //coefficient storage
loopsva 2:05804ed70748 25
loopsva 0:f97f410d4a21 26 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 7:90ee2168baa7 27 // Constructor and destructor - default to be compatible with legacy m5611 driver
loopsva 0:f97f410d4a21 28
loopsva 0:f97f410d4a21 29 ms5611::ms5611(PinName sda, PinName scl) : _i2c(sda, scl) {
loopsva 6:41c370fa1f7b 30 _i2c.frequency(400000);
loopsva 7:90ee2168baa7 31 _i2cWAddr = MS5611_ADDR_W;
loopsva 7:90ee2168baa7 32 _i2cRAddr = MS5611_ADDR_R;
Decimus 12:af100556f99e 33 step = 1;
loopsva 7:90ee2168baa7 34 }
loopsva 7:90ee2168baa7 35
loopsva 7:90ee2168baa7 36 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 7:90ee2168baa7 37 // Constructor and destructor - new, to allow for user to select i2c address based on CSB pin
loopsva 7:90ee2168baa7 38
loopsva 7:90ee2168baa7 39 ms5611::ms5611(PinName sda, PinName scl, CSBpolarity CSBpin) : _i2c(sda, scl) {
loopsva 7:90ee2168baa7 40 _i2c.frequency(400000);
loopsva 7:90ee2168baa7 41 _i2cWAddr = MS5611_ADDR_W;
loopsva 7:90ee2168baa7 42 _i2cRAddr = MS5611_ADDR_R;
loopsva 7:90ee2168baa7 43 if(CSBpin == CSBpin_1) {
loopsva 7:90ee2168baa7 44 _i2cWAddr -= 2;
loopsva 7:90ee2168baa7 45 _i2cRAddr -= 2;
loopsva 7:90ee2168baa7 46
loopsva 7:90ee2168baa7 47 }
Decimus 12:af100556f99e 48 step = 1;
loopsva 0:f97f410d4a21 49 }
loopsva 0:f97f410d4a21 50
loopsva 0:f97f410d4a21 51 //********************************************************
loopsva 0:f97f410d4a21 52 //! @brief send I2C start condition and the address byte
loopsva 0:f97f410d4a21 53 //!
loopsva 0:f97f410d4a21 54 //! @return 0
loopsva 0:f97f410d4a21 55 //********************************************************
loopsva 0:f97f410d4a21 56
loopsva 11:e0417b67a4b5 57 int32_t ms5611::m_i2c_start(bool readMode) {
loopsva 11:e0417b67a4b5 58 int32_t twst;
loopsva 0:f97f410d4a21 59 _i2c.start();
loopsva 0:f97f410d4a21 60 if(readMode == true) {
loopsva 7:90ee2168baa7 61 twst = m_i2c_write(_i2cRAddr);
loopsva 0:f97f410d4a21 62 } else {
loopsva 7:90ee2168baa7 63 twst = m_i2c_write(_i2cWAddr);
loopsva 0:f97f410d4a21 64 }
loopsva 0:f97f410d4a21 65 return(twst);
loopsva 0:f97f410d4a21 66 }
loopsva 0:f97f410d4a21 67
loopsva 0:f97f410d4a21 68 //********************************************************
loopsva 0:f97f410d4a21 69 //! @brief send I2C stop condition
loopsva 0:f97f410d4a21 70 //!
loopsva 0:f97f410d4a21 71 //! @return none
loopsva 0:f97f410d4a21 72 //********************************************************
loopsva 0:f97f410d4a21 73
loopsva 11:e0417b67a4b5 74 void ms5611::m_i2c_stop() {
loopsva 0:f97f410d4a21 75 _i2c.stop();
loopsva 0:f97f410d4a21 76 }
loopsva 0:f97f410d4a21 77
loopsva 0:f97f410d4a21 78 //********************************************************
loopsva 0:f97f410d4a21 79 //! @brief send I2C stop condition
loopsva 0:f97f410d4a21 80 //!
loopsva 0:f97f410d4a21 81 //! @return remote ack status
loopsva 0:f97f410d4a21 82 //********************************************************
loopsva 0:f97f410d4a21 83
loopsva 11:e0417b67a4b5 84 uint8_t ms5611::m_i2c_write(uint8_t data) {
loopsva 11:e0417b67a4b5 85 uint8_t twst = _i2c.write(data);
loopsva 0:f97f410d4a21 86 return(twst);
loopsva 0:f97f410d4a21 87 }
loopsva 0:f97f410d4a21 88
loopsva 0:f97f410d4a21 89 //********************************************************
loopsva 0:f97f410d4a21 90 //! @brief read I2C byte with acknowledgment
loopsva 0:f97f410d4a21 91 //!
loopsva 0:f97f410d4a21 92 //! @return read byte
loopsva 0:f97f410d4a21 93 //********************************************************
loopsva 0:f97f410d4a21 94
loopsva 11:e0417b67a4b5 95 uint8_t ms5611::m_i2c_readAck() {
loopsva 11:e0417b67a4b5 96 uint8_t twst = _i2c.read(1);
loopsva 0:f97f410d4a21 97 return(twst);
loopsva 0:f97f410d4a21 98 }
loopsva 0:f97f410d4a21 99
loopsva 0:f97f410d4a21 100 //********************************************************
loopsva 0:f97f410d4a21 101 //! @brief read I2C byte without acknowledgment
loopsva 0:f97f410d4a21 102 //!
loopsva 0:f97f410d4a21 103 //! @return read byte
loopsva 0:f97f410d4a21 104 //********************************************************
loopsva 0:f97f410d4a21 105
loopsva 11:e0417b67a4b5 106 uint8_t ms5611::m_i2c_readNak() {
loopsva 11:e0417b67a4b5 107 uint8_t twst = _i2c.read(0);
loopsva 0:f97f410d4a21 108 return(twst);
loopsva 0:f97f410d4a21 109 }
loopsva 0:f97f410d4a21 110
loopsva 0:f97f410d4a21 111 //********************************************************
loopsva 0:f97f410d4a21 112 //! @brief send command using I2C hardware interface
loopsva 0:f97f410d4a21 113 //!
loopsva 0:f97f410d4a21 114 //! @return none
loopsva 0:f97f410d4a21 115 //********************************************************
loopsva 0:f97f410d4a21 116
loopsva 11:e0417b67a4b5 117 void ms5611::m_i2c_send(uint8_t cmd) {
loopsva 11:e0417b67a4b5 118 uint8_t ret;
loopsva 2:05804ed70748 119 ret = m_i2c_start(false);
loopsva 2:05804ed70748 120 if(!(ret)) {
loopsva 0:f97f410d4a21 121 m_i2c_stop();
loopsva 2:05804ed70748 122 } else {
loopsva 0:f97f410d4a21 123 ret = m_i2c_write(cmd);
loopsva 0:f97f410d4a21 124 m_i2c_stop();
loopsva 0:f97f410d4a21 125 }
loopsva 0:f97f410d4a21 126 }
loopsva 0:f97f410d4a21 127
loopsva 0:f97f410d4a21 128 //********************************************************
loopsva 0:f97f410d4a21 129 //! @brief send reset sequence
loopsva 0:f97f410d4a21 130 //!
loopsva 0:f97f410d4a21 131 //! @return none
loopsva 0:f97f410d4a21 132 //********************************************************
loopsva 0:f97f410d4a21 133
loopsva 0:f97f410d4a21 134 void ms5611::cmd_reset() {
loopsva 8:461f68bc94f2 135 #if defined MS5611i2cLOWLEVEL
loopsva 2:05804ed70748 136 m_i2c_send(MS5611_CMD_RESET);
loopsva 8:461f68bc94f2 137 #else
loopsva 8:461f68bc94f2 138 cobuf[0] = MS5611_CMD_RESET;
loopsva 8:461f68bc94f2 139 _i2c.write(_i2cWAddr, cobuf, 1, false);
loopsva 8:461f68bc94f2 140 #endif
loopsva 2:05804ed70748 141 wait_ms(4);
loopsva 0:f97f410d4a21 142 loadCoefs();
loopsva 0:f97f410d4a21 143 }
loopsva 0:f97f410d4a21 144
loopsva 0:f97f410d4a21 145 //********************************************************
loopsva 0:f97f410d4a21 146 //! @brief preform adc conversion
loopsva 0:f97f410d4a21 147 //!
loopsva 0:f97f410d4a21 148 //! @return 24bit result
loopsva 0:f97f410d4a21 149 //********************************************************
loopsva 0:f97f410d4a21 150
loopsva 11:e0417b67a4b5 151 uint64_t ms5611::cmd_adc(uint8_t cmd) {
loopsva 11:e0417b67a4b5 152 uint64_t temp = 0;
Decimus 12:af100556f99e 153 if( step & 0b101 ){ // or 0b1 either 0b100
loopsva 11:e0417b67a4b5 154 #if defined MS5611i2cLOWLEVEL
Decimus 12:af100556f99e 155 m_i2c_send(MS5611_CMD_ADC_CONV + cmd);
loopsva 11:e0417b67a4b5 156 #else
Decimus 12:af100556f99e 157 cobuf[0] = 0;
Decimus 12:af100556f99e 158 cobuf[1] = 0;
Decimus 12:af100556f99e 159 cobuf[2] = 0;
Decimus 12:af100556f99e 160 cobuf[0] = MS5611_CMD_ADC_CONV + cmd;
Decimus 12:af100556f99e 161 _i2c.write(_i2cWAddr, cobuf, 1, false);
loopsva 8:461f68bc94f2 162 #endif
Decimus 12:af100556f99e 163 /*
Decimus 12:af100556f99e 164 switch (cmd & 0x0f) {
Decimus 12:af100556f99e 165 case MS5611_CMD_ADC_256 : wait_us(900); break;
Decimus 12:af100556f99e 166 case MS5611_CMD_ADC_512 : wait_ms(3); break;
Decimus 12:af100556f99e 167 case MS5611_CMD_ADC_1024: wait_ms(4); break;
Decimus 12:af100556f99e 168 case MS5611_CMD_ADC_2048: wait_ms(6); break;
Decimus 12:af100556f99e 169 case MS5611_CMD_ADC_4096: wait_ms(10); break;
Decimus 12:af100556f99e 170 }
Decimus 12:af100556f99e 171 */
Decimus 12:af100556f99e 172 step = step<<1; // will be 0b10 or 0b1000
Decimus 12:af100556f99e 173 return 0;
loopsva 0:f97f410d4a21 174 }
Decimus 12:af100556f99e 175 else if( step & 0b1010 ){ // or 0b10 either 0b1000
loopsva 8:461f68bc94f2 176 #if defined MS5611i2cLOWLEVEL
Decimus 12:af100556f99e 177 m_i2c_send(MS5611_CMD_ADC_READ);
Decimus 12:af100556f99e 178 m_i2c_start(true);
Decimus 12:af100556f99e 179 temp = m_i2c_readAck();
Decimus 12:af100556f99e 180 temp = (temp << 8) | m_i2c_readAck();
Decimus 12:af100556f99e 181 temp = (temp << 8) | m_i2c_readNak();
Decimus 12:af100556f99e 182 m_i2c_stop();
loopsva 8:461f68bc94f2 183 #else
Decimus 12:af100556f99e 184 cobuf[0] = MS5611_CMD_ADC_READ;
Decimus 12:af100556f99e 185 _i2c.write(_i2cWAddr, cobuf, 1, true);
Decimus 12:af100556f99e 186 cobuf[0] = 0;
Decimus 12:af100556f99e 187 _i2c.read(_i2cRAddr, cobuf, 3, false);
Decimus 12:af100556f99e 188 temp = (cobuf[0] << 16) | (cobuf[1] << 8) | cobuf[2];
Decimus 12:af100556f99e 189 #endif
Decimus 12:af100556f99e 190 step = step<<1; // will be 0b100 or 0b10000
Decimus 12:af100556f99e 191 return temp;
Decimus 12:af100556f99e 192 }
Decimus 12:af100556f99e 193 return 0;
loopsva 0:f97f410d4a21 194 }
loopsva 0:f97f410d4a21 195
loopsva 0:f97f410d4a21 196 //********************************************************
loopsva 0:f97f410d4a21 197 //! @brief Read calibration coefficients
loopsva 0:f97f410d4a21 198 //!
loopsva 0:f97f410d4a21 199 //! @return coefficient
loopsva 0:f97f410d4a21 200 //********************************************************
loopsva 0:f97f410d4a21 201
loopsva 11:e0417b67a4b5 202 uint32_t ms5611::cmd_prom(uint8_t coef_num) {
loopsva 11:e0417b67a4b5 203 uint32_t rC = 0;
loopsva 11:e0417b67a4b5 204 #if defined MS5611i2cLOWLEVEL
loopsva 11:e0417b67a4b5 205 m_i2c_send(MS5611_CMD_PROM_RD + coef_num * 2); // send PROM READ command
loopsva 11:e0417b67a4b5 206 m_i2c_start(true);
loopsva 11:e0417b67a4b5 207 rC = m_i2c_readAck();
loopsva 11:e0417b67a4b5 208 rC = (rC << 8) | m_i2c_readNak();
loopsva 11:e0417b67a4b5 209 m_i2c_stop();
loopsva 11:e0417b67a4b5 210 #else
loopsva 0:f97f410d4a21 211 cobuf[0] = 0;
loopsva 0:f97f410d4a21 212 cobuf[1] = 0;
loopsva 8:461f68bc94f2 213 cobuf[0] = MS5611_CMD_PROM_RD + coef_num * 2;
loopsva 8:461f68bc94f2 214 _i2c.write(_i2cWAddr, cobuf, 1, true);
loopsva 8:461f68bc94f2 215 cobuf[0] = 0;
loopsva 11:e0417b67a4b5 216 _i2c.read(_i2cRAddr, cobuf, 2, false);
loopsva 11:e0417b67a4b5 217 rC = (cobuf[0] << 8) | cobuf[1];
loopsva 8:461f68bc94f2 218 #endif
loopsva 0:f97f410d4a21 219 return rC;
loopsva 0:f97f410d4a21 220 }
loopsva 0:f97f410d4a21 221
loopsva 0:f97f410d4a21 222 //********************************************************
loopsva 0:f97f410d4a21 223 //! @brief calculate the CRC code
loopsva 0:f97f410d4a21 224 //!
loopsva 0:f97f410d4a21 225 //! @return crc code
loopsva 0:f97f410d4a21 226 //********************************************************
loopsva 0:f97f410d4a21 227
loopsva 11:e0417b67a4b5 228 uint8_t ms5611::crc4(uint32_t n_prom[]) {
loopsva 11:e0417b67a4b5 229 uint32_t n_rem;
loopsva 11:e0417b67a4b5 230 uint32_t crc_read;
loopsva 11:e0417b67a4b5 231 uint8_t n_bit;
loopsva 0:f97f410d4a21 232 n_rem = 0x00;
loopsva 2:05804ed70748 233 crc_read = n_prom[7];
loopsva 2:05804ed70748 234 n_prom[7]=(0xFF00 & (n_prom[7]));
loopsva 2:05804ed70748 235 for (int cnt = 0; cnt < 16; cnt++) {
loopsva 0:f97f410d4a21 236 if (cnt%2 == 1) {
loopsva 11:e0417b67a4b5 237 n_rem ^= (uint16_t) ((n_prom[cnt>>1]) & 0x00FF);
loopsva 0:f97f410d4a21 238 } else {
loopsva 11:e0417b67a4b5 239 n_rem ^= (uint16_t) (n_prom[cnt>>1]>>8);
loopsva 0:f97f410d4a21 240 }
loopsva 0:f97f410d4a21 241 for (n_bit = 8; n_bit > 0; n_bit--) {
loopsva 0:f97f410d4a21 242 if (n_rem & (0x8000)) {
loopsva 0:f97f410d4a21 243 n_rem = (n_rem << 1) ^ 0x3000;
loopsva 0:f97f410d4a21 244 } else {
loopsva 0:f97f410d4a21 245 n_rem = (n_rem << 1);
loopsva 0:f97f410d4a21 246 }
loopsva 0:f97f410d4a21 247 }
loopsva 0:f97f410d4a21 248 }
loopsva 2:05804ed70748 249 n_rem= (0x000F & (n_rem >> 12));
loopsva 2:05804ed70748 250 n_prom[7]=crc_read;
loopsva 0:f97f410d4a21 251 return (n_rem ^ 0x0);
loopsva 2:05804ed70748 252 }
loopsva 2:05804ed70748 253
loopsva 0:f97f410d4a21 254 /*
loopsva 0:f97f410d4a21 255 The CRC code is calculated and written in factory with the LSB byte in the prom n_prom[7] set to 0x00 (see
loopsva 0:f97f410d4a21 256 Coefficient table below). It is thus important to clear those bytes from the calculation buffer before proceeding
loopsva 0:f97f410d4a21 257 with the CRC calculation itself:
loopsva 0:f97f410d4a21 258 n_prom[7]=(0xFF00 & (n_prom[7])); //CRC byte is replaced by 0
loopsva 0:f97f410d4a21 259 As a simple test of the CRC code, the following coefficient table could be used:
loopsva 11:e0417b67a4b5 260 uint32_t nprom[] = {0x3132,0x3334,0x3536,0x3738,0x3940,0x4142,0x4344,0x4500};
loopsva 0:f97f410d4a21 261 the resulting calculated CRC should be 0xB.
loopsva 0:f97f410d4a21 262
loopsva 0:f97f410d4a21 263 DB 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
loopsva 0:f97f410d4a21 264 Addr
loopsva 0:f97f410d4a21 265 0 16 bit reserved for manufacturer
loopsva 0:f97f410d4a21 266 1 Coefficient 1 (16 bit unsigned)
loopsva 0:f97f410d4a21 267 2 Coefficient 2 (16 bit unsigned)
loopsva 0:f97f410d4a21 268 3 Coefficient 3 (16 bit unsigned)
loopsva 0:f97f410d4a21 269 4 Coefficient 4 (16 bit unsigned)
loopsva 0:f97f410d4a21 270 5 Coefficient 5 (16 bit unsigned)
loopsva 0:f97f410d4a21 271 6 Coefficient 6 (16 bit unsigned)
loopsva 0:f97f410d4a21 272 7 0 0 0 0 CRC(0x0)
loopsva 0:f97f410d4a21 273 */
loopsva 0:f97f410d4a21 274 /*
loopsva 0:f97f410d4a21 275 //Returns 0x0b as per AP520_004
loopsva 2:05804ed70748 276 C[0] = 0x3132;
loopsva 2:05804ed70748 277 C[1] = 0x3334;
loopsva 2:05804ed70748 278 C[2] = 0x3536;
loopsva 2:05804ed70748 279 C[3] = 0x3738;
loopsva 2:05804ed70748 280 C[4] = 0x3940;
loopsva 2:05804ed70748 281 C[5] = 0x4142;
loopsva 2:05804ed70748 282 C[6] = 0x4344;
loopsva 2:05804ed70748 283 C[7] = 0x4546;
loopsva 0:f97f410d4a21 284 n_crc = ms.crc4(C); // calculate the CRC
loopsva 0:f97f410d4a21 285 pc.printf("testing CRC: 0x%x\n", n_crc);
loopsva 0:f97f410d4a21 286 */
loopsva 2:05804ed70748 287
loopsva 0:f97f410d4a21 288 //********************************************************
loopsva 0:f97f410d4a21 289 //! @brief load all calibration coefficients
loopsva 0:f97f410d4a21 290 //!
loopsva 0:f97f410d4a21 291 //! @return none
loopsva 0:f97f410d4a21 292 //********************************************************
loopsva 0:f97f410d4a21 293
loopsva 0:f97f410d4a21 294 void ms5611::loadCoefs() {
loopsva 0:f97f410d4a21 295 for (int i = 0; i < 8; i++){
loopsva 0:f97f410d4a21 296 wait_ms(50);
loopsva 2:05804ed70748 297 C[i] = cmd_prom(i);
loopsva 0:f97f410d4a21 298 }
loopsva 11:e0417b67a4b5 299 uint8_t n_crc = crc4(C);
loopsva 0:f97f410d4a21 300 }
loopsva 0:f97f410d4a21 301
loopsva 0:f97f410d4a21 302 //********************************************************
loopsva 0:f97f410d4a21 303 //! @brief calculate temperature and pressure
loopsva 0:f97f410d4a21 304 //!
loopsva 0:f97f410d4a21 305 //! @return none
loopsva 0:f97f410d4a21 306 //********************************************************
loopsva 0:f97f410d4a21 307
Decimus 12:af100556f99e 308 uint8_t ms5611::calcPT() {
Decimus 12:af100556f99e 309 if( step & 0b11 ){ // or 0b1 either 0b10
Decimus 12:af100556f99e 310 D2 = cmd_adc(MS5611_CMD_ADC_D2 + MS5611_CMD_ADC_2048); // read D2
Decimus 12:af100556f99e 311 }
Decimus 12:af100556f99e 312 if( step & 0b1100 ){ // or 0b10 either 0b100
Decimus 12:af100556f99e 313 D1 = cmd_adc(MS5611_CMD_ADC_D1 + MS5611_CMD_ADC_2048); // read D1
Decimus 12:af100556f99e 314 }
Decimus 12:af100556f99e 315 if( step & 0b10000 ){
Decimus 12:af100556f99e 316 int64_t dT = D2 - ((uint64_t)C[5] << 8);
Decimus 12:af100556f99e 317 int64_t OFF = ((uint32_t)C[2] << 16) + ((dT * (C[4]) >> 7)); //was OFF = (C[2] << 17) + dT * C[4] / (1 << 6);
Decimus 12:af100556f99e 318 int64_t SENS = ((uint32_t)C[1] << 15) + ((dT * (C[3]) >> 8)); //was SENS = (C[1] << 16) + dT * C[3] / (1 << 7);
Decimus 12:af100556f99e 319 int32_t TEMP = 2000 + (int64_t)dT * (int64_t)C[6] / (int64_t)(1 << 23);
Decimus 12:af100556f99e 320 T = (double) TEMP / 100.0;
loopsva 0:f97f410d4a21 321
Decimus 12:af100556f99e 322 if(TEMP < 2000) { // if temperature lower than +20 Celsius
Decimus 12:af100556f99e 323 int64_t T1 = ((int64_t)TEMP - 2000) * ((int64_t)TEMP - 2000);
Decimus 12:af100556f99e 324 int64_t OFF1 = (5 * T1) >> 1;
Decimus 12:af100556f99e 325 int64_t SENS1 = (5 * T1) >> 2;
loopsva 2:05804ed70748 326
Decimus 12:af100556f99e 327 if(TEMP < -1500) { // if temperature lower than -15 Celsius
Decimus 12:af100556f99e 328 T1 = ((int64_t)TEMP + 1500) * ((int64_t)TEMP + 1500);
Decimus 12:af100556f99e 329 OFF1 += 7 * T1;
Decimus 12:af100556f99e 330 SENS1 += 11 * T1 >> 1;
Decimus 12:af100556f99e 331 }
Decimus 12:af100556f99e 332 OFF -= OFF1;
Decimus 12:af100556f99e 333 SENS -= SENS1;
Decimus 12:af100556f99e 334 }
Decimus 12:af100556f99e 335 P = (double)(((((int64_t)D1 * SENS ) >> 21) - OFF) / (double) (1 << 15)) / 100.0;
Decimus 12:af100556f99e 336 step = 1;
Decimus 12:af100556f99e 337 return 1;
loopsva 2:05804ed70748 338 }
Decimus 12:af100556f99e 339 return 0;
loopsva 0:f97f410d4a21 340 }
loopsva 0:f97f410d4a21 341
loopsva 0:f97f410d4a21 342 //********************************************************
loopsva 0:f97f410d4a21 343 //! @brief calculate temperature
loopsva 0:f97f410d4a21 344 //!
loopsva 0:f97f410d4a21 345 //! @return double temperature degC
loopsva 0:f97f410d4a21 346 //********************************************************
loopsva 0:f97f410d4a21 347
loopsva 0:f97f410d4a21 348 double ms5611::calcTemp() {
loopsva 0:f97f410d4a21 349 calcPT();
loopsva 0:f97f410d4a21 350 return(T);
loopsva 0:f97f410d4a21 351 }
loopsva 0:f97f410d4a21 352
loopsva 0:f97f410d4a21 353 //********************************************************
loopsva 3:c2d1b0d432ad 354 //! @brief calculate pressure
loopsva 0:f97f410d4a21 355 //!
loopsva 0:f97f410d4a21 356 //! @return double barometric pressure millibar
loopsva 0:f97f410d4a21 357 //********************************************************
loopsva 0:f97f410d4a21 358
loopsva 0:f97f410d4a21 359 double ms5611::calcPressure() {
loopsva 0:f97f410d4a21 360 calcPT();
loopsva 0:f97f410d4a21 361 return(P);
loopsva 2:05804ed70748 362 }
loopsva 3:c2d1b0d432ad 363
loopsva 3:c2d1b0d432ad 364 //********************************************************
loopsva 3:c2d1b0d432ad 365 //! @brief get pressure, no calculation
loopsva 3:c2d1b0d432ad 366 //!
loopsva 3:c2d1b0d432ad 367 //! @return double barometric pressure millibar
loopsva 3:c2d1b0d432ad 368 //********************************************************
loopsva 3:c2d1b0d432ad 369
loopsva 3:c2d1b0d432ad 370 double ms5611::getPressure() {
Decimus 12:af100556f99e 371 //calcPT();
loopsva 3:c2d1b0d432ad 372 return(P);
loopsva 3:c2d1b0d432ad 373 }
loopsva 3:c2d1b0d432ad 374
Decimus 12:af100556f99e 375 float ms5611::getAltitude() {
Decimus 12:af100556f99e 376 A = (1 - pow(P/(double)1013.250, 0.190295)) * 44330.0;
Decimus 12:af100556f99e 377 //A = (1 - (pow((P / (double)sea_pressure), 0.190284))) * 145366.45;
Decimus 12:af100556f99e 378 return((float)A);
Decimus 12:af100556f99e 379 }
Decimus 12:af100556f99e 380
loopsva 3:c2d1b0d432ad 381 //********************************************************
loopsva 5:0d7b229474c6 382 //! @brief get altitude from known sea level barometer,
loopsva 5:0d7b229474c6 383 //! @ no pre-pressure calculation
loopsva 3:c2d1b0d432ad 384 //!
loopsva 3:c2d1b0d432ad 385 //! @enter float sea level barometer
loopsva 3:c2d1b0d432ad 386 //! @return float altitude in feet
loopsva 3:c2d1b0d432ad 387 //********************************************************
loopsva 3:c2d1b0d432ad 388
loopsva 3:c2d1b0d432ad 389 float ms5611::getAltitudeFT(float sea_pressure) {
loopsva 3:c2d1b0d432ad 390 A = (1 - (pow((P / (double)sea_pressure), 0.190284))) * 145366.45;
loopsva 3:c2d1b0d432ad 391 return((float)A);
loopsva 3:c2d1b0d432ad 392 }
loopsva 5:0d7b229474c6 393
loopsva 5:0d7b229474c6 394 //********************************************************
loopsva 5:0d7b229474c6 395 //! @brief get sea level pressure from known altitude(ft),
loopsva 5:0d7b229474c6 396 //! @ no pre-pressure calculation
loopsva 5:0d7b229474c6 397 //!
loopsva 5:0d7b229474c6 398 //! @enter float known altitude in feet
loopsva 5:0d7b229474c6 399 //! @return float seal level barometer in mb
loopsva 5:0d7b229474c6 400 //********************************************************
loopsva 5:0d7b229474c6 401
loopsva 5:0d7b229474c6 402 float ms5611::getSeaLevelBaroFT(float known_alt) {
loopsva 5:0d7b229474c6 403 S = pow(pow((P * INHG), 0.190284) + 0.00001313 * known_alt , 5.2553026) * MB;
loopsva 5:0d7b229474c6 404 return((float)S);
loopsva 5:0d7b229474c6 405 }
loopsva 5:0d7b229474c6 406
loopsva 5:0d7b229474c6 407 //********************************************************
loopsva 5:0d7b229474c6 408 //! @brief get sea level pressure from known altitude(m),
loopsva 5:0d7b229474c6 409 //! @ no pre-pressure calculation
loopsva 5:0d7b229474c6 410 //!
loopsva 5:0d7b229474c6 411 //! @enter float known altitude in meters
loopsva 5:0d7b229474c6 412 //! @return float seal level barometer in mb
loopsva 5:0d7b229474c6 413 //********************************************************
loopsva 5:0d7b229474c6 414
loopsva 5:0d7b229474c6 415 float ms5611::getSeaLevelBaroM(float known_alt) {
loopsva 5:0d7b229474c6 416 S = pow(pow((P * INHG), 0.190284) + 0.00001313 * known_alt * FTMETERS , 5.2553026) * MB;
loopsva 5:0d7b229474c6 417 return((float)S);
loopsva 5:0d7b229474c6 418 }