Fixed Incorrect pressure readings for the barometer

Fork of MS5637 by chris stevens

Committer:
cam_eadie
Date:
Wed Jun 15 14:45:25 2016 +0000
Revision:
9:83b2554646f5
Parent:
8:3a9d37268ccd
Fixed incorrect pressure reading using some float convesions, cleaning up and simplifying code in calcPT()

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