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 MS5637 by
ms5637.cpp@8:3a9d37268ccd, 2014-05-20 (annotated)
- Committer:
- cstevens
- Date:
- Tue May 20 16:18:00 2014 +0000
- Revision:
- 8:3a9d37268ccd
- Parent:
- ms5561.cpp@7:2e8bc98f3dda
- Child:
- 9:83b2554646f5
adjusted for address but calibration not completed
Who changed what in which revision?
User | Revision | Line number | New 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" |
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 | |
cstevens | 8:3a9d37268ccd | 29 | ms5637::ms5637(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 | |
cstevens | 8:3a9d37268ccd | 39 | int ms5637::m_i2c_start(bool readMode) { |
loopsva | 0:f97f410d4a21 | 40 | int twst; |
loopsva | 0:f97f410d4a21 | 41 | _i2c.start(); |
loopsva | 0:f97f410d4a21 | 42 | if(readMode == true) { |
cstevens | 8:3a9d37268ccd | 43 | twst = m_i2c_write(MS5637_ADDR_R); |
loopsva | 0:f97f410d4a21 | 44 | } else { |
cstevens | 8:3a9d37268ccd | 45 | twst = m_i2c_write(MS5637_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 | |
cstevens | 8:3a9d37268ccd | 56 | void ms5637::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 | |
cstevens | 8:3a9d37268ccd | 66 | unsigned char ms5637::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 | |
cstevens | 8:3a9d37268ccd | 77 | unsigned char ms5637::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 | |
cstevens | 8:3a9d37268ccd | 88 | unsigned char ms5637::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 | |
cstevens | 8:3a9d37268ccd | 99 | void ms5637::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 | |
cstevens | 8:3a9d37268ccd | 116 | void ms5637::cmd_reset() { |
cstevens | 8:3a9d37268ccd | 117 | m_i2c_send(MS5637_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 | |
cstevens | 8:3a9d37268ccd | 128 | unsigned long ms5637::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; |
cstevens | 8:3a9d37268ccd | 135 | m_i2c_send(MS5637_CMD_ADC_CONV + cmd); |
loopsva | 2:05804ed70748 | 136 | switch (cmd & 0x0f) { |
cstevens | 8:3a9d37268ccd | 137 | case MS5637_CMD_ADC_256 : wait_us(900); break; |
cstevens | 8:3a9d37268ccd | 138 | case MS5637_CMD_ADC_512 : wait_ms(3); break; |
cstevens | 8:3a9d37268ccd | 139 | case MS5637_CMD_ADC_1024: wait_ms(4); break; |
cstevens | 8:3a9d37268ccd | 140 | case MS5637_CMD_ADC_2048: wait_ms(6); break; |
cstevens | 8:3a9d37268ccd | 141 | case MS5637_CMD_ADC_4096: wait_ms(10); break; |
loopsva | 0:f97f410d4a21 | 142 | } |
cstevens | 8:3a9d37268ccd | 143 | m_i2c_send(MS5637_CMD_ADC_READ); |
loopsva | 0:f97f410d4a21 | 144 | |
cstevens | 8:3a9d37268ccd | 145 | ret = _i2c.read(MS5637_ADDR_R, cobuf, 3, false); |
cstevens | 8:3a9d37268ccd | 146 | if(ret) printf("\n*** ms5637 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 | |
cstevens | 8:3a9d37268ccd | 157 | unsigned int ms5637::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; |
cstevens | 8:3a9d37268ccd | 163 | m_i2c_send(MS5637_CMD_PROM_RD + coef_num * 2); // send PROM READ command |
cstevens | 8:3a9d37268ccd | 164 | ret = _i2c.read(MS5637_ADDR_R, cobuf, 2, false); |
cstevens | 8:3a9d37268ccd | 165 | if(ret) printf("\n*** ms5637 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 | |
cstevens | 8:3a9d37268ccd | 176 | unsigned char ms5637::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 | |
cstevens | 8:3a9d37268ccd | 242 | void ms5637::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 | |
cstevens | 8:3a9d37268ccd | 256 | void ms5637::calcPT() { |
cstevens | 8:3a9d37268ccd | 257 | int32_t D2 = cmd_adc(MS5637_CMD_ADC_D2 + MS5637_CMD_ADC_4096); // read D2 |
cstevens | 8:3a9d37268ccd | 258 | int32_t D1 = cmd_adc(MS5637_CMD_ADC_D1 + MS5637_CMD_ADC_4096); // read D1 |
loopsva | 3:c2d1b0d432ad | 259 | int64_t dT = D2 - ((uint64_t)C[5] << 8); |
cstevens | 7:2e8bc98f3dda | 260 | int64_t OFF = ((uint32_t)C[2] << 17) + ((dT * (C[4]) >> 6)); //was OFF = (C[2] << 17) + dT * C[4] / (1 << 6); |
cstevens | 7:2e8bc98f3dda | 261 | int64_t SENS = ((uint32_t)C[1] << 16) + ((dT * (C[3]) >> 7)); //was SENS = (C[1] << 16) + dT * C[3] / (1 << 7); |
cstevens | 7:2e8bc98f3dda | 262 | //T = (2000 + (((uint64_t)dT * C[6]) / (float)(1 << 23))) / 100; |
cstevens | 7:2e8bc98f3dda | 263 | T=(2000+(dT*C[6])/8388608)/100; |
cstevens | 7:2e8bc98f3dda | 264 | //int32_t TEMP = 2000 + (int64_t)dT * (int64_t)C[6] / (int64_t)(1 << 23); |
cstevens | 7:2e8bc98f3dda | 265 | int32_t TEMP = 2000 + (int64_t)dT * (int64_t)(C[6] >> 23); |
loopsva | 2:05804ed70748 | 266 | if(TEMP < 2000) { // if temperature lower than 20 Celsius |
loopsva | 2:05804ed70748 | 267 | float T1 = (TEMP - 2000) * (TEMP - 2000); |
cstevens | 7:2e8bc98f3dda | 268 | int64_t OFF1 = (61 * T1) / 16; |
cstevens | 7:2e8bc98f3dda | 269 | int64_t SENS1 = (29 * T1) / 16; |
loopsva | 2:05804ed70748 | 270 | |
loopsva | 2:05804ed70748 | 271 | if(TEMP < -1500) { // if temperature lower than -15 Celsius |
loopsva | 2:05804ed70748 | 272 | T1 = (TEMP + 1500) * (TEMP + 1500); |
cstevens | 7:2e8bc98f3dda | 273 | OFF1 += 17 * T1; |
cstevens | 7:2e8bc98f3dda | 274 | SENS1 += 9 * T1 ; |
loopsva | 2:05804ed70748 | 275 | } |
loopsva | 2:05804ed70748 | 276 | OFF -= OFF1; |
loopsva | 2:05804ed70748 | 277 | SENS -= SENS1; |
loopsva | 2:05804ed70748 | 278 | T = (float)TEMP / 100; |
loopsva | 2:05804ed70748 | 279 | } |
loopsva | 2:05804ed70748 | 280 | // int64_t P1 = ((((int64_t)D1 * SENS) >> 21) - OFF) >> 15; |
cstevens | 7:2e8bc98f3dda | 281 | //P = ((((int64_t)D1 * SENS ) >> 21) - OFF) / (double) (1 << 15) / 100.0; |
cstevens | 7:2e8bc98f3dda | 282 | P=(D1*SENS/2097152-OFF)/3276800; |
loopsva | 0:f97f410d4a21 | 283 | } |
loopsva | 0:f97f410d4a21 | 284 | |
loopsva | 0:f97f410d4a21 | 285 | //******************************************************** |
loopsva | 0:f97f410d4a21 | 286 | //! @brief calculate temperature |
loopsva | 0:f97f410d4a21 | 287 | //! |
loopsva | 0:f97f410d4a21 | 288 | //! @return double temperature degC |
loopsva | 0:f97f410d4a21 | 289 | //******************************************************** |
loopsva | 0:f97f410d4a21 | 290 | |
cstevens | 8:3a9d37268ccd | 291 | double ms5637::calcTemp() { |
loopsva | 0:f97f410d4a21 | 292 | calcPT(); |
loopsva | 0:f97f410d4a21 | 293 | return(T); |
loopsva | 0:f97f410d4a21 | 294 | } |
loopsva | 0:f97f410d4a21 | 295 | |
loopsva | 0:f97f410d4a21 | 296 | //******************************************************** |
loopsva | 3:c2d1b0d432ad | 297 | //! @brief calculate pressure |
loopsva | 0:f97f410d4a21 | 298 | //! |
loopsva | 0:f97f410d4a21 | 299 | //! @return double barometric pressure millibar |
loopsva | 0:f97f410d4a21 | 300 | //******************************************************** |
loopsva | 0:f97f410d4a21 | 301 | |
cstevens | 8:3a9d37268ccd | 302 | double ms5637::calcPressure() { |
loopsva | 0:f97f410d4a21 | 303 | calcPT(); |
loopsva | 0:f97f410d4a21 | 304 | return(P); |
loopsva | 2:05804ed70748 | 305 | } |
loopsva | 3:c2d1b0d432ad | 306 | |
loopsva | 3:c2d1b0d432ad | 307 | //******************************************************** |
loopsva | 3:c2d1b0d432ad | 308 | //! @brief get pressure, no calculation |
loopsva | 3:c2d1b0d432ad | 309 | //! |
loopsva | 3:c2d1b0d432ad | 310 | //! @return double barometric pressure millibar |
loopsva | 3:c2d1b0d432ad | 311 | //******************************************************** |
loopsva | 3:c2d1b0d432ad | 312 | |
cstevens | 8:3a9d37268ccd | 313 | double ms5637::getPressure() { |
loopsva | 3:c2d1b0d432ad | 314 | calcPT(); |
loopsva | 3:c2d1b0d432ad | 315 | return(P); |
loopsva | 3:c2d1b0d432ad | 316 | } |
loopsva | 3:c2d1b0d432ad | 317 | |
loopsva | 3:c2d1b0d432ad | 318 | //******************************************************** |
loopsva | 5:0d7b229474c6 | 319 | //! @brief get altitude from known sea level barometer, |
loopsva | 5:0d7b229474c6 | 320 | //! @ no pre-pressure calculation |
loopsva | 3:c2d1b0d432ad | 321 | //! |
loopsva | 3:c2d1b0d432ad | 322 | //! @enter float sea level barometer |
loopsva | 3:c2d1b0d432ad | 323 | //! @return float altitude in feet |
loopsva | 3:c2d1b0d432ad | 324 | //******************************************************** |
loopsva | 3:c2d1b0d432ad | 325 | |
cstevens | 8:3a9d37268ccd | 326 | float ms5637::getAltitudeFT(float sea_pressure) { |
loopsva | 3:c2d1b0d432ad | 327 | A = (1 - (pow((P / (double)sea_pressure), 0.190284))) * 145366.45; |
loopsva | 3:c2d1b0d432ad | 328 | return((float)A); |
loopsva | 3:c2d1b0d432ad | 329 | } |
loopsva | 5:0d7b229474c6 | 330 | |
loopsva | 5:0d7b229474c6 | 331 | //******************************************************** |
loopsva | 5:0d7b229474c6 | 332 | //! @brief get sea level pressure from known altitude(ft), |
loopsva | 5:0d7b229474c6 | 333 | //! @ no pre-pressure calculation |
loopsva | 5:0d7b229474c6 | 334 | //! |
loopsva | 5:0d7b229474c6 | 335 | //! @enter float known altitude in feet |
loopsva | 5:0d7b229474c6 | 336 | //! @return float seal level barometer in mb |
loopsva | 5:0d7b229474c6 | 337 | //******************************************************** |
loopsva | 5:0d7b229474c6 | 338 | |
cstevens | 8:3a9d37268ccd | 339 | float ms5637::getSeaLevelBaroFT(float known_alt) { |
loopsva | 5:0d7b229474c6 | 340 | S = pow(pow((P * INHG), 0.190284) + 0.00001313 * known_alt , 5.2553026) * MB; |
loopsva | 5:0d7b229474c6 | 341 | return((float)S); |
loopsva | 5:0d7b229474c6 | 342 | } |
loopsva | 5:0d7b229474c6 | 343 | |
loopsva | 5:0d7b229474c6 | 344 | //******************************************************** |
loopsva | 5:0d7b229474c6 | 345 | //! @brief get sea level pressure from known altitude(m), |
loopsva | 5:0d7b229474c6 | 346 | //! @ no pre-pressure calculation |
loopsva | 5:0d7b229474c6 | 347 | //! |
loopsva | 5:0d7b229474c6 | 348 | //! @enter float known altitude in meters |
loopsva | 5:0d7b229474c6 | 349 | //! @return float seal level barometer in mb |
loopsva | 5:0d7b229474c6 | 350 | //******************************************************** |
loopsva | 5:0d7b229474c6 | 351 | |
cstevens | 8:3a9d37268ccd | 352 | float ms5637::getSeaLevelBaroM(float known_alt) { |
loopsva | 5:0d7b229474c6 | 353 | S = pow(pow((P * INHG), 0.190284) + 0.00001313 * known_alt * FTMETERS , 5.2553026) * MB; |
loopsva | 5:0d7b229474c6 | 354 | return((float)S); |
loopsva | 5:0d7b229474c6 | 355 | } |