Tim M / BMP085
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers bmp085.cpp Source File

bmp085.cpp

00001 #include "mbed.h"
00002 #include "bmp085.h"
00003 
00004 BMP085::BMP085(PinName sclPin, PinName sdaPin)
00005 {
00006     i2c = new I2C(sdaPin, sclPin);
00007     i2c->frequency(1000); // run at 1KHz
00008 }
00009 
00010 long BMP085::getUT() { return UT; }
00011 long BMP085::getUP() { return UP; }
00012 void BMP085::init() { readCalData(); }
00013 
00014 void BMP085::readCalData()
00015 {
00016     char dataWrite[2];
00017     char dataRead[2];
00018 
00019     dataWrite[0] = CAL_DATA_AC1;   
00020     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00021     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00022     AC1 = ((dataRead[0] << 8) | (dataRead[1]));
00023 
00024     dataWrite[0] = CAL_DATA_AC2;
00025     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00026     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00027     AC2 = ((dataRead[0] << 8) | (dataRead[1]));
00028 
00029     dataWrite[0] = CAL_DATA_AC3;
00030     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00031     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00032     AC3 = ((dataRead[0] << 8) | (dataRead[1]));
00033 
00034     dataWrite[0] = CAL_DATA_AC4;   
00035     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00036     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00037     AC4 = ((dataRead[0] << 8) | (dataRead[1]));
00038 
00039     dataWrite[0] = CAL_DATA_AC5;
00040     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00041     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00042     AC5 = ((dataRead[0] << 8) | (dataRead[1]));
00043 
00044     dataWrite[0] = CAL_DATA_AC6;
00045     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00046     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00047     AC6 = ((dataRead[0] << 8) | (dataRead[1]));
00048 
00049     dataWrite[0] = CAL_DATA_B1;   
00050     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00051     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00052     B1 = ((dataRead[0] << 8) | (dataRead[1]));
00053 
00054     dataWrite[0] = CAL_DATA_B2;
00055     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00056     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00057     B2 = ((dataRead[0] << 8) | (dataRead[1]));
00058 
00059     dataWrite[0] = CAL_DATA_MB;   
00060     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00061     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00062     MB = ((dataRead[0] << 8) | (dataRead[1]));
00063 
00064     dataWrite[0] = CAL_DATA_MC;
00065     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00066     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00067     MC = ((dataRead[0] << 8) | (dataRead[1]));
00068 
00069     dataWrite[0] = CAL_DATA_MD;
00070     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00071     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00072     MD = ((dataRead[0] << 8) | (dataRead[1]));
00073 }
00074 
00075 void BMP085::readUncompTemp()
00076 {
00077     char dataWrite[2];
00078     char dataRead[2];
00079 
00080     dataWrite[0] = CTRL_REG_ADDR;
00081     dataWrite[1] = MEASURE_TEMP_CMD;
00082     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 2, 0); // stop
00083     wait_ms(5);
00084     dataWrite[0] = DATA_REG_ADDR;
00085     dataWrite[1] = 0;
00086     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00087     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0);
00088     UT = (long)((dataRead[0] << 8) | (dataRead[1]));
00089 }
00090 
00091 void BMP085::readUncompPressure(int mode)
00092 {
00093     char dataWrite[2];
00094     char dataRead[4];
00095 
00096     dataWrite[0] = CTRL_REG_ADDR;
00097     dataWrite[1] = (MEASURE_PRES_CMD | ((((char)mode) & 0x3) << 6));
00098     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 2, 0); // stop
00099     wait_ms(10 * (mode + 1)); // TODO: ensure this is accurate, based on oss
00100     dataWrite[0] = DATA_REG_ADDR;
00101     dataWrite[1] = 0;
00102     i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop
00103     i2c->read(BMP085_I2C_ADDR_READ, dataRead, 3, 0);
00104     UP = (long)( ((dataRead[0] << 16) | (dataRead[1] << 8) | dataRead[0]) >> ( 8 - mode));
00105     //UP = (long)((dataRead[0] << 8) | (dataRead[1]));
00106 }
00107   
00108 float BMP085::getTemperature()
00109 {
00110     readUncompTemp();
00111 
00112     X1 = (((long)UT - (long)AC6)*(long)AC5) >> 15;
00113     X2= ((long)MC << 11)/(X1+ MD);
00114     B5 = X1 + X2;
00115     T = ((B5 + 8) >> 4);
00116     
00117     return (float)(T / 10.0);
00118 }
00119 
00120 float BMP085::getPressure(int oss)
00121 {
00122     readUncompPressure(oss);
00123   
00124     // Calculate B3
00125     B6 = B5 - 4000;
00126     X1 = (B2 * ((B6 * B6)>>12)) >>11;
00127     X2 = (AC2 * B6)>>11;
00128     X3 = X1 + X2;
00129     B3 = (((((long)AC1) * 4 + X3) << oss) + 2) >> 2;
00130 
00131     // Calculate B4, B7, p
00132     X1 = (AC3 + B6) >> 13;
00133     X2 = (B1 * ((B6 * B6) >> 12)) >> 16;
00134     X3 = ((X1 + X2) + 2 ) >> 2;
00135     B4 = (AC4 * (unsigned long)(X3 + 32768)) >> 15;
00136     B7 = ((unsigned long)(UP - B3) * (50000 >> oss));
00137     if (B7 < 0x80000000) { p = (B7 << 1) / B4; }
00138     else { p = (B7/B4) << 1; }
00139     
00140     X1 = (p >> 8) * (p >> 8);
00141     X1 = (X1 * 3038) >> 16;
00142     X2 = (-7357 * p) >> 16;
00143     p += ((X1 + X2 + 3791) >> 4);
00144     
00145     return (float)p;
00146 }