BMP085 Digital, barometric pressure sensor. Manufacturer: Bosch Sensortec.
bmp085.cpp@0:904377b11e64, 2015-03-11 (annotated)
- Committer:
- Quincy31
- Date:
- Wed Mar 11 06:50:27 2015 +0000
- Revision:
- 0:904377b11e64
BMP085, digital, barometric pressure sensor.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Quincy31 | 0:904377b11e64 | 1 | #include "bmp085.h" |
Quincy31 | 0:904377b11e64 | 2 | #include "mbed.h" |
Quincy31 | 0:904377b11e64 | 3 | #include "math.h" |
Quincy31 | 0:904377b11e64 | 4 | |
Quincy31 | 0:904377b11e64 | 5 | #define BMP085_ADDR 0xee |
Quincy31 | 0:904377b11e64 | 6 | |
Quincy31 | 0:904377b11e64 | 7 | const float BMP085::p0 = 1013.25; |
Quincy31 | 0:904377b11e64 | 8 | float BMP085::altitude(float p) |
Quincy31 | 0:904377b11e64 | 9 | { |
Quincy31 | 0:904377b11e64 | 10 | return (float)(44330.0 * (1.0 - pow((double)p/p0, 1/5.255))); |
Quincy31 | 0:904377b11e64 | 11 | } |
Quincy31 | 0:904377b11e64 | 12 | |
Quincy31 | 0:904377b11e64 | 13 | BMP085::BMP085(PinName sda, PinName scl): m_i2c(sda, scl), |
Quincy31 | 0:904377b11e64 | 14 | m_addr(BMP085_ADDR), oss(0) |
Quincy31 | 0:904377b11e64 | 15 | { |
Quincy31 | 0:904377b11e64 | 16 | // calibration |
Quincy31 | 0:904377b11e64 | 17 | uint8_t bmp085_cali_regs[] = {0xAA,0xAC,0xAE,0xB0,0xB2,0xB4,0xB6,0xB8,0xBA,0xBC,0xBE,0}; |
Quincy31 | 0:904377b11e64 | 18 | uint8_t *ptr = bmp085_cali_regs; |
Quincy31 | 0:904377b11e64 | 19 | int16_t bmp085_value[11]={0}; |
Quincy31 | 0:904377b11e64 | 20 | int i = 0; |
Quincy31 | 0:904377b11e64 | 21 | uint8_t data[2]; |
Quincy31 | 0:904377b11e64 | 22 | |
Quincy31 | 0:904377b11e64 | 23 | while(*ptr) |
Quincy31 | 0:904377b11e64 | 24 | { |
Quincy31 | 0:904377b11e64 | 25 | readRegs(*ptr, data, 2); |
Quincy31 | 0:904377b11e64 | 26 | |
Quincy31 | 0:904377b11e64 | 27 | bmp085_value[i++] = (data[0] << 8) | data[1]; |
Quincy31 | 0:904377b11e64 | 28 | |
Quincy31 | 0:904377b11e64 | 29 | ptr++; |
Quincy31 | 0:904377b11e64 | 30 | } |
Quincy31 | 0:904377b11e64 | 31 | |
Quincy31 | 0:904377b11e64 | 32 | ac1 = bmp085_value[0]; |
Quincy31 | 0:904377b11e64 | 33 | ac2 = bmp085_value[1]; |
Quincy31 | 0:904377b11e64 | 34 | ac3 = bmp085_value[2]; |
Quincy31 | 0:904377b11e64 | 35 | ac4 = (uint16_t)bmp085_value[3]; |
Quincy31 | 0:904377b11e64 | 36 | ac5 = (uint16_t)bmp085_value[4]; |
Quincy31 | 0:904377b11e64 | 37 | ac6 = (uint16_t)bmp085_value[5]; |
Quincy31 | 0:904377b11e64 | 38 | b1 = bmp085_value[6]; |
Quincy31 | 0:904377b11e64 | 39 | b2 = bmp085_value[7]; |
Quincy31 | 0:904377b11e64 | 40 | mb = bmp085_value[8]; |
Quincy31 | 0:904377b11e64 | 41 | mc = bmp085_value[9]; |
Quincy31 | 0:904377b11e64 | 42 | md = bmp085_value[10]; |
Quincy31 | 0:904377b11e64 | 43 | |
Quincy31 | 0:904377b11e64 | 44 | /*printf("\tAC1 = %d\r\n", ac1); |
Quincy31 | 0:904377b11e64 | 45 | printf("\tAC2 = %d\r\n", ac2); |
Quincy31 | 0:904377b11e64 | 46 | printf("\tAC3 = %d\r\n", ac3); |
Quincy31 | 0:904377b11e64 | 47 | printf("\tAC4 = %d\r\n", ac4); |
Quincy31 | 0:904377b11e64 | 48 | printf("\tAC5 = %d\r\n", ac5); |
Quincy31 | 0:904377b11e64 | 49 | printf("\tAC6 = %d\r\n", ac6); |
Quincy31 | 0:904377b11e64 | 50 | printf("\tB1 = %d\r\n", b1); |
Quincy31 | 0:904377b11e64 | 51 | printf("\tB2 = %d\r\n", b2); |
Quincy31 | 0:904377b11e64 | 52 | printf("\tMB = %d\r\n", mb); |
Quincy31 | 0:904377b11e64 | 53 | printf("\tMC = %d\r\n", mc); |
Quincy31 | 0:904377b11e64 | 54 | printf("\tMD = %d\r\n", md); |
Quincy31 | 0:904377b11e64 | 55 | printf("------------------------\r\n");*/ |
Quincy31 | 0:904377b11e64 | 56 | } |
Quincy31 | 0:904377b11e64 | 57 | |
Quincy31 | 0:904377b11e64 | 58 | void BMP085::set_oversampling(int osrs) |
Quincy31 | 0:904377b11e64 | 59 | { |
Quincy31 | 0:904377b11e64 | 60 | if(osrs > 0 && osrs < 4) |
Quincy31 | 0:904377b11e64 | 61 | { |
Quincy31 | 0:904377b11e64 | 62 | oss = osrs; |
Quincy31 | 0:904377b11e64 | 63 | } |
Quincy31 | 0:904377b11e64 | 64 | } |
Quincy31 | 0:904377b11e64 | 65 | |
Quincy31 | 0:904377b11e64 | 66 | void BMP085::readRegs(int addr, uint8_t * data, int len) |
Quincy31 | 0:904377b11e64 | 67 | { |
Quincy31 | 0:904377b11e64 | 68 | char t[1] = {addr}; |
Quincy31 | 0:904377b11e64 | 69 | |
Quincy31 | 0:904377b11e64 | 70 | m_i2c.write(m_addr, t, 1, true); |
Quincy31 | 0:904377b11e64 | 71 | m_i2c.read(m_addr, (char *)data, len); |
Quincy31 | 0:904377b11e64 | 72 | } |
Quincy31 | 0:904377b11e64 | 73 | |
Quincy31 | 0:904377b11e64 | 74 | void BMP085::writeRegs(uint8_t * data, int len) |
Quincy31 | 0:904377b11e64 | 75 | { |
Quincy31 | 0:904377b11e64 | 76 | m_i2c.write(m_addr, (char *)data, len); |
Quincy31 | 0:904377b11e64 | 77 | } |
Quincy31 | 0:904377b11e64 | 78 | |
Quincy31 | 0:904377b11e64 | 79 | int32_t BMP085::read_temp(void) |
Quincy31 | 0:904377b11e64 | 80 | { |
Quincy31 | 0:904377b11e64 | 81 | uint8_t data[2] = {0xf4, 0x2e}; |
Quincy31 | 0:904377b11e64 | 82 | |
Quincy31 | 0:904377b11e64 | 83 | // write 0x2e into reg 0xf4 |
Quincy31 | 0:904377b11e64 | 84 | writeRegs(data, 2); |
Quincy31 | 0:904377b11e64 | 85 | |
Quincy31 | 0:904377b11e64 | 86 | // wait 4.5ms |
Quincy31 | 0:904377b11e64 | 87 | wait_us(4500); |
Quincy31 | 0:904377b11e64 | 88 | |
Quincy31 | 0:904377b11e64 | 89 | // read reg 0xf6(MSB), 0xf7(LSB) |
Quincy31 | 0:904377b11e64 | 90 | readRegs(0xf6, data, 2); |
Quincy31 | 0:904377b11e64 | 91 | |
Quincy31 | 0:904377b11e64 | 92 | // UT = (MSB << 8) + LSB |
Quincy31 | 0:904377b11e64 | 93 | return (data[0] << 8) | data[1]; |
Quincy31 | 0:904377b11e64 | 94 | } |
Quincy31 | 0:904377b11e64 | 95 | |
Quincy31 | 0:904377b11e64 | 96 | int32_t BMP085::read_pressure(void) |
Quincy31 | 0:904377b11e64 | 97 | { |
Quincy31 | 0:904377b11e64 | 98 | static int delay_ms[] = {4500, 7500, 13500, 25500}; |
Quincy31 | 0:904377b11e64 | 99 | |
Quincy31 | 0:904377b11e64 | 100 | uint8_t data[3] = {0}; |
Quincy31 | 0:904377b11e64 | 101 | |
Quincy31 | 0:904377b11e64 | 102 | // write 0x34+(oss << 6) into reg 0xf4 |
Quincy31 | 0:904377b11e64 | 103 | data[0] = 0xf4; |
Quincy31 | 0:904377b11e64 | 104 | data[1] = 0x34 + (oss << 6); |
Quincy31 | 0:904377b11e64 | 105 | writeRegs(data, 2); |
Quincy31 | 0:904377b11e64 | 106 | |
Quincy31 | 0:904377b11e64 | 107 | // wait |
Quincy31 | 0:904377b11e64 | 108 | wait_us(delay_ms[oss]); |
Quincy31 | 0:904377b11e64 | 109 | |
Quincy31 | 0:904377b11e64 | 110 | // read reg 0xf6(MSB), 0xf7(LSB), 0xf8(XLSB) |
Quincy31 | 0:904377b11e64 | 111 | readRegs(0xf6, data, 3); |
Quincy31 | 0:904377b11e64 | 112 | |
Quincy31 | 0:904377b11e64 | 113 | // UP = ((MSB << 16) + (LSB << 8) + XLSB) >> (8-oss) |
Quincy31 | 0:904377b11e64 | 114 | return ((data[0] << 16) | (data[1] << 8) | data[2]) >> (8-oss); |
Quincy31 | 0:904377b11e64 | 115 | } |
Quincy31 | 0:904377b11e64 | 116 | |
Quincy31 | 0:904377b11e64 | 117 | void BMP085::read(int32_t * temperature, int32_t * pressure) |
Quincy31 | 0:904377b11e64 | 118 | { |
Quincy31 | 0:904377b11e64 | 119 | int32_t ut, up; |
Quincy31 | 0:904377b11e64 | 120 | int32_t x1, x2, b5, b6, x3, b3, p; |
Quincy31 | 0:904377b11e64 | 121 | uint32_t b4, b7; |
Quincy31 | 0:904377b11e64 | 122 | |
Quincy31 | 0:904377b11e64 | 123 | ut = read_temp(); |
Quincy31 | 0:904377b11e64 | 124 | up = read_pressure(); |
Quincy31 | 0:904377b11e64 | 125 | |
Quincy31 | 0:904377b11e64 | 126 | x1 = ((int32_t)ut - ac6) * ac5 >> 15; |
Quincy31 | 0:904377b11e64 | 127 | x2 = ((int32_t) mc << 11) / (x1 + md); |
Quincy31 | 0:904377b11e64 | 128 | b5 = x1 + x2; |
Quincy31 | 0:904377b11e64 | 129 | *temperature = (b5 + 8) >> 4; |
Quincy31 | 0:904377b11e64 | 130 | |
Quincy31 | 0:904377b11e64 | 131 | b6 = b5 - 4000; |
Quincy31 | 0:904377b11e64 | 132 | x1 = (b2 * (b6 * b6 >> 12)) >> 11; |
Quincy31 | 0:904377b11e64 | 133 | x2 = ac2 * b6 >> 11; |
Quincy31 | 0:904377b11e64 | 134 | x3 = x1 + x2; |
Quincy31 | 0:904377b11e64 | 135 | b3 = (((int32_t) ac1 * 4 + x3) + 2)/4; |
Quincy31 | 0:904377b11e64 | 136 | x1 = ac3 * b6 >> 13; |
Quincy31 | 0:904377b11e64 | 137 | x2 = (b1 * (b6 * b6 >> 12)) >> 16; |
Quincy31 | 0:904377b11e64 | 138 | x3 = ((x1 + x2) + 2) >> 2; |
Quincy31 | 0:904377b11e64 | 139 | b4 = (ac4 * (unsigned int32_t) (x3 + 32768)) >> 15; |
Quincy31 | 0:904377b11e64 | 140 | b7 = ((unsigned int32_t) up - b3) * (50000 >> oss); |
Quincy31 | 0:904377b11e64 | 141 | p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2; |
Quincy31 | 0:904377b11e64 | 142 | x1 = (p >> 8) * (p >> 8); |
Quincy31 | 0:904377b11e64 | 143 | x1 = (x1 * 3038) >> 16; |
Quincy31 | 0:904377b11e64 | 144 | x2 = (-7357 * p) >> 16; |
Quincy31 | 0:904377b11e64 | 145 | *pressure = p + ((x1 + x2 + 3791) >> 4); |
Quincy31 | 0:904377b11e64 | 146 | } |