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
diff -r 000000000000 -r 6904212fb1d1 BMA180.cpp
--- /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);
+}
diff -r 000000000000 -r 6904212fb1d1 BMA180.h
--- /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);
+};