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.
Dependencies: MovingAverageFilter MyI2C PID RC mbed-rtos mbed
BMP085.cpp
00001 #include "BMP085.h" 00002 00003 BMP085::BMP085(){} 00004 00005 void BMP085::write(char reg,char data){ 00006 00007 char tx[2]={reg,data}; 00008 00009 I2C0.blockwrite((BMP_ADDRESS << 1)&0xFE, tx, 2); 00010 00011 } 00012 00013 int16 BMP085::read (char reg){ 00014 00015 char tx = reg; 00016 char rx[2]; 00017 00018 I2C0.blockwrite((BMP_ADDRESS << 1)&0xFE, &tx, 1); 00019 00020 I2C0.blockread((BMP_ADDRESS << 1)|0x01, rx, 2); 00021 00022 int16 output = ((int16) rx[0] << 8) | ((int16) rx[1]); 00023 return output; 00024 } 00025 00026 uint8 BMP085::readInt (char reg){ 00027 00028 char tx = reg; 00029 char rx; 00030 00031 I2C0.blockwrite((BMP_ADDRESS << 1)&0xFE, &tx, 1); 00032 00033 I2C0.blockread((BMP_ADDRESS << 1)|0x01, &rx, 1); 00034 00035 return rx; 00036 } 00037 00038 // Get Calibration Values 00039 void BMP085::Calibrate(void){ 00040 00041 AC1 = read(0xAA); 00042 AC2 = read(0xAC); 00043 AC3 = read(0xAE); 00044 AC4 = read(0xB0); 00045 AC5 = read(0xB2); 00046 AC6 = read(0xB4); 00047 B1 = read(0xB6); 00048 B2 = read(0xB8); 00049 MB = read(0xBA); 00050 MC = read(0xBC); 00051 MD = read(0xBE); 00052 00053 } 00054 00055 //Uncompensated temperature takes 4.5ms to read, so we'll just send a read flag and read the data the next cycle since our control loop repeats every 5 ms 00056 00057 void BMP085::readUT_Flag(void){ 00058 00059 write(0xF4,0x2E); 00060 } 00061 00062 // reading uncompensated Pressure depends on our resolution setting, we'll select ultra high resolution setting so the delay will be 25.5ms (5 iterations); 00063 00064 void BMP085::readUP_Flag(void){ 00065 00066 write(0xF4,(0x34 + (OSS<<6))); 00067 } 00068 00069 uint16 BMP085::readUT(void){ 00070 00071 uint16 ut = (uint16)read(0xF6); 00072 00073 return ut; 00074 00075 } 00076 uint32 BMP085::readUP(void){ 00077 00078 uint32 up = (((uint32) readInt(0xF6) << 16) | ((uint32) readInt(0xF7) << 8) | (uint32) readInt(0xF8)) >> (8-OSS); 00079 00080 return up; 00081 } 00082 00083 int16 BMP085::read_Temperature(void){ 00084 00085 int32 X1,X2; 00086 00087 X1 = (((int32)readUT() - (int32)AC6)*(int32)AC5) >> 15; 00088 X2 = ((int32)MC << 11)/(X1 + MD); 00089 00090 B5 = X1+X2; 00091 00092 return ((B5 + 8)>>4); 00093 } 00094 00095 int32 BMP085::read_Pressure(void){ 00096 00097 int32 X1, X2, X3, B3, B6, p; 00098 uint32 B4, B7; 00099 00100 B6 = B5 - 4000; 00101 // Calculate B3 00102 X1 = (B2 * (B6 * B6)>>12)>>11; 00103 X2 = (AC2 * B6)>>11; 00104 X3 = X1 + X2; 00105 B3 = (((((int32)AC1)*4 + X3)<<OSS) + 2)>>2; 00106 00107 // Calculate B4 00108 X1 = (AC3 * B6)>>13; 00109 X2 = (B1 * ((B6 * B6)>>12))>>16; 00110 X3 = ((X1 + X2) + 2)>>2; 00111 B4 = (AC4 * (uint32)(X3 + 32768))>>15; 00112 00113 B7 = ((uint32)(readUP() - B3) * (50000>>OSS)); 00114 00115 if (B7 < (uint32)0x80000000) 00116 { 00117 p = (B7<<1)/B4; 00118 } 00119 else{ 00120 p = (B7/B4)<<1; 00121 } 00122 00123 X1 = (p>>8) * (p>>8); 00124 X1 = (X1 * 3038)>>16; 00125 X2 = (-7357 * p)>>16; 00126 p += (X1 + X2 + 3791)>>4; 00127 00128 return p; 00129 }
Generated on Mon Jul 18 2022 00:04:58 by
1.7.2