High resolution barometer and altimeter using i2c mode

Dependents:   upverter_fitbit_clone ReadingMag_HMC5883L_work

Committer:
loopsva
Date:
Tue Jul 14 16:19:59 2015 +0000
Revision:
9:6104e8cdb3ec
Parent:
8:461f68bc94f2
Fixed minor bugs when using low-level I2C routines.  Hi-level I2C routines ok. Also added hooks for the MS5805 (untested).

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 9:6104e8cdb3ec 25 int MStype = 0;
loopsva 2:05804ed70748 26
loopsva 0:f97f410d4a21 27 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 7:90ee2168baa7 28 // Constructor and destructor - default to be compatible with legacy m5611 driver
loopsva 0:f97f410d4a21 29
loopsva 0:f97f410d4a21 30 ms5611::ms5611(PinName sda, PinName scl) : _i2c(sda, scl) {
loopsva 6:41c370fa1f7b 31 _i2c.frequency(400000);
loopsva 7:90ee2168baa7 32 _i2cWAddr = MS5611_ADDR_W;
loopsva 7:90ee2168baa7 33 _i2cRAddr = MS5611_ADDR_R;
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 9:6104e8cdb3ec 43 MStype = CSBpin;
loopsva 9:6104e8cdb3ec 44 if((CSBpin == CSBpin_1) || (CSBpin == MS5805)) {
loopsva 7:90ee2168baa7 45 _i2cWAddr -= 2;
loopsva 7:90ee2168baa7 46 _i2cRAddr -= 2;
loopsva 7:90ee2168baa7 47
loopsva 7:90ee2168baa7 48 }
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 0:f97f410d4a21 57 int ms5611::m_i2c_start(bool readMode) {
loopsva 0:f97f410d4a21 58 int 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 0:f97f410d4a21 74 void ms5611::m_i2c_stop(void) {
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 0:f97f410d4a21 84 unsigned char ms5611::m_i2c_write(unsigned char data) {
loopsva 0:f97f410d4a21 85 int 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 0:f97f410d4a21 95 unsigned char ms5611::m_i2c_readAck(void) {
loopsva 0:f97f410d4a21 96 int 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 0:f97f410d4a21 106 unsigned char ms5611::m_i2c_readNak(void) {
loopsva 0:f97f410d4a21 107 int 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 9:6104e8cdb3ec 117 int ms5611::m_i2c_send(char cmd) {
loopsva 0:f97f410d4a21 118 unsigned char 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 9:6104e8cdb3ec 126 return(ret);
loopsva 0:f97f410d4a21 127 }
loopsva 0:f97f410d4a21 128
loopsva 0:f97f410d4a21 129 //********************************************************
loopsva 0:f97f410d4a21 130 //! @brief send reset sequence
loopsva 0:f97f410d4a21 131 //!
loopsva 0:f97f410d4a21 132 //! @return none
loopsva 0:f97f410d4a21 133 //********************************************************
loopsva 0:f97f410d4a21 134
loopsva 9:6104e8cdb3ec 135 int ms5611::cmd_reset() {
loopsva 8:461f68bc94f2 136 #if defined MS5611i2cLOWLEVEL
loopsva 9:6104e8cdb3ec 137 int ret = m_i2c_send(MS5611_CMD_RESET);
loopsva 9:6104e8cdb3ec 138 if(!(ret)) return(ret);
loopsva 8:461f68bc94f2 139 #else
loopsva 8:461f68bc94f2 140 char cobuf[1];
loopsva 8:461f68bc94f2 141 cobuf[0] = MS5611_CMD_RESET;
loopsva 9:6104e8cdb3ec 142 int ret = _i2c.write(_i2cWAddr, cobuf, 1, false);
loopsva 9:6104e8cdb3ec 143 if((ret)) return(0);
loopsva 8:461f68bc94f2 144 #endif
loopsva 9:6104e8cdb3ec 145
loopsva 9:6104e8cdb3ec 146 #ifdef RTOS_H
loopsva 9:6104e8cdb3ec 147 Thread::wait(4);
loopsva 9:6104e8cdb3ec 148 #else
loopsva 2:05804ed70748 149 wait_ms(4);
loopsva 9:6104e8cdb3ec 150 #endif
loopsva 9:6104e8cdb3ec 151
loopsva 0:f97f410d4a21 152 loadCoefs();
loopsva 9:6104e8cdb3ec 153 #if defined MS5611i2cLOWLEVEL
loopsva 9:6104e8cdb3ec 154 return(ret);
loopsva 9:6104e8cdb3ec 155 #else
loopsva 9:6104e8cdb3ec 156 return(1);
loopsva 9:6104e8cdb3ec 157 #endif
loopsva 0:f97f410d4a21 158 }
loopsva 0:f97f410d4a21 159
loopsva 0:f97f410d4a21 160 //********************************************************
loopsva 0:f97f410d4a21 161 //! @brief preform adc conversion
loopsva 0:f97f410d4a21 162 //!
loopsva 0:f97f410d4a21 163 //! @return 24bit result
loopsva 0:f97f410d4a21 164 //********************************************************
loopsva 0:f97f410d4a21 165
loopsva 0:f97f410d4a21 166 unsigned long ms5611::cmd_adc(char cmd) {
loopsva 9:6104e8cdb3ec 167 char cobuf[3] = {0, 0, 0};
loopsva 0:f97f410d4a21 168 unsigned long temp = 0;
loopsva 8:461f68bc94f2 169 #if defined MS5611i2cLOWLEVEL
loopsva 9:6104e8cdb3ec 170 m_i2c_start(false);
loopsva 9:6104e8cdb3ec 171 m_i2c_write(MS5611_CMD_ADC_CONV + cmd);
loopsva 9:6104e8cdb3ec 172 m_i2c_stop();
loopsva 8:461f68bc94f2 173 #else
loopsva 8:461f68bc94f2 174 cobuf[0] = MS5611_CMD_ADC_CONV + cmd;
loopsva 8:461f68bc94f2 175 _i2c.write(_i2cWAddr, cobuf, 1, false);
loopsva 8:461f68bc94f2 176 #endif
loopsva 2:05804ed70748 177 switch (cmd & 0x0f) {
loopsva 9:6104e8cdb3ec 178 #ifdef RTOS_H
loopsva 9:6104e8cdb3ec 179 case MS5611_CMD_ADC_256 : Thread::wait(1); break;
loopsva 9:6104e8cdb3ec 180 case MS5611_CMD_ADC_512 : Thread::wait(3); break;
loopsva 9:6104e8cdb3ec 181 case MS5611_CMD_ADC_1024: Thread::wait(4); break;
loopsva 9:6104e8cdb3ec 182 case MS5611_CMD_ADC_2048: Thread::wait(6); break;
loopsva 9:6104e8cdb3ec 183 case MS5611_CMD_ADC_4096: Thread::wait(10); break;
loopsva 9:6104e8cdb3ec 184 case MS5805_CMD_ADC_8192: Thread::wait(19); break;
loopsva 9:6104e8cdb3ec 185 #else
loopsva 0:f97f410d4a21 186 case MS5611_CMD_ADC_256 : wait_us(900); break;
loopsva 0:f97f410d4a21 187 case MS5611_CMD_ADC_512 : wait_ms(3); break;
loopsva 0:f97f410d4a21 188 case MS5611_CMD_ADC_1024: wait_ms(4); break;
loopsva 0:f97f410d4a21 189 case MS5611_CMD_ADC_2048: wait_ms(6); break;
loopsva 0:f97f410d4a21 190 case MS5611_CMD_ADC_4096: wait_ms(10); break;
loopsva 9:6104e8cdb3ec 191 case MS5805_CMD_ADC_8192: wait_ms(19); break;
loopsva 9:6104e8cdb3ec 192 #endif
loopsva 0:f97f410d4a21 193 }
loopsva 8:461f68bc94f2 194 #if defined MS5611i2cLOWLEVEL
loopsva 9:6104e8cdb3ec 195 m_i2c_start(false);
loopsva 9:6104e8cdb3ec 196 m_i2c_write(MS5611_CMD_ADC_READ);
loopsva 9:6104e8cdb3ec 197 m_i2c_start(true);
loopsva 9:6104e8cdb3ec 198 cobuf[0] = m_i2c_readAck();
loopsva 9:6104e8cdb3ec 199 cobuf[1] = m_i2c_readAck();
loopsva 9:6104e8cdb3ec 200 cobuf[2] = m_i2c_readNak();
loopsva 9:6104e8cdb3ec 201 m_i2c_stop();
loopsva 8:461f68bc94f2 202 #else
loopsva 8:461f68bc94f2 203 cobuf[0] = MS5611_CMD_ADC_READ;
loopsva 8:461f68bc94f2 204 _i2c.write(_i2cWAddr, cobuf, 1, true);
loopsva 8:461f68bc94f2 205 cobuf[0] = 0;
loopsva 9:6104e8cdb3ec 206 _i2c.read(_i2cRAddr, cobuf, 3, false);
loopsva 8:461f68bc94f2 207 #endif
loopsva 8:461f68bc94f2 208 //if(ret) printf("\n*** ms5611 ADC Read Error ");
loopsva 0:f97f410d4a21 209 temp = (cobuf[0] << 16) + (cobuf[1] << 8) + cobuf[2];
loopsva 0:f97f410d4a21 210 return temp;
loopsva 0:f97f410d4a21 211 }
loopsva 0:f97f410d4a21 212
loopsva 0:f97f410d4a21 213 //********************************************************
loopsva 0:f97f410d4a21 214 //! @brief Read calibration coefficients
loopsva 0:f97f410d4a21 215 //!
loopsva 0:f97f410d4a21 216 //! @return coefficient
loopsva 0:f97f410d4a21 217 //********************************************************
loopsva 0:f97f410d4a21 218
loopsva 0:f97f410d4a21 219 unsigned int ms5611::cmd_prom(char coef_num) {
loopsva 9:6104e8cdb3ec 220 char cobuf[2] = {0, 0};
loopsva 0:f97f410d4a21 221 unsigned int rC = 0;
loopsva 8:461f68bc94f2 222 #if defined MS5611i2cLOWLEVEL
loopsva 9:6104e8cdb3ec 223 m_i2c_start(false);
loopsva 9:6104e8cdb3ec 224 m_i2c_write(MS5611_CMD_PROM_RD + coef_num * 2);// send PROM READ command
loopsva 9:6104e8cdb3ec 225 m_i2c_start(true);
loopsva 9:6104e8cdb3ec 226 cobuf[0] = m_i2c_readAck();
loopsva 9:6104e8cdb3ec 227 cobuf[1] = m_i2c_readNak();
loopsva 9:6104e8cdb3ec 228 m_i2c_stop();
loopsva 8:461f68bc94f2 229 #else
loopsva 8:461f68bc94f2 230 cobuf[0] = MS5611_CMD_PROM_RD + coef_num * 2;
loopsva 8:461f68bc94f2 231 _i2c.write(_i2cWAddr, cobuf, 1, true);
loopsva 8:461f68bc94f2 232 cobuf[0] = 0;
loopsva 9:6104e8cdb3ec 233 _i2c.read(_i2cRAddr, cobuf, 2, false);
loopsva 8:461f68bc94f2 234 #endif
loopsva 8:461f68bc94f2 235 //if(ret) printf("\n*** ms5611 PROM Read Error ");
loopsva 0:f97f410d4a21 236 rC = cobuf[0] * 256 + cobuf[1];
loopsva 0:f97f410d4a21 237 return rC;
loopsva 0:f97f410d4a21 238 }
loopsva 0:f97f410d4a21 239
loopsva 0:f97f410d4a21 240 //********************************************************
loopsva 0:f97f410d4a21 241 //! @brief calculate the CRC code
loopsva 0:f97f410d4a21 242 //!
loopsva 0:f97f410d4a21 243 //! @return crc code
loopsva 0:f97f410d4a21 244 //********************************************************
loopsva 0:f97f410d4a21 245
loopsva 0:f97f410d4a21 246 unsigned char ms5611::crc4(unsigned int n_prom[]) {
loopsva 9:6104e8cdb3ec 247 unsigned int n_rem = 0;
loopsva 9:6104e8cdb3ec 248 unsigned int crc_read = 0;
loopsva 9:6104e8cdb3ec 249 unsigned char n_bit = 0;
loopsva 9:6104e8cdb3ec 250 if(MStype == ms5611::MS5805) {
loopsva 9:6104e8cdb3ec 251 n_prom[0] = (n_prom[0] & 0x0FFF);
loopsva 9:6104e8cdb3ec 252 n_prom[7] = 0;
loopsva 9:6104e8cdb3ec 253 } else {
loopsva 9:6104e8cdb3ec 254 crc_read = n_prom[7];
loopsva 9:6104e8cdb3ec 255 n_prom[7]=(0xFF00 & (n_prom[7]));
loopsva 9:6104e8cdb3ec 256 }
loopsva 2:05804ed70748 257 for (int cnt = 0; cnt < 16; cnt++) {
loopsva 0:f97f410d4a21 258 if (cnt%2 == 1) {
loopsva 0:f97f410d4a21 259 n_rem ^= (unsigned short) ((n_prom[cnt>>1]) & 0x00FF);
loopsva 0:f97f410d4a21 260 } else {
loopsva 0:f97f410d4a21 261 n_rem ^= (unsigned short) (n_prom[cnt>>1]>>8);
loopsva 0:f97f410d4a21 262 }
loopsva 0:f97f410d4a21 263 for (n_bit = 8; n_bit > 0; n_bit--) {
loopsva 0:f97f410d4a21 264 if (n_rem & (0x8000)) {
loopsva 0:f97f410d4a21 265 n_rem = (n_rem << 1) ^ 0x3000;
loopsva 0:f97f410d4a21 266 } else {
loopsva 0:f97f410d4a21 267 n_rem = (n_rem << 1);
loopsva 0:f97f410d4a21 268 }
loopsva 0:f97f410d4a21 269 }
loopsva 0:f97f410d4a21 270 }
loopsva 9:6104e8cdb3ec 271 n_rem= ((n_rem >> 12) & 0x000F);
loopsva 9:6104e8cdb3ec 272 if(!(MStype == ms5611::MS5805)) {
loopsva 9:6104e8cdb3ec 273 n_prom[7]=crc_read;
loopsva 9:6104e8cdb3ec 274 }
loopsva 0:f97f410d4a21 275 return (n_rem ^ 0x0);
loopsva 2:05804ed70748 276 }
loopsva 2:05804ed70748 277
loopsva 0:f97f410d4a21 278 /*
loopsva 0:f97f410d4a21 279 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 280 Coefficient table below). It is thus important to clear those bytes from the calculation buffer before proceeding
loopsva 0:f97f410d4a21 281 with the CRC calculation itself:
loopsva 0:f97f410d4a21 282 n_prom[7]=(0xFF00 & (n_prom[7])); //CRC byte is replaced by 0
loopsva 0:f97f410d4a21 283 As a simple test of the CRC code, the following coefficient table could be used:
loopsva 0:f97f410d4a21 284 unsigned int nprom[] = {0x3132,0x3334,0x3536,0x3738,0x3940,0x4142,0x4344,0x4500};
loopsva 0:f97f410d4a21 285 the resulting calculated CRC should be 0xB.
loopsva 0:f97f410d4a21 286
loopsva 0:f97f410d4a21 287 DB 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
loopsva 0:f97f410d4a21 288 Addr
loopsva 0:f97f410d4a21 289 0 16 bit reserved for manufacturer
loopsva 0:f97f410d4a21 290 1 Coefficient 1 (16 bit unsigned)
loopsva 0:f97f410d4a21 291 2 Coefficient 2 (16 bit unsigned)
loopsva 0:f97f410d4a21 292 3 Coefficient 3 (16 bit unsigned)
loopsva 0:f97f410d4a21 293 4 Coefficient 4 (16 bit unsigned)
loopsva 0:f97f410d4a21 294 5 Coefficient 5 (16 bit unsigned)
loopsva 0:f97f410d4a21 295 6 Coefficient 6 (16 bit unsigned)
loopsva 0:f97f410d4a21 296 7 0 0 0 0 CRC(0x0)
loopsva 0:f97f410d4a21 297 */
loopsva 0:f97f410d4a21 298 /*
loopsva 0:f97f410d4a21 299 //Returns 0x0b as per AP520_004
loopsva 2:05804ed70748 300 C[0] = 0x3132;
loopsva 2:05804ed70748 301 C[1] = 0x3334;
loopsva 2:05804ed70748 302 C[2] = 0x3536;
loopsva 2:05804ed70748 303 C[3] = 0x3738;
loopsva 2:05804ed70748 304 C[4] = 0x3940;
loopsva 2:05804ed70748 305 C[5] = 0x4142;
loopsva 2:05804ed70748 306 C[6] = 0x4344;
loopsva 2:05804ed70748 307 C[7] = 0x4546;
loopsva 0:f97f410d4a21 308 n_crc = ms.crc4(C); // calculate the CRC
loopsva 0:f97f410d4a21 309 pc.printf("testing CRC: 0x%x\n", n_crc);
loopsva 0:f97f410d4a21 310 */
loopsva 2:05804ed70748 311
loopsva 0:f97f410d4a21 312 //********************************************************
loopsva 0:f97f410d4a21 313 //! @brief load all calibration coefficients
loopsva 0:f97f410d4a21 314 //!
loopsva 0:f97f410d4a21 315 //! @return none
loopsva 0:f97f410d4a21 316 //********************************************************
loopsva 0:f97f410d4a21 317
loopsva 0:f97f410d4a21 318 void ms5611::loadCoefs() {
loopsva 8:461f68bc94f2 319 //printf(" - ms5611 coeffs\r\n");
loopsva 0:f97f410d4a21 320 for (int i = 0; i < 8; i++){
loopsva 0:f97f410d4a21 321 wait_ms(50);
loopsva 2:05804ed70748 322 C[i] = cmd_prom(i);
loopsva 8:461f68bc94f2 323 //printf(" - C[%d] = 0x%04x\r\n", i, C[i]);
loopsva 0:f97f410d4a21 324 }
loopsva 2:05804ed70748 325 unsigned char n_crc = crc4(C);
loopsva 8:461f68bc94f2 326 //printf(" - crc = 0x%02x\r\n", n_crc);
loopsva 0:f97f410d4a21 327 }
loopsva 0:f97f410d4a21 328
loopsva 0:f97f410d4a21 329 //********************************************************
loopsva 0:f97f410d4a21 330 //! @brief calculate temperature and pressure
loopsva 0:f97f410d4a21 331 //!
loopsva 0:f97f410d4a21 332 //! @return none
loopsva 0:f97f410d4a21 333 //********************************************************
loopsva 0:f97f410d4a21 334
loopsva 0:f97f410d4a21 335 void ms5611::calcPT() {
loopsva 9:6104e8cdb3ec 336 int32_t D1 = 0;
loopsva 9:6104e8cdb3ec 337 int32_t D2 = 0;
loopsva 9:6104e8cdb3ec 338 if(MStype == ms5611::MS5805) {
loopsva 9:6104e8cdb3ec 339 D2 = cmd_adc(MS5611_CMD_ADC_D2 + MS5805_CMD_ADC_8192); // read D2
loopsva 9:6104e8cdb3ec 340 D1 = cmd_adc(MS5611_CMD_ADC_D1 + MS5805_CMD_ADC_8192); // read D1
loopsva 9:6104e8cdb3ec 341 } else {
loopsva 9:6104e8cdb3ec 342 D2 = cmd_adc(MS5611_CMD_ADC_D2 + MS5611_CMD_ADC_4096); // read D2
loopsva 9:6104e8cdb3ec 343 D1 = cmd_adc(MS5611_CMD_ADC_D1 + MS5611_CMD_ADC_4096); // read D1
loopsva 9:6104e8cdb3ec 344 }
loopsva 9:6104e8cdb3ec 345
loopsva 3:c2d1b0d432ad 346 int64_t dT = D2 - ((uint64_t)C[5] << 8);
loopsva 2:05804ed70748 347 int64_t OFF = ((uint32_t)C[2] << 16) + ((dT * (C[4]) >> 7)); //was OFF = (C[2] << 17) + dT * C[4] / (1 << 6);
loopsva 2:05804ed70748 348 int64_t SENS = ((uint32_t)C[1] << 15) + ((dT * (C[3]) >> 8)); //was SENS = (C[1] << 16) + dT * C[3] / (1 << 7);
loopsva 2:05804ed70748 349 T = (2000 + (((uint64_t)dT * C[6]) / (float)(1 << 23))) / 100;
loopsva 2:05804ed70748 350 int32_t TEMP = 2000 + (int64_t)dT * (int64_t)C[6] / (int64_t)(1 << 23);
loopsva 0:f97f410d4a21 351
loopsva 2:05804ed70748 352 if(TEMP < 2000) { // if temperature lower than 20 Celsius
loopsva 9:6104e8cdb3ec 353 float T1 = 0.0;
loopsva 9:6104e8cdb3ec 354 int64_t OFF1, SENS1 = 0;
loopsva 9:6104e8cdb3ec 355 if(MStype == ms5611::MS5805) {
loopsva 9:6104e8cdb3ec 356 T1 = 11 * ((dT * dT) >> 35);
loopsva 9:6104e8cdb3ec 357 OFF1 = 31 * ((TEMP - 2000) * (TEMP - 2000)) >> 3;
loopsva 9:6104e8cdb3ec 358 SENS1 = 63 * ((TEMP - 2000) * (TEMP - 2000)) >> 5;
loopsva 9:6104e8cdb3ec 359 } else {
loopsva 9:6104e8cdb3ec 360 T1 = (TEMP - 2000) * (TEMP - 2000);
loopsva 9:6104e8cdb3ec 361 OFF1 = (5 * T1) / 2;
loopsva 9:6104e8cdb3ec 362 SENS1 = (5 * T1) / 4;
loopsva 9:6104e8cdb3ec 363
loopsva 9:6104e8cdb3ec 364 if(TEMP < -1500) { // if temperature lower than -15 Celsius
loopsva 9:6104e8cdb3ec 365 T1 = (TEMP + 1500) * (TEMP + 1500);
loopsva 9:6104e8cdb3ec 366 OFF1 += 7 * T1;
loopsva 9:6104e8cdb3ec 367 SENS1 += 11 * T1 / 2;
loopsva 9:6104e8cdb3ec 368 }
loopsva 9:6104e8cdb3ec 369 }
loopsva 2:05804ed70748 370 OFF -= OFF1;
loopsva 2:05804ed70748 371 SENS -= SENS1;
loopsva 9:6104e8cdb3ec 372 T = ((double)TEMP - T1)/ 100.0;
loopsva 2:05804ed70748 373 }
loopsva 2:05804ed70748 374 // int64_t P1 = ((((int64_t)D1 * SENS) >> 21) - OFF) >> 15;
loopsva 2:05804ed70748 375 P = ((((int64_t)D1 * SENS ) >> 21) - OFF) / (double) (1 << 15) / 100.0;
loopsva 0:f97f410d4a21 376 }
loopsva 0:f97f410d4a21 377
loopsva 0:f97f410d4a21 378 //********************************************************
loopsva 0:f97f410d4a21 379 //! @brief calculate temperature
loopsva 0:f97f410d4a21 380 //!
loopsva 0:f97f410d4a21 381 //! @return double temperature degC
loopsva 0:f97f410d4a21 382 //********************************************************
loopsva 0:f97f410d4a21 383
loopsva 0:f97f410d4a21 384 double ms5611::calcTemp() {
loopsva 0:f97f410d4a21 385 calcPT();
loopsva 0:f97f410d4a21 386 return(T);
loopsva 0:f97f410d4a21 387 }
loopsva 0:f97f410d4a21 388
loopsva 0:f97f410d4a21 389 //********************************************************
loopsva 3:c2d1b0d432ad 390 //! @brief calculate pressure
loopsva 0:f97f410d4a21 391 //!
loopsva 0:f97f410d4a21 392 //! @return double barometric pressure millibar
loopsva 0:f97f410d4a21 393 //********************************************************
loopsva 0:f97f410d4a21 394
loopsva 0:f97f410d4a21 395 double ms5611::calcPressure() {
loopsva 0:f97f410d4a21 396 calcPT();
loopsva 0:f97f410d4a21 397 return(P);
loopsva 2:05804ed70748 398 }
loopsva 3:c2d1b0d432ad 399
loopsva 3:c2d1b0d432ad 400 //********************************************************
loopsva 3:c2d1b0d432ad 401 //! @brief get pressure, no calculation
loopsva 3:c2d1b0d432ad 402 //!
loopsva 3:c2d1b0d432ad 403 //! @return double barometric pressure millibar
loopsva 3:c2d1b0d432ad 404 //********************************************************
loopsva 3:c2d1b0d432ad 405
loopsva 3:c2d1b0d432ad 406 double ms5611::getPressure() {
loopsva 3:c2d1b0d432ad 407 calcPT();
loopsva 3:c2d1b0d432ad 408 return(P);
loopsva 3:c2d1b0d432ad 409 }
loopsva 3:c2d1b0d432ad 410
loopsva 3:c2d1b0d432ad 411 //********************************************************
loopsva 5:0d7b229474c6 412 //! @brief get altitude from known sea level barometer,
loopsva 5:0d7b229474c6 413 //! @ no pre-pressure calculation
loopsva 3:c2d1b0d432ad 414 //!
loopsva 3:c2d1b0d432ad 415 //! @enter float sea level barometer
loopsva 3:c2d1b0d432ad 416 //! @return float altitude in feet
loopsva 3:c2d1b0d432ad 417 //********************************************************
loopsva 3:c2d1b0d432ad 418
loopsva 3:c2d1b0d432ad 419 float ms5611::getAltitudeFT(float sea_pressure) {
loopsva 3:c2d1b0d432ad 420 A = (1 - (pow((P / (double)sea_pressure), 0.190284))) * 145366.45;
loopsva 3:c2d1b0d432ad 421 return((float)A);
loopsva 3:c2d1b0d432ad 422 }
loopsva 5:0d7b229474c6 423
loopsva 5:0d7b229474c6 424 //********************************************************
loopsva 5:0d7b229474c6 425 //! @brief get sea level pressure from known altitude(ft),
loopsva 5:0d7b229474c6 426 //! @ no pre-pressure calculation
loopsva 5:0d7b229474c6 427 //!
loopsva 5:0d7b229474c6 428 //! @enter float known altitude in feet
loopsva 5:0d7b229474c6 429 //! @return float seal level barometer in mb
loopsva 5:0d7b229474c6 430 //********************************************************
loopsva 5:0d7b229474c6 431
loopsva 5:0d7b229474c6 432 float ms5611::getSeaLevelBaroFT(float known_alt) {
loopsva 9:6104e8cdb3ec 433 S = pow(pow((P * MB_INHG_DOUBLE), 0.190284) + 0.00001313 * known_alt , 5.2553026) * INHG_MB_DOUBLE;
loopsva 5:0d7b229474c6 434 return((float)S);
loopsva 5:0d7b229474c6 435 }
loopsva 5:0d7b229474c6 436
loopsva 5:0d7b229474c6 437 //********************************************************
loopsva 5:0d7b229474c6 438 //! @brief get sea level pressure from known altitude(m),
loopsva 5:0d7b229474c6 439 //! @ no pre-pressure calculation
loopsva 5:0d7b229474c6 440 //!
loopsva 5:0d7b229474c6 441 //! @enter float known altitude in meters
loopsva 5:0d7b229474c6 442 //! @return float seal level barometer in mb
loopsva 5:0d7b229474c6 443 //********************************************************
loopsva 5:0d7b229474c6 444
loopsva 5:0d7b229474c6 445 float ms5611::getSeaLevelBaroM(float known_alt) {
loopsva 9:6104e8cdb3ec 446 S = pow(pow((P * MB_INHG_DOUBLE), 0.190284) + 0.00001313 * known_alt * FEET_METERS , 5.2553026) * INHG_MB_DOUBLE;
loopsva 5:0d7b229474c6 447 return((float)S);
loopsva 5:0d7b229474c6 448 }
loopsva 9:6104e8cdb3ec 449