Bosch BMP085 Barometric Pressure Sensor
bmp085.cpp@0:e8f53e502a4c, 2015-03-19 (annotated)
- Committer:
- timm
- Date:
- Thu Mar 19 03:46:13 2015 +0000
- Revision:
- 0:e8f53e502a4c
Bosch BMP085 I2C Driver
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
timm | 0:e8f53e502a4c | 1 | #include "mbed.h" |
timm | 0:e8f53e502a4c | 2 | #include "bmp085.h" |
timm | 0:e8f53e502a4c | 3 | |
timm | 0:e8f53e502a4c | 4 | BMP085::BMP085(PinName sclPin, PinName sdaPin) |
timm | 0:e8f53e502a4c | 5 | { |
timm | 0:e8f53e502a4c | 6 | i2c = new I2C(sdaPin, sclPin); |
timm | 0:e8f53e502a4c | 7 | i2c->frequency(1000); // run at 1KHz |
timm | 0:e8f53e502a4c | 8 | } |
timm | 0:e8f53e502a4c | 9 | |
timm | 0:e8f53e502a4c | 10 | long BMP085::getUT() { return UT; } |
timm | 0:e8f53e502a4c | 11 | long BMP085::getUP() { return UP; } |
timm | 0:e8f53e502a4c | 12 | void BMP085::init() { readCalData(); } |
timm | 0:e8f53e502a4c | 13 | |
timm | 0:e8f53e502a4c | 14 | void BMP085::readCalData() |
timm | 0:e8f53e502a4c | 15 | { |
timm | 0:e8f53e502a4c | 16 | char dataWrite[2]; |
timm | 0:e8f53e502a4c | 17 | char dataRead[2]; |
timm | 0:e8f53e502a4c | 18 | |
timm | 0:e8f53e502a4c | 19 | dataWrite[0] = CAL_DATA_AC1; |
timm | 0:e8f53e502a4c | 20 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 21 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 22 | AC1 = ((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 23 | |
timm | 0:e8f53e502a4c | 24 | dataWrite[0] = CAL_DATA_AC2; |
timm | 0:e8f53e502a4c | 25 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 26 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 27 | AC2 = ((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 28 | |
timm | 0:e8f53e502a4c | 29 | dataWrite[0] = CAL_DATA_AC3; |
timm | 0:e8f53e502a4c | 30 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 31 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 32 | AC3 = ((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 33 | |
timm | 0:e8f53e502a4c | 34 | dataWrite[0] = CAL_DATA_AC4; |
timm | 0:e8f53e502a4c | 35 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 36 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 37 | AC4 = ((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 38 | |
timm | 0:e8f53e502a4c | 39 | dataWrite[0] = CAL_DATA_AC5; |
timm | 0:e8f53e502a4c | 40 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 41 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 42 | AC5 = ((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 43 | |
timm | 0:e8f53e502a4c | 44 | dataWrite[0] = CAL_DATA_AC6; |
timm | 0:e8f53e502a4c | 45 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 46 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 47 | AC6 = ((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 48 | |
timm | 0:e8f53e502a4c | 49 | dataWrite[0] = CAL_DATA_B1; |
timm | 0:e8f53e502a4c | 50 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 51 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 52 | B1 = ((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 53 | |
timm | 0:e8f53e502a4c | 54 | dataWrite[0] = CAL_DATA_B2; |
timm | 0:e8f53e502a4c | 55 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 56 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 57 | B2 = ((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 58 | |
timm | 0:e8f53e502a4c | 59 | dataWrite[0] = CAL_DATA_MB; |
timm | 0:e8f53e502a4c | 60 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 61 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 62 | MB = ((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 63 | |
timm | 0:e8f53e502a4c | 64 | dataWrite[0] = CAL_DATA_MC; |
timm | 0:e8f53e502a4c | 65 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 66 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 67 | MC = ((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 68 | |
timm | 0:e8f53e502a4c | 69 | dataWrite[0] = CAL_DATA_MD; |
timm | 0:e8f53e502a4c | 70 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 71 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 72 | MD = ((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 73 | } |
timm | 0:e8f53e502a4c | 74 | |
timm | 0:e8f53e502a4c | 75 | void BMP085::readUncompTemp() |
timm | 0:e8f53e502a4c | 76 | { |
timm | 0:e8f53e502a4c | 77 | char dataWrite[2]; |
timm | 0:e8f53e502a4c | 78 | char dataRead[2]; |
timm | 0:e8f53e502a4c | 79 | |
timm | 0:e8f53e502a4c | 80 | dataWrite[0] = CTRL_REG_ADDR; |
timm | 0:e8f53e502a4c | 81 | dataWrite[1] = MEASURE_TEMP_CMD; |
timm | 0:e8f53e502a4c | 82 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 2, 0); // stop |
timm | 0:e8f53e502a4c | 83 | wait_ms(5); |
timm | 0:e8f53e502a4c | 84 | dataWrite[0] = DATA_REG_ADDR; |
timm | 0:e8f53e502a4c | 85 | dataWrite[1] = 0; |
timm | 0:e8f53e502a4c | 86 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 87 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); |
timm | 0:e8f53e502a4c | 88 | UT = (long)((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 89 | } |
timm | 0:e8f53e502a4c | 90 | |
timm | 0:e8f53e502a4c | 91 | void BMP085::readUncompPressure(int mode) |
timm | 0:e8f53e502a4c | 92 | { |
timm | 0:e8f53e502a4c | 93 | char dataWrite[2]; |
timm | 0:e8f53e502a4c | 94 | char dataRead[4]; |
timm | 0:e8f53e502a4c | 95 | |
timm | 0:e8f53e502a4c | 96 | dataWrite[0] = CTRL_REG_ADDR; |
timm | 0:e8f53e502a4c | 97 | dataWrite[1] = (MEASURE_PRES_CMD | ((((char)mode) & 0x3) << 6)); |
timm | 0:e8f53e502a4c | 98 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 2, 0); // stop |
timm | 0:e8f53e502a4c | 99 | wait_ms(10 * (mode + 1)); // TODO: ensure this is accurate, based on oss |
timm | 0:e8f53e502a4c | 100 | dataWrite[0] = DATA_REG_ADDR; |
timm | 0:e8f53e502a4c | 101 | dataWrite[1] = 0; |
timm | 0:e8f53e502a4c | 102 | i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop |
timm | 0:e8f53e502a4c | 103 | i2c->read(BMP085_I2C_ADDR_READ, dataRead, 3, 0); |
timm | 0:e8f53e502a4c | 104 | UP = (long)( ((dataRead[0] << 16) | (dataRead[1] << 8) | dataRead[0]) >> ( 8 - mode)); |
timm | 0:e8f53e502a4c | 105 | //UP = (long)((dataRead[0] << 8) | (dataRead[1])); |
timm | 0:e8f53e502a4c | 106 | } |
timm | 0:e8f53e502a4c | 107 | |
timm | 0:e8f53e502a4c | 108 | float BMP085::getTemperature() |
timm | 0:e8f53e502a4c | 109 | { |
timm | 0:e8f53e502a4c | 110 | readUncompTemp(); |
timm | 0:e8f53e502a4c | 111 | |
timm | 0:e8f53e502a4c | 112 | X1 = (((long)UT - (long)AC6)*(long)AC5) >> 15; |
timm | 0:e8f53e502a4c | 113 | X2= ((long)MC << 11)/(X1+ MD); |
timm | 0:e8f53e502a4c | 114 | B5 = X1 + X2; |
timm | 0:e8f53e502a4c | 115 | T = ((B5 + 8) >> 4); |
timm | 0:e8f53e502a4c | 116 | |
timm | 0:e8f53e502a4c | 117 | return (float)(T / 10.0); |
timm | 0:e8f53e502a4c | 118 | } |
timm | 0:e8f53e502a4c | 119 | |
timm | 0:e8f53e502a4c | 120 | float BMP085::getPressure(int oss) |
timm | 0:e8f53e502a4c | 121 | { |
timm | 0:e8f53e502a4c | 122 | readUncompPressure(oss); |
timm | 0:e8f53e502a4c | 123 | |
timm | 0:e8f53e502a4c | 124 | // Calculate B3 |
timm | 0:e8f53e502a4c | 125 | B6 = B5 - 4000; |
timm | 0:e8f53e502a4c | 126 | X1 = (B2 * ((B6 * B6)>>12)) >>11; |
timm | 0:e8f53e502a4c | 127 | X2 = (AC2 * B6)>>11; |
timm | 0:e8f53e502a4c | 128 | X3 = X1 + X2; |
timm | 0:e8f53e502a4c | 129 | B3 = (((((long)AC1) * 4 + X3) << oss) + 2) >> 2; |
timm | 0:e8f53e502a4c | 130 | |
timm | 0:e8f53e502a4c | 131 | // Calculate B4, B7, p |
timm | 0:e8f53e502a4c | 132 | X1 = (AC3 + B6) >> 13; |
timm | 0:e8f53e502a4c | 133 | X2 = (B1 * ((B6 * B6) >> 12)) >> 16; |
timm | 0:e8f53e502a4c | 134 | X3 = ((X1 + X2) + 2 ) >> 2; |
timm | 0:e8f53e502a4c | 135 | B4 = (AC4 * (unsigned long)(X3 + 32768)) >> 15; |
timm | 0:e8f53e502a4c | 136 | B7 = ((unsigned long)(UP - B3) * (50000 >> oss)); |
timm | 0:e8f53e502a4c | 137 | if (B7 < 0x80000000) { p = (B7 << 1) / B4; } |
timm | 0:e8f53e502a4c | 138 | else { p = (B7/B4) << 1; } |
timm | 0:e8f53e502a4c | 139 | |
timm | 0:e8f53e502a4c | 140 | X1 = (p >> 8) * (p >> 8); |
timm | 0:e8f53e502a4c | 141 | X1 = (X1 * 3038) >> 16; |
timm | 0:e8f53e502a4c | 142 | X2 = (-7357 * p) >> 16; |
timm | 0:e8f53e502a4c | 143 | p += ((X1 + X2 + 3791) >> 4); |
timm | 0:e8f53e502a4c | 144 | |
timm | 0:e8f53e502a4c | 145 | return (float)p; |
timm | 0:e8f53e502a4c | 146 | } |