Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Fri Jul 15 2022 18:48:42 by
1.7.2