Library for the barometric pressure sensor BMP183

Dependents:   BMP183Test

Files at this revision

API Documentation at this revision

Comitter:
Cirrus01
Date:
Tue Jun 21 10:02:13 2016 +0000
Commit message:
Initial commit

Changed in this revision

BMP183.cpp Show annotated file Show diff for this revision Revisions of this file
BMP183.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMP183.cpp	Tue Jun 21 10:02:13 2016 +0000
@@ -0,0 +1,119 @@
+
+#include "BMP183.h"
+
+BMP183::BMP183(PinName MOSI, PinName MISO, PinName SCLK, PinName CS): spi(MOSI, MISO, SCLK), cs(CS) {
+    ChipDeselect();
+    spi.format(8, 3);
+    spi.frequency(5e6);
+}
+
+uint8_t BMP183::getID(void)
+{
+    char response[1];
+    readRegister(BMP183_REGISTER_CHIPID, response, 1);
+    return response[0];
+}
+
+void BMP183::getCalibrationData(void)
+{
+    char buffer[22];                                  // 8-Bit pieces of axis data
+    readRegister(BMP183_REGISTER_CAL_AC1, buffer, 22);         // read all calibration registers in one time 22 Byte = 176 Bit
+    
+    AC1 = (short) (buffer[0] << 8 | buffer[1]);       // join 8-Bit pieces to 16-bit short integers
+    AC2 = (short) (buffer[2] << 8 | buffer[3]);
+    AC3 = (short) (buffer[4] << 8 | buffer[5]);
+    AC4 = (unsigned short) (buffer[6] << 8 | buffer[7]);      // unsigned !!
+    AC5 = (unsigned short) (buffer[8] << 8 | buffer[9]);
+    AC6 = (unsigned short) (buffer[10] << 8 | buffer[11]);
+    B1 = (short) (buffer[12] << 8 | buffer[13]);
+    B2 = (short) (buffer[14] << 8 | buffer[15]);
+    MB = (short) (buffer[16] << 8 | buffer[17]);
+    MC = (short) (buffer[18] << 8 | buffer[19]);
+    MD = (short) (buffer[20] << 8 | buffer[21]);
+    
+    
+    oss = 0; // set Oversampling of Sensor
+}
+
+void BMP183::read(void)
+{
+    unsigned short Uncompensated_Temperature;
+    long P, Uncompensated_Pressure, X1, X2, X3, B3, B5, B6;
+    unsigned long B4, B7;
+    
+    // read uncompensated Temperature
+    writeRegister(BMP183_REGISTER_CONTROL, BMP183_REGISTER_READTEMPCMD);// say the sensor we want to read the temperature
+    wait(0.005); // Wait at least 4.5ms (written in data sheet)
+    char buffer[3];  // TODO: nur 2 wenn unten nicht gebraucht                                           // read 16-Bit Temperature (2 registers)
+    readRegister(BMP183_REGISTER_TEMPDATA, buffer, 2);        
+    Uncompensated_Temperature =  buffer[0] << 8 | buffer[1];               // join 8-Bit pieces to 16-bit short integer
+    
+    // calculate real Temperature
+    X1 = ((Uncompensated_Temperature - AC6) * AC5) >> 15;
+    X2 = (MC << 11) / (X1 + MD);
+    B5 = X1 + X2;                               // - ((33 << 4) - 8); 
+    Temperature = (float)((B5 + 8) >> 4)/10.0;  // we want temperature in degree with digit after comma
+    
+    // read uncompensated Pressure
+    writeRegister(BMP183_REGISTER_CONTROL, BMP183_REGISTER_READPRESSURECMD + (oss << 6));// say the sensor we want to read the pressure
+    wait(0.005); // Wait at least 4.5ms (written in data sheet) TODO: oss fest, times vary and calculation of B3                         
+    readRegister(BMP183_REGISTER_PRESSUREDATA, buffer, 3);                                                    // read 24-Bit Pressure (3 registers)
+    Uncompensated_Pressure = (unsigned int) (buffer[0] << 16 | buffer[1] << 8 | buffer[0]) >> (8 - oss);    // join 8-Bit pieces to 24-bit integer
+    
+    // calculate real Pressure
+    B6 = B5 - 4000;     // B5 is updated by real temperature above
+    X1 = (B2 * ( (B6 * B6) >> 12 )) >> 11;
+    X2 = (AC2 * B6) >> 11;
+    X3 = X1 + X2;
+    B3 = (((AC1 * 4 + X3) << oss) + 2) >> 2;
+ 
+    X1 = (AC3 * B6) >> 13;
+    X2 = (B1 * ( (B6 * B6) >> 12) ) >> 16;
+    X3 = ((X1 + X2) + 2) >> 2;
+    B4 = AC4 * ((unsigned long)X3 + 32768) >> 15;
+    
+    B7 = ((unsigned long)Uncompensated_Pressure - B3) * (50000 >> oss);
+    
+    if (B7 < 0x80000000)
+        P = (B7 * 2) / B4;
+    else 
+        P = (B7 / B4) * 2;
+    
+    X1 = (P >> 8) * (P >> 8);
+    X1 = (X1 * 3038) >> 16;
+    X2 = (-7357 * P) >> 16;    
+    P = P + ((X1 + X2 + 3791) >> 4);
+    Pressure = (float)P / 100.0;
+    
+    // calculate height out of the pressure
+    Altitude = 44330 * (1.0 - pow((Pressure / 1013.25), 1/5.25588));
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// SPI Functions
+//////////////////////////////////////////////////////////////////////////
+
+void BMP183::readRegister(uint8_t reg, char *buffer, int length) {
+    ChipSelect();
+    spi.write(reg | 0x80);                                  // send the register address we want to read and the read flag
+    for(int i=0; i<length; i++)                             // get data
+        buffer[i] = spi.write(0x00);
+    ChipDeselect();
+}
+ 
+void BMP183::writeRegister(uint8_t reg, char *buffer, int length) {
+    ChipSelect();
+    spi.write(reg & ~0x80);                                 // send the register address we want to write and the write flag
+    for(int i=0; i<length; i++)                             // put data
+        spi.write(buffer[i]);
+    ChipDeselect();
+}
+
+void BMP183::writeRegister(uint8_t reg, int data) {
+    ChipSelect();
+    spi.write(reg & ~0x80);                                 // send the register address we want to write and the write flag
+    spi.write(data);                                        // put data
+    ChipDeselect();
+} 
+void BMP183::ChipSelect() { cs = 0; }                          // set Cable Select pin low to start SPI transaction
+void BMP183::ChipDeselect() { cs = 1; }                        // set Cable Select pin high to stop SPI transaction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMP183.h	Tue Jun 21 10:02:13 2016 +0000
@@ -0,0 +1,70 @@
+#ifndef BMP183_H
+#define BMP183_H
+
+#include "mbed.h"
+
+/*=========================================================================
+    REGISTERS
+    -----------------------------------------------------------------------*/
+
+#define    BMP183_REGISTER_CAL_AC1            0xAA  // R   Calibration data (16 bits)
+#define    BMP183_REGISTER_CAL_AC2            0xAC  // R   Calibration data (16 bits)
+#define    BMP183_REGISTER_CAL_AC3            0xAE  // R   Calibration data (16 bits)
+#define    BMP183_REGISTER_CAL_AC4            0xB0  // R   Calibration data (16 bits)
+#define    BMP183_REGISTER_CAL_AC5            0xB2  // R   Calibration data (16 bits)
+#define    BMP183_REGISTER_CAL_AC6            0xB4  // R   Calibration data (16 bits)
+#define    BMP183_REGISTER_CAL_B1             0xB6  // R   Calibration data (16 bits)
+#define    BMP183_REGISTER_CAL_B2             0xB8  // R   Calibration data (16 bits)
+#define    BMP183_REGISTER_CAL_MB             0xBA  // R   Calibration data (16 bits)
+#define    BMP183_REGISTER_CAL_MC             0xBC  // R   Calibration data (16 bits)
+#define    BMP183_REGISTER_CAL_MD             0xBE  // R   Calibration data (16 bits)
+#define    BMP183_REGISTER_CHIPID             0xD0
+#define    BMP183_REGISTER_VERSION            0xD1
+#define    BMP183_REGISTER_SOFTRESET          0xE0
+#define    BMP183_REGISTER_CONTROL            0xF4
+#define    BMP183_REGISTER_TEMPDATA           0xF6
+#define    BMP183_REGISTER_PRESSUREDATA       0xF6
+#define    BMP183_REGISTER_READTEMPCMD        0x2E
+#define    BMP183_REGISTER_READPRESSURECMD    0x34
+
+/*=========================================================================*/
+
+/*=========================================================================
+    MODE SETTINGS
+    -----------------------------------------------------------------------*/
+
+#define    BMP183_MODE_ULTRALOWPOWER           0
+#define    BMP183_MODE_STANDARD                1
+#define    BMP183_MODE_HIGHRES                 2
+#define    BMP183_MODE_ULTRAHIGHRES            3
+
+/*=========================================================================*/
+
+class BMP183
+{
+public:
+    BMP183(PinName MOSI, PinName MISO, PinName SCLK, PinName CS);
+
+    uint8_t getID(void);
+    void getCalibrationData(void);
+    void read(void);
+    float Temperature, Pressure, Altitude;
+
+private:
+    SPI spi;
+    DigitalOut cs;
+
+    short AC1, AC2, AC3, B1, B2, MB, MC, MD;
+    unsigned short AC4, AC5, AC6;
+    short oss;
+
+    void readRegister(uint8_t reg, char *buffer, int length);
+    void writeRegister(uint8_t reg, int data);
+    void writeRegister(uint8_t reg, char *buffer, int length);
+
+    void ChipSelect(void);
+    void ChipDeselect(void);
+};
+
+
+#endif //  BMP183_H
\ No newline at end of file