BMP085 Digital, barometric pressure sensor. Manufacturer: Bosch Sensortec.

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?

UserRevisionLine numberNew 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 }