Matthias Grob / Mbed 2 deprecated FlyBed2

Dependencies:   mbed

Dependents:   fluy343

Committer:
maetugr
Date:
Mon Sep 02 15:04:22 2013 +0000
Revision:
0:12950aa67f2a
first commit of new version (only one axis for test until now); note: no more Ticker! (made problems because of interrupts)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maetugr 0:12950aa67f2a 1 #include "BMP085.h"
maetugr 0:12950aa67f2a 2
maetugr 0:12950aa67f2a 3 BMP085::BMP085(PinName sda, PinName scl) : I2C_Sensor(sda, scl, BMP085_I2C_ADDRESS) {
maetugr 0:12950aa67f2a 4 // read calibration data from E2PROM, needed for formulas in read function
maetugr 0:12950aa67f2a 5 char buffer[22]; // 8-Bit pieces of axis data
maetugr 0:12950aa67f2a 6 readMultiRegister(BMP085_CAL_AC1, buffer, 22); // read all calibration registers in one time 22 Byte = 176 Bit
maetugr 0:12950aa67f2a 7
maetugr 0:12950aa67f2a 8 AC1 = (short) (buffer[0] << 8 | buffer[1]); // join 8-Bit pieces to 16-bit short integers
maetugr 0:12950aa67f2a 9 AC2 = (short) (buffer[2] << 8 | buffer[3]);
maetugr 0:12950aa67f2a 10 AC3 = (short) (buffer[4] << 8 | buffer[5]);
maetugr 0:12950aa67f2a 11 AC4 = (unsigned short) (buffer[6] << 8 | buffer[7]); // unsigned !!
maetugr 0:12950aa67f2a 12 AC5 = (unsigned short) (buffer[8] << 8 | buffer[9]);
maetugr 0:12950aa67f2a 13 AC6 = (unsigned short) (buffer[10] << 8 | buffer[11]);
maetugr 0:12950aa67f2a 14 B1 = (short) (buffer[12] << 8 | buffer[13]);
maetugr 0:12950aa67f2a 15 B2 = (short) (buffer[14] << 8 | buffer[15]);
maetugr 0:12950aa67f2a 16 MB = (short) (buffer[16] << 8 | buffer[17]);
maetugr 0:12950aa67f2a 17 MC = (short) (buffer[18] << 8 | buffer[19]);
maetugr 0:12950aa67f2a 18 MD = (short) (buffer[20] << 8 | buffer[21]);
maetugr 0:12950aa67f2a 19
maetugr 0:12950aa67f2a 20
maetugr 0:12950aa67f2a 21 oss = 0; // set Oversampling of Sensor
maetugr 0:12950aa67f2a 22 }
maetugr 0:12950aa67f2a 23
maetugr 0:12950aa67f2a 24 void BMP085::readraw() {
maetugr 0:12950aa67f2a 25 }
maetugr 0:12950aa67f2a 26
maetugr 0:12950aa67f2a 27 void BMP085::read() {
maetugr 0:12950aa67f2a 28 unsigned short Uncompensated_Temperature;
maetugr 0:12950aa67f2a 29 long P, Uncompensated_Pressure, X1, X2, X3, B3, B5, B6;
maetugr 0:12950aa67f2a 30 unsigned long B4, B7;
maetugr 0:12950aa67f2a 31
maetugr 0:12950aa67f2a 32 // read uncompensated Temperature
maetugr 0:12950aa67f2a 33 writeRegister(BMP085_CONTROL, READ_TEMPERATURE); // say the sensor we want to read the temperature
maetugr 0:12950aa67f2a 34 wait(0.005); // Wait at least 4.5ms (written in data sheet)
maetugr 0:12950aa67f2a 35 char buffer[3]; // TODO: nur 2 wenn unten nicht gebraucht // read 16-Bit Temperature (2 registers)
maetugr 0:12950aa67f2a 36 readMultiRegister(BMP085_CONTROL_OUTPUT, buffer, 2);
maetugr 0:12950aa67f2a 37 Uncompensated_Temperature = buffer[0] << 8 | buffer[1]; // join 8-Bit pieces to 16-bit short integer
maetugr 0:12950aa67f2a 38
maetugr 0:12950aa67f2a 39 // calculate real Temperature
maetugr 0:12950aa67f2a 40 X1 = ((Uncompensated_Temperature - AC6) * AC5) >> 15;
maetugr 0:12950aa67f2a 41 X2 = (MC << 11) / (X1 + MD);
maetugr 0:12950aa67f2a 42 #warning 33 is a calibration value for 3.3 degree shifft of temperature
maetugr 0:12950aa67f2a 43 B5 = X1 + X2 - ((33 << 4) - 8); // TODO: I added this term because i think my sensor is about 3.3 degree off which makes a difference in absolute altitude
maetugr 0:12950aa67f2a 44 Temperature = (float)((B5 + 8) >> 4)/10.0; // we want temperature in degree with digit after comma
maetugr 0:12950aa67f2a 45
maetugr 0:12950aa67f2a 46 // read uncompensated Pressure
maetugr 0:12950aa67f2a 47 writeRegister(BMP085_CONTROL, READ_PRESSURE + (oss << 6)); // say the sensor we want to read the pressure
maetugr 0:12950aa67f2a 48 wait(0.005); // Wait at least 4.5ms (written in data sheet) TODO: oss fest, times vary and calculation of B3
maetugr 0:12950aa67f2a 49 readMultiRegister(BMP085_CONTROL_OUTPUT, buffer, 3); // read 24-Bit Pressure (3 registers)
maetugr 0:12950aa67f2a 50 Uncompensated_Pressure = (unsigned int) (buffer[0] << 16 | buffer[1] << 8 | buffer[0]) >> (8 - oss); // join 8-Bit pieces to 24-bit integer
maetugr 0:12950aa67f2a 51
maetugr 0:12950aa67f2a 52 // calculate real Pressure
maetugr 0:12950aa67f2a 53 B6 = B5 - 4000; // B5 is updated by real temperature above
maetugr 0:12950aa67f2a 54 X1 = (B2 * ( (B6 * B6) >> 12 )) >> 11;
maetugr 0:12950aa67f2a 55 X2 = (AC2 * B6) >> 11;
maetugr 0:12950aa67f2a 56 X3 = X1 + X2;
maetugr 0:12950aa67f2a 57 B3 = (((AC1 * 4 + X3) << oss) + 2) >> 2;
maetugr 0:12950aa67f2a 58
maetugr 0:12950aa67f2a 59 X1 = (AC3 * B6) >> 13;
maetugr 0:12950aa67f2a 60 X2 = (B1 * ( (B6 * B6) >> 12) ) >> 16;
maetugr 0:12950aa67f2a 61 X3 = ((X1 + X2) + 2) >> 2;
maetugr 0:12950aa67f2a 62 B4 = AC4 * ((unsigned long)X3 + 32768) >> 15;
maetugr 0:12950aa67f2a 63
maetugr 0:12950aa67f2a 64 B7 = ((unsigned long)Uncompensated_Pressure - B3) * (50000 >> oss);
maetugr 0:12950aa67f2a 65
maetugr 0:12950aa67f2a 66 if (B7 < 0x80000000)
maetugr 0:12950aa67f2a 67 P = (B7 * 2) / B4;
maetugr 0:12950aa67f2a 68 else
maetugr 0:12950aa67f2a 69 P = (B7 / B4) * 2;
maetugr 0:12950aa67f2a 70
maetugr 0:12950aa67f2a 71 X1 = (P >> 8) * (P >> 8);
maetugr 0:12950aa67f2a 72 X1 = (X1 * 3038) >> 16;
maetugr 0:12950aa67f2a 73 X2 = (-7357 * P) >> 16;
maetugr 0:12950aa67f2a 74 P = P + ((X1 + X2 + 3791) >> 4);
maetugr 0:12950aa67f2a 75 Pressure = (float)P / 100.0;
maetugr 0:12950aa67f2a 76
maetugr 0:12950aa67f2a 77 // calculate height out of the pressure
maetugr 0:12950aa67f2a 78 Altitude = 44330 * (1.0 - pow((Pressure / 1013.25), 1/5.25588));
maetugr 0:12950aa67f2a 79 }