Bosch BMP085 Barometric Pressure Sensor

Committer:
timm
Date:
Thu Mar 19 03:46:13 2015 +0000
Revision:
0:e8f53e502a4c
Bosch BMP085 I2C Driver

Who changed what in which revision?

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