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.
IMU/Sensors/Alt/BMP085.cpp@0:12950aa67f2a, 2013-09-02 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |