sdfghj

Committer:
hiltontnunay
Date:
Thu Apr 24 12:57:00 2014 +0000
Revision:
0:c8bcb12163ab
asdfghj

Who changed what in which revision?

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