Karim Azzouz / Mbed 2 deprecated A-Quad

Dependencies:   MovingAverageFilter MyI2C PID RC mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BMP085.cpp Source File

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 }