BMA180 adr. 0x41 from BlazeX

Dependents:   Sensor_test

Files at this revision

API Documentation at this revision

Comitter:
caroe
Date:
Wed May 30 10:43:42 2012 +0000
Commit message:

Changed in this revision

BMA180.cpp Show annotated file Show diff for this revision Revisions of this file
BMA180.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMA180.cpp	Wed May 30 10:43:42 2012 +0000
@@ -0,0 +1,120 @@
+#include "mbed.h"
+#include "BMA180.h"
+
+#define I2CADR_W(ADR)           (ADR<<1&0xFE)
+#define I2CADR_R(ADR)           (ADR<<1|0x01)
+
+//Initialisieren
+BMA180::BMA180(I2C & I2CBus_, Timer & GlobalTime_)
+    : I2CBus(I2CBus_),
+      GlobalTime(GlobalTime_)
+{}
+
+void BMA180::Init()
+{
+    //Nullsetzen
+    for(int i= 0; i < 3; i++)
+    {
+        Offset[i]= 0.0;
+        RawAcc[i]= 0;
+        Acc[i]= 0;
+    }
+    
+       
+    //BMA180 initialisieren
+    char tx[2];
+    char rx[1];
+    
+    //Schreiben aktivieren
+    tx[0]= 0x0D;
+    I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
+    I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1);
+    tx[1]= rx[0] & 0xEF | (0x01<<4);
+    I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2);
+    
+    //Mode: Low-Noise
+    tx[0]= 0x30;
+    I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
+    I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1);
+    tx[1]= rx[0] & 0xFC | (0x00<<0);
+    I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2);
+    
+    //Range: +-3g
+    tx[0]= 0x35;
+    I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
+    I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1);
+    tx[1]= rx[0] & 0xF1 | (0x03<<1);
+    I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2);
+    
+    //Bandbreitenfilter: 10Hz    
+    tx[0]= 0x20;
+    I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
+    I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1);
+    tx[1]= rx[0] & 0x0F | (0x00<<4);
+    I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2);
+      
+    Update();
+}
+
+
+//Rohdaten lesen
+void BMA180::ReadRawData()
+{
+    //Beschleunigung für alle 3 Achsen auslesen
+    char tx[1];
+    char rx[6];
+    
+    tx[0]= 0x02;
+    I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
+    I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 6); 
+    
+    //Aus den einzelnen Bytes den 16-Bit-Wert zusammenbauen
+    //Die 2 Statusbits muessen "abgeschnitten" werden  
+    RawAcc[0]= (rx[1]<<8|rx[0]) & 0xFFFC;
+    RawAcc[1]= (rx[3]<<8|rx[2]) & 0xFFFC;
+    RawAcc[2]= (rx[5]<<8|rx[4]) & 0xFFFC;
+    RawAcc[0]/= 4;
+    RawAcc[1]/= 4;
+    RawAcc[2]/= 4;
+}
+   
+//Update-Methode
+void BMA180::Update()
+{
+    //Beschleunigung für alle 3 Achsen auslesen
+    ReadRawData();
+    
+    //Umrechnungen
+    Acc[0]= fConvMPSS * ((float)(RawAcc[0]) + Offset[0]);
+    Acc[1]= fConvMPSS * ((float)(RawAcc[1]) + Offset[1]);
+    Acc[2]= fConvMPSS * ((float)(RawAcc[2]) + Offset[2]);
+}
+
+//Kalibrieren
+void BMA180::Calibrate(int ms, const short * pRaw1g)
+{
+    float AvgCalibAcc[3]= {0.0, 0.0, 0.0};    
+    float AvgCalibSampels= 0.0;
+    
+    //Ende der Kalibrierung in ms Millisekunden berechnen
+    int CalibEnd= GlobalTime.read_ms() + ms;
+    
+    while(GlobalTime.read_ms() < CalibEnd)
+    {    
+        //Rohdaten lesen
+        ReadRawData();
+        
+        //Durchschnitt bilden
+        AvgCalibAcc[0]+= (float)RawAcc[0];
+        AvgCalibAcc[1]+= (float)RawAcc[1];
+        AvgCalibAcc[2]+= (float)RawAcc[2];
+        AvgCalibSampels+= 1.0;
+        
+        wait_ms(2);
+    }
+    
+    //Genug Daten gesammelt, jetzt den Durchschnitt bilden
+    Offset[0]= -((float)(pRaw1g[0]) + AvgCalibAcc[0] / AvgCalibSampels);
+    Offset[1]= -((float)(pRaw1g[1]) + AvgCalibAcc[1] / AvgCalibSampels);
+    Offset[2]= -((float)(pRaw1g[2]) + AvgCalibAcc[2] / AvgCalibSampels);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMA180.h	Wed May 30 10:43:42 2012 +0000
@@ -0,0 +1,42 @@
+#pragma once
+
+//I2C Adresse, entweder 0x40 oder 0x41, abhaengig von Pin VDDIO
+#define BMA180_ADRESS 0x41
+
+//Beschleunigung in Meter pro Quadratsekunde umrechnen
+const float fConvMPSS= 3.4346447e-3;
+
+class BMA180
+{
+private:
+    I2C & I2CBus;
+    Timer & GlobalTime;
+    
+    //Offset
+    float Offset[3];
+    
+public:
+    //Beschleunigung auf allen drei Achsen
+    short RawAcc[3];        //Rohdaten
+    float Acc[3];           //kalibrierte Rohdaten in m/s^2
+    
+    
+    //Initialisieren
+    BMA180(I2C & I2CBus_, Timer & GlobalTime_);
+    void Init();
+
+private:    
+    //Rohdaten lesen
+    void ReadRawData();
+    
+public:
+    //Update-Methode
+    //- Holt aktuelle Daten vom Sensor ab
+    //- Rechnet das Offset hinzu
+    //- Rechnet in andere Einheiten um
+    void Update();
+    
+    //Kalibrieren
+    //- pRaw1g: Array short[3] ideale Rohdaten für 1g = ca. {0, 0, -2870}
+    void Calibrate(int ms, const short * pRaw1g);
+};