High resolution barometer and altimeter using i2c mode

Dependents:   mbed_5637_test Weather_Station_Ofiicial

Fork of ms5611 by Kevin Braun

Committer:
loopsva
Date:
Mon Jun 24 19:11:28 2013 +0000
Revision:
6:41c370fa1f7b
Parent:
5:0d7b229474c6
Updated .h documentation and added i2c frequency set in .cpp file.

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 0:f97f410d4a21 27 // Constructor and destructor
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 0:f97f410d4a21 31 }
loopsva 0:f97f410d4a21 32
loopsva 0:f97f410d4a21 33 //********************************************************
loopsva 0:f97f410d4a21 34 //! @brief send I2C start condition and the address byte
loopsva 0:f97f410d4a21 35 //!
loopsva 0:f97f410d4a21 36 //! @return 0
loopsva 0:f97f410d4a21 37 //********************************************************
loopsva 0:f97f410d4a21 38
loopsva 0:f97f410d4a21 39 int ms5611::m_i2c_start(bool readMode) {
loopsva 0:f97f410d4a21 40 int twst;
loopsva 0:f97f410d4a21 41 _i2c.start();
loopsva 0:f97f410d4a21 42 if(readMode == true) {
loopsva 0:f97f410d4a21 43 twst = m_i2c_write(MS5611_ADDR_R);
loopsva 0:f97f410d4a21 44 } else {
loopsva 0:f97f410d4a21 45 twst = m_i2c_write(MS5611_ADDR_W);
loopsva 0:f97f410d4a21 46 }
loopsva 0:f97f410d4a21 47 return(twst);
loopsva 0:f97f410d4a21 48 }
loopsva 0:f97f410d4a21 49
loopsva 0:f97f410d4a21 50 //********************************************************
loopsva 0:f97f410d4a21 51 //! @brief send I2C stop condition
loopsva 0:f97f410d4a21 52 //!
loopsva 0:f97f410d4a21 53 //! @return none
loopsva 0:f97f410d4a21 54 //********************************************************
loopsva 0:f97f410d4a21 55
loopsva 0:f97f410d4a21 56 void ms5611::m_i2c_stop(void) {
loopsva 0:f97f410d4a21 57 _i2c.stop();
loopsva 0:f97f410d4a21 58 }
loopsva 0:f97f410d4a21 59
loopsva 0:f97f410d4a21 60 //********************************************************
loopsva 0:f97f410d4a21 61 //! @brief send I2C stop condition
loopsva 0:f97f410d4a21 62 //!
loopsva 0:f97f410d4a21 63 //! @return remote ack status
loopsva 0:f97f410d4a21 64 //********************************************************
loopsva 0:f97f410d4a21 65
loopsva 0:f97f410d4a21 66 unsigned char ms5611::m_i2c_write(unsigned char data) {
loopsva 0:f97f410d4a21 67 int twst = _i2c.write(data);
loopsva 0:f97f410d4a21 68 return(twst);
loopsva 0:f97f410d4a21 69 }
loopsva 0:f97f410d4a21 70
loopsva 0:f97f410d4a21 71 //********************************************************
loopsva 0:f97f410d4a21 72 //! @brief read I2C byte with acknowledgment
loopsva 0:f97f410d4a21 73 //!
loopsva 0:f97f410d4a21 74 //! @return read byte
loopsva 0:f97f410d4a21 75 //********************************************************
loopsva 0:f97f410d4a21 76
loopsva 0:f97f410d4a21 77 unsigned char ms5611::m_i2c_readAck(void) {
loopsva 0:f97f410d4a21 78 int twst = _i2c.read(1);
loopsva 0:f97f410d4a21 79 return(twst);
loopsva 0:f97f410d4a21 80 }
loopsva 0:f97f410d4a21 81
loopsva 0:f97f410d4a21 82 //********************************************************
loopsva 0:f97f410d4a21 83 //! @brief read I2C byte without acknowledgment
loopsva 0:f97f410d4a21 84 //!
loopsva 0:f97f410d4a21 85 //! @return read byte
loopsva 0:f97f410d4a21 86 //********************************************************
loopsva 0:f97f410d4a21 87
loopsva 0:f97f410d4a21 88 unsigned char ms5611::m_i2c_readNak(void) {
loopsva 0:f97f410d4a21 89 int twst = _i2c.read(0);
loopsva 0:f97f410d4a21 90 return(twst);
loopsva 0:f97f410d4a21 91 }
loopsva 0:f97f410d4a21 92
loopsva 0:f97f410d4a21 93 //********************************************************
loopsva 0:f97f410d4a21 94 //! @brief send command using I2C hardware interface
loopsva 0:f97f410d4a21 95 //!
loopsva 0:f97f410d4a21 96 //! @return none
loopsva 0:f97f410d4a21 97 //********************************************************
loopsva 0:f97f410d4a21 98
loopsva 0:f97f410d4a21 99 void ms5611::m_i2c_send(char cmd) {
loopsva 0:f97f410d4a21 100 unsigned char ret;
loopsva 2:05804ed70748 101 ret = m_i2c_start(false);
loopsva 2:05804ed70748 102 if(!(ret)) {
loopsva 0:f97f410d4a21 103 m_i2c_stop();
loopsva 2:05804ed70748 104 } else {
loopsva 0:f97f410d4a21 105 ret = m_i2c_write(cmd);
loopsva 0:f97f410d4a21 106 m_i2c_stop();
loopsva 0:f97f410d4a21 107 }
loopsva 0:f97f410d4a21 108 }
loopsva 0:f97f410d4a21 109
loopsva 0:f97f410d4a21 110 //********************************************************
loopsva 0:f97f410d4a21 111 //! @brief send reset sequence
loopsva 0:f97f410d4a21 112 //!
loopsva 0:f97f410d4a21 113 //! @return none
loopsva 0:f97f410d4a21 114 //********************************************************
loopsva 0:f97f410d4a21 115
loopsva 0:f97f410d4a21 116 void ms5611::cmd_reset() {
loopsva 2:05804ed70748 117 m_i2c_send(MS5611_CMD_RESET);
loopsva 2:05804ed70748 118 wait_ms(4);
loopsva 0:f97f410d4a21 119 loadCoefs();
loopsva 0:f97f410d4a21 120 }
loopsva 0:f97f410d4a21 121
loopsva 0:f97f410d4a21 122 //********************************************************
loopsva 0:f97f410d4a21 123 //! @brief preform adc conversion
loopsva 0:f97f410d4a21 124 //!
loopsva 0:f97f410d4a21 125 //! @return 24bit result
loopsva 0:f97f410d4a21 126 //********************************************************
loopsva 0:f97f410d4a21 127
loopsva 0:f97f410d4a21 128 unsigned long ms5611::cmd_adc(char cmd) {
loopsva 0:f97f410d4a21 129 char cobuf[3];
loopsva 0:f97f410d4a21 130 cobuf[0] = 0;
loopsva 0:f97f410d4a21 131 cobuf[1] = 0;
loopsva 0:f97f410d4a21 132 cobuf[2] = 0;
loopsva 0:f97f410d4a21 133 unsigned int ret;
loopsva 0:f97f410d4a21 134 unsigned long temp = 0;
loopsva 2:05804ed70748 135 m_i2c_send(MS5611_CMD_ADC_CONV + cmd);
loopsva 2:05804ed70748 136 switch (cmd & 0x0f) {
loopsva 0:f97f410d4a21 137 case MS5611_CMD_ADC_256 : wait_us(900); break;
loopsva 0:f97f410d4a21 138 case MS5611_CMD_ADC_512 : wait_ms(3); break;
loopsva 0:f97f410d4a21 139 case MS5611_CMD_ADC_1024: wait_ms(4); break;
loopsva 0:f97f410d4a21 140 case MS5611_CMD_ADC_2048: wait_ms(6); break;
loopsva 0:f97f410d4a21 141 case MS5611_CMD_ADC_4096: wait_ms(10); break;
loopsva 0:f97f410d4a21 142 }
loopsva 0:f97f410d4a21 143 m_i2c_send(MS5611_CMD_ADC_READ);
loopsva 0:f97f410d4a21 144
loopsva 0:f97f410d4a21 145 ret = _i2c.read(MS5611_ADDR_R, cobuf, 3, false);
loopsva 0:f97f410d4a21 146 if(ret) printf("\n*** ms5611 ADC Read Error ");
loopsva 0:f97f410d4a21 147 temp = (cobuf[0] << 16) + (cobuf[1] << 8) + cobuf[2];
loopsva 0:f97f410d4a21 148 return temp;
loopsva 0:f97f410d4a21 149 }
loopsva 0:f97f410d4a21 150
loopsva 0:f97f410d4a21 151 //********************************************************
loopsva 0:f97f410d4a21 152 //! @brief Read calibration coefficients
loopsva 0:f97f410d4a21 153 //!
loopsva 0:f97f410d4a21 154 //! @return coefficient
loopsva 0:f97f410d4a21 155 //********************************************************
loopsva 0:f97f410d4a21 156
loopsva 0:f97f410d4a21 157 unsigned int ms5611::cmd_prom(char coef_num) {
loopsva 0:f97f410d4a21 158 char cobuf[2];
loopsva 0:f97f410d4a21 159 unsigned int ret;
loopsva 0:f97f410d4a21 160 unsigned int rC = 0;
loopsva 0:f97f410d4a21 161 cobuf[0] = 0;
loopsva 0:f97f410d4a21 162 cobuf[1] = 0;
loopsva 0:f97f410d4a21 163 m_i2c_send(MS5611_CMD_PROM_RD + coef_num * 2); // send PROM READ command
loopsva 0:f97f410d4a21 164 ret = _i2c.read(MS5611_ADDR_R, cobuf, 2, false);
loopsva 0:f97f410d4a21 165 if(ret) printf("\n*** ms5611 PROM Read Error ");
loopsva 0:f97f410d4a21 166 rC = cobuf[0] * 256 + cobuf[1];
loopsva 0:f97f410d4a21 167 return rC;
loopsva 0:f97f410d4a21 168 }
loopsva 0:f97f410d4a21 169
loopsva 0:f97f410d4a21 170 //********************************************************
loopsva 0:f97f410d4a21 171 //! @brief calculate the CRC code
loopsva 0:f97f410d4a21 172 //!
loopsva 0:f97f410d4a21 173 //! @return crc code
loopsva 0:f97f410d4a21 174 //********************************************************
loopsva 0:f97f410d4a21 175
loopsva 0:f97f410d4a21 176 unsigned char ms5611::crc4(unsigned int n_prom[]) {
loopsva 2:05804ed70748 177 unsigned int n_rem;
loopsva 2:05804ed70748 178 unsigned int crc_read;
loopsva 0:f97f410d4a21 179 unsigned char n_bit;
loopsva 0:f97f410d4a21 180 n_rem = 0x00;
loopsva 2:05804ed70748 181 crc_read = n_prom[7];
loopsva 2:05804ed70748 182 n_prom[7]=(0xFF00 & (n_prom[7]));
loopsva 2:05804ed70748 183 for (int cnt = 0; cnt < 16; cnt++) {
loopsva 0:f97f410d4a21 184 if (cnt%2 == 1) {
loopsva 0:f97f410d4a21 185 n_rem ^= (unsigned short) ((n_prom[cnt>>1]) & 0x00FF);
loopsva 0:f97f410d4a21 186 } else {
loopsva 0:f97f410d4a21 187 n_rem ^= (unsigned short) (n_prom[cnt>>1]>>8);
loopsva 0:f97f410d4a21 188 }
loopsva 0:f97f410d4a21 189 for (n_bit = 8; n_bit > 0; n_bit--) {
loopsva 0:f97f410d4a21 190 if (n_rem & (0x8000)) {
loopsva 0:f97f410d4a21 191 n_rem = (n_rem << 1) ^ 0x3000;
loopsva 0:f97f410d4a21 192 } else {
loopsva 0:f97f410d4a21 193 n_rem = (n_rem << 1);
loopsva 0:f97f410d4a21 194 }
loopsva 0:f97f410d4a21 195 }
loopsva 0:f97f410d4a21 196 }
loopsva 2:05804ed70748 197 n_rem= (0x000F & (n_rem >> 12));
loopsva 2:05804ed70748 198 n_prom[7]=crc_read;
loopsva 0:f97f410d4a21 199 return (n_rem ^ 0x0);
loopsva 2:05804ed70748 200 }
loopsva 2:05804ed70748 201
loopsva 0:f97f410d4a21 202 /*
loopsva 0:f97f410d4a21 203 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 204 Coefficient table below). It is thus important to clear those bytes from the calculation buffer before proceeding
loopsva 0:f97f410d4a21 205 with the CRC calculation itself:
loopsva 0:f97f410d4a21 206 n_prom[7]=(0xFF00 & (n_prom[7])); //CRC byte is replaced by 0
loopsva 0:f97f410d4a21 207 As a simple test of the CRC code, the following coefficient table could be used:
loopsva 0:f97f410d4a21 208 unsigned int nprom[] = {0x3132,0x3334,0x3536,0x3738,0x3940,0x4142,0x4344,0x4500};
loopsva 0:f97f410d4a21 209 the resulting calculated CRC should be 0xB.
loopsva 0:f97f410d4a21 210
loopsva 0:f97f410d4a21 211 DB 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
loopsva 0:f97f410d4a21 212 Addr
loopsva 0:f97f410d4a21 213 0 16 bit reserved for manufacturer
loopsva 0:f97f410d4a21 214 1 Coefficient 1 (16 bit unsigned)
loopsva 0:f97f410d4a21 215 2 Coefficient 2 (16 bit unsigned)
loopsva 0:f97f410d4a21 216 3 Coefficient 3 (16 bit unsigned)
loopsva 0:f97f410d4a21 217 4 Coefficient 4 (16 bit unsigned)
loopsva 0:f97f410d4a21 218 5 Coefficient 5 (16 bit unsigned)
loopsva 0:f97f410d4a21 219 6 Coefficient 6 (16 bit unsigned)
loopsva 0:f97f410d4a21 220 7 0 0 0 0 CRC(0x0)
loopsva 0:f97f410d4a21 221 */
loopsva 0:f97f410d4a21 222 /*
loopsva 0:f97f410d4a21 223 //Returns 0x0b as per AP520_004
loopsva 2:05804ed70748 224 C[0] = 0x3132;
loopsva 2:05804ed70748 225 C[1] = 0x3334;
loopsva 2:05804ed70748 226 C[2] = 0x3536;
loopsva 2:05804ed70748 227 C[3] = 0x3738;
loopsva 2:05804ed70748 228 C[4] = 0x3940;
loopsva 2:05804ed70748 229 C[5] = 0x4142;
loopsva 2:05804ed70748 230 C[6] = 0x4344;
loopsva 2:05804ed70748 231 C[7] = 0x4546;
loopsva 0:f97f410d4a21 232 n_crc = ms.crc4(C); // calculate the CRC
loopsva 0:f97f410d4a21 233 pc.printf("testing CRC: 0x%x\n", n_crc);
loopsva 0:f97f410d4a21 234 */
loopsva 2:05804ed70748 235
loopsva 0:f97f410d4a21 236 //********************************************************
loopsva 0:f97f410d4a21 237 //! @brief load all calibration coefficients
loopsva 0:f97f410d4a21 238 //!
loopsva 0:f97f410d4a21 239 //! @return none
loopsva 0:f97f410d4a21 240 //********************************************************
loopsva 0:f97f410d4a21 241
loopsva 0:f97f410d4a21 242 void ms5611::loadCoefs() {
loopsva 0:f97f410d4a21 243 for (int i = 0; i < 8; i++){
loopsva 0:f97f410d4a21 244 wait_ms(50);
loopsva 2:05804ed70748 245 C[i] = cmd_prom(i);
loopsva 0:f97f410d4a21 246 }
loopsva 2:05804ed70748 247 unsigned char n_crc = crc4(C);
loopsva 0:f97f410d4a21 248 }
loopsva 0:f97f410d4a21 249
loopsva 0:f97f410d4a21 250 //********************************************************
loopsva 0:f97f410d4a21 251 //! @brief calculate temperature and pressure
loopsva 0:f97f410d4a21 252 //!
loopsva 0:f97f410d4a21 253 //! @return none
loopsva 0:f97f410d4a21 254 //********************************************************
loopsva 0:f97f410d4a21 255
loopsva 0:f97f410d4a21 256 void ms5611::calcPT() {
loopsva 2:05804ed70748 257 int32_t D2 = cmd_adc(MS5611_CMD_ADC_D2 + MS5611_CMD_ADC_4096); // read D2
loopsva 2:05804ed70748 258 int32_t D1 = cmd_adc(MS5611_CMD_ADC_D1 + MS5611_CMD_ADC_4096); // read D1
loopsva 3:c2d1b0d432ad 259 int64_t dT = D2 - ((uint64_t)C[5] << 8);
loopsva 2:05804ed70748 260 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 261 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 262 T = (2000 + (((uint64_t)dT * C[6]) / (float)(1 << 23))) / 100;
loopsva 2:05804ed70748 263 int32_t TEMP = 2000 + (int64_t)dT * (int64_t)C[6] / (int64_t)(1 << 23);
loopsva 0:f97f410d4a21 264
loopsva 2:05804ed70748 265 if(TEMP < 2000) { // if temperature lower than 20 Celsius
loopsva 2:05804ed70748 266 float T1 = (TEMP - 2000) * (TEMP - 2000);
loopsva 2:05804ed70748 267 int64_t OFF1 = (5 * T1) / 2;
loopsva 2:05804ed70748 268 int64_t SENS1 = (5 * T1) / 4;
loopsva 2:05804ed70748 269
loopsva 2:05804ed70748 270 if(TEMP < -1500) { // if temperature lower than -15 Celsius
loopsva 2:05804ed70748 271 T1 = (TEMP + 1500) * (TEMP + 1500);
loopsva 2:05804ed70748 272 OFF1 += 7 * T1;
loopsva 2:05804ed70748 273 SENS1 += 11 * T1 / 2;
loopsva 2:05804ed70748 274 }
loopsva 2:05804ed70748 275 OFF -= OFF1;
loopsva 2:05804ed70748 276 SENS -= SENS1;
loopsva 2:05804ed70748 277 T = (float)TEMP / 100;
loopsva 2:05804ed70748 278 }
loopsva 2:05804ed70748 279 // int64_t P1 = ((((int64_t)D1 * SENS) >> 21) - OFF) >> 15;
loopsva 2:05804ed70748 280 P = ((((int64_t)D1 * SENS ) >> 21) - OFF) / (double) (1 << 15) / 100.0;
loopsva 0:f97f410d4a21 281 }
loopsva 0:f97f410d4a21 282
loopsva 0:f97f410d4a21 283 //********************************************************
loopsva 0:f97f410d4a21 284 //! @brief calculate temperature
loopsva 0:f97f410d4a21 285 //!
loopsva 0:f97f410d4a21 286 //! @return double temperature degC
loopsva 0:f97f410d4a21 287 //********************************************************
loopsva 0:f97f410d4a21 288
loopsva 0:f97f410d4a21 289 double ms5611::calcTemp() {
loopsva 0:f97f410d4a21 290 calcPT();
loopsva 0:f97f410d4a21 291 return(T);
loopsva 0:f97f410d4a21 292 }
loopsva 0:f97f410d4a21 293
loopsva 0:f97f410d4a21 294 //********************************************************
loopsva 3:c2d1b0d432ad 295 //! @brief calculate pressure
loopsva 0:f97f410d4a21 296 //!
loopsva 0:f97f410d4a21 297 //! @return double barometric pressure millibar
loopsva 0:f97f410d4a21 298 //********************************************************
loopsva 0:f97f410d4a21 299
loopsva 0:f97f410d4a21 300 double ms5611::calcPressure() {
loopsva 0:f97f410d4a21 301 calcPT();
loopsva 0:f97f410d4a21 302 return(P);
loopsva 2:05804ed70748 303 }
loopsva 3:c2d1b0d432ad 304
loopsva 3:c2d1b0d432ad 305 //********************************************************
loopsva 3:c2d1b0d432ad 306 //! @brief get pressure, no calculation
loopsva 3:c2d1b0d432ad 307 //!
loopsva 3:c2d1b0d432ad 308 //! @return double barometric pressure millibar
loopsva 3:c2d1b0d432ad 309 //********************************************************
loopsva 3:c2d1b0d432ad 310
loopsva 3:c2d1b0d432ad 311 double ms5611::getPressure() {
loopsva 3:c2d1b0d432ad 312 calcPT();
loopsva 3:c2d1b0d432ad 313 return(P);
loopsva 3:c2d1b0d432ad 314 }
loopsva 3:c2d1b0d432ad 315
loopsva 3:c2d1b0d432ad 316 //********************************************************
loopsva 5:0d7b229474c6 317 //! @brief get altitude from known sea level barometer,
loopsva 5:0d7b229474c6 318 //! @ no pre-pressure calculation
loopsva 3:c2d1b0d432ad 319 //!
loopsva 3:c2d1b0d432ad 320 //! @enter float sea level barometer
loopsva 3:c2d1b0d432ad 321 //! @return float altitude in feet
loopsva 3:c2d1b0d432ad 322 //********************************************************
loopsva 3:c2d1b0d432ad 323
loopsva 3:c2d1b0d432ad 324 float ms5611::getAltitudeFT(float sea_pressure) {
loopsva 3:c2d1b0d432ad 325 A = (1 - (pow((P / (double)sea_pressure), 0.190284))) * 145366.45;
loopsva 3:c2d1b0d432ad 326 return((float)A);
loopsva 3:c2d1b0d432ad 327 }
loopsva 5:0d7b229474c6 328
loopsva 5:0d7b229474c6 329 //********************************************************
loopsva 5:0d7b229474c6 330 //! @brief get sea level pressure from known altitude(ft),
loopsva 5:0d7b229474c6 331 //! @ no pre-pressure calculation
loopsva 5:0d7b229474c6 332 //!
loopsva 5:0d7b229474c6 333 //! @enter float known altitude in feet
loopsva 5:0d7b229474c6 334 //! @return float seal level barometer in mb
loopsva 5:0d7b229474c6 335 //********************************************************
loopsva 5:0d7b229474c6 336
loopsva 5:0d7b229474c6 337 float ms5611::getSeaLevelBaroFT(float known_alt) {
loopsva 5:0d7b229474c6 338 S = pow(pow((P * INHG), 0.190284) + 0.00001313 * known_alt , 5.2553026) * MB;
loopsva 5:0d7b229474c6 339 return((float)S);
loopsva 5:0d7b229474c6 340 }
loopsva 5:0d7b229474c6 341
loopsva 5:0d7b229474c6 342 //********************************************************
loopsva 5:0d7b229474c6 343 //! @brief get sea level pressure from known altitude(m),
loopsva 5:0d7b229474c6 344 //! @ no pre-pressure calculation
loopsva 5:0d7b229474c6 345 //!
loopsva 5:0d7b229474c6 346 //! @enter float known altitude in meters
loopsva 5:0d7b229474c6 347 //! @return float seal level barometer in mb
loopsva 5:0d7b229474c6 348 //********************************************************
loopsva 5:0d7b229474c6 349
loopsva 5:0d7b229474c6 350 float ms5611::getSeaLevelBaroM(float known_alt) {
loopsva 5:0d7b229474c6 351 S = pow(pow((P * INHG), 0.190284) + 0.00001313 * known_alt * FTMETERS , 5.2553026) * MB;
loopsva 5:0d7b229474c6 352 return((float)S);
loopsva 5:0d7b229474c6 353 }