BMA180 adr. 0x41 from BlazeX
Revision 0:6904212fb1d1, committed 2012-05-30
- 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); +};