BMA180 library with multiple configurable ranges. Based on the Sensor_test by Bo Carøe.

Dependents:   Sensor_test_2_0 KalmanFilter

Fork of BMA180 by Bo Carøe

Revision:
1:cd2316c8a187
Parent:
0:6904212fb1d1
Child:
2:c7eb9f15e026
--- a/BMA180.cpp	Wed May 30 10:43:42 2012 +0000
+++ b/BMA180.cpp	Wed Aug 15 01:33:49 2012 +0000
@@ -4,7 +4,7 @@
 #define I2CADR_W(ADR)           (ADR<<1&0xFE)
 #define I2CADR_R(ADR)           (ADR<<1|0x01)
 
-//Initialisieren
+//Initialization
 BMA180::BMA180(I2C & I2CBus_, Timer & GlobalTime_)
     : I2CBus(I2CBus_),
       GlobalTime(GlobalTime_)
@@ -12,7 +12,7 @@
 
 void BMA180::Init()
 {
-    //Nullsetzen
+    //Zeroing
     for(int i= 0; i < 3; i++)
     {
         Offset[i]= 0.0;
@@ -21,11 +21,11 @@
     }
     
        
-    //BMA180 initialisieren
+    //BMA180 initialization
     char tx[2];
     char rx[1];
     
-    //Schreiben aktivieren
+    //Write on EEPROM enable
     tx[0]= 0x0D;
     I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
     I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1);
@@ -39,14 +39,15 @@
     tx[1]= rx[0] & 0xFC | (0x00<<0);
     I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2);
     
-    //Range: +-3g
+    //Range: +-1.5g
+    // +-1g:0x00 | +-1.5g:0x01 | +-2g:0x02 | +-3g:0x03 |  +-4g:0x04 |  +-8g:0x05 |  +-16g:0x06 | 
     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);
+    tx[1]= rx[0] & 0xF1 | (0x01<<1);
     I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2);
     
-    //Bandbreitenfilter: 10Hz    
+    //Bandwidth filters: 10Hz    
     tx[0]= 0x20;
     I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
     I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1);
@@ -57,10 +58,10 @@
 }
 
 
-//Rohdaten lesen
+//Read raw data
 void BMA180::ReadRawData()
 {
-    //Beschleunigung für alle 3 Achsen auslesen
+    //Read acceleration on all 3 axis
     char tx[1];
     char rx[6];
     
@@ -68,8 +69,8 @@
     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  
+    //Assemble the individual bytes from the 16-bit value
+    //The last 2 bits must be "cut off" since the values came in 14-bit form
     RawAcc[0]= (rx[1]<<8|rx[0]) & 0xFFFC;
     RawAcc[1]= (rx[3]<<8|rx[2]) & 0xFFFC;
     RawAcc[2]= (rx[5]<<8|rx[4]) & 0xFFFC;
@@ -78,33 +79,33 @@
     RawAcc[2]/= 4;
 }
    
-//Update-Methode
+//Update-Method
 void BMA180::Update()
 {
-    //Beschleunigung für alle 3 Achsen auslesen
+    //Read acceleration on all 3 axis
     ReadRawData();
     
-    //Umrechnungen
+    //Conversions
     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
+//Calibration
 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
+    //End of calibration calculated in milliseconds
     int CalibEnd= GlobalTime.read_ms() + ms;
     
     while(GlobalTime.read_ms() < CalibEnd)
     {    
-        //Rohdaten lesen
+        //Read raw data
         ReadRawData();
         
-        //Durchschnitt bilden
+        //Averaging
         AvgCalibAcc[0]+= (float)RawAcc[0];
         AvgCalibAcc[1]+= (float)RawAcc[1];
         AvgCalibAcc[2]+= (float)RawAcc[2];
@@ -113,8 +114,27 @@
         wait_ms(2);
     }
     
-    //Genug Daten gesammelt, jetzt den Durchschnitt bilden
+    //Collected enough data now form the average
     Offset[0]= -((float)(pRaw1g[0]) + AvgCalibAcc[0] / AvgCalibSampels);
     Offset[1]= -((float)(pRaw1g[1]) + AvgCalibAcc[1] / AvgCalibSampels);
     Offset[2]= -((float)(pRaw1g[2]) + AvgCalibAcc[2] / AvgCalibSampels);
 }
+void BMA180::userCalibration(short * Raw1g){
+        
+        long media[3] = {0,0,0};
+        
+        int count = 0;
+        
+        int endCal = GlobalTime.read_ms() + 500;
+    
+        while(GlobalTime.read_ms() < endCal){
+                        
+                    media[0] = media[0] + (float)RawAcc[0];
+                    media[1] = media[1] + (float)RawAcc[1];  
+                    media[2] = media[2] + (float)RawAcc[2];    
+                    count++;      
+                }
+        Raw1g[0] = -(media[0]/count);
+        Raw1g[1] = -(media[1]/count);
+        Raw1g[2] = -(media[2]/count);    
+ }