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
ms5611.cpp@6:41c370fa1f7b, 2013-06-24 (annotated)
- 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?
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" |
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 | } |