Library for Bosch Sensortec BMI160 IMU

Dependents:   Rocket MAX32630FTHR_JOYSTICK MAX32630FTHR_IMU_Hello_World Pike_the_Flipper_Main_Branch ... more

Fork of BMI160 by Justin Jordan

Revision:
9:ca6b5fecdd63
Parent:
8:a89b529b1d96
Child:
10:9e219f2f1fb3
--- a/bmi160.cpp	Tue Dec 20 00:10:04 2016 +0000
+++ b/bmi160.cpp	Tue Dec 20 01:08:33 2016 +0000
@@ -34,6 +34,9 @@
 #include "bmi160.h"
 
 
+const struct BMI160::AccConfig BMI160::DEFAULT_ACC_CONFIG = {SENS_2G, ACC_US_OFF, ACC_BWP_2, ACC_ODR_8};
+    
+
 //*****************************************************************************
 int32_t BMI160::setSensorPowerMode(Sensors sensor, PowerModes pwrMode)
 {
@@ -94,7 +97,7 @@
 
 
 //*****************************************************************************
-int32_t BMI160::getAccAxis(SensorAxis axis, AxisData &data)
+int32_t BMI160::getAccAxis(SensorAxis axis, AxisData &data, AccConfig accConfig)
 {
     uint8_t localData[2];
     int32_t rtnVal;
@@ -121,7 +124,25 @@
     if(rtnVal == RTN_NO_ERROR)
     {
         data.raw = ((localData[1] << 8) | localData[0]);
-        data.scaled = (data.raw/16384.0F); //only 2G range right now
+        switch(accConfig.range)
+        {
+            //magic numbers are typical values for LSB/g from EC table
+            case SENS_2G:
+                data.scaled = (data.raw/16384.0F);
+            break;
+            
+            case SENS_4G:
+                data.scaled = (data.raw/8192.0F);
+            break;
+            
+            case SENS_8G:
+                data.scaled = (data.raw/4096.0F);
+            break;
+            
+            case SENS_16G:
+                data.scaled = (data.raw/2048.0F);
+            break;
+        }
     }
     
     return rtnVal;
@@ -129,7 +150,7 @@
     
 
 //*****************************************************************************    
-int32_t BMI160::getAccXYZ(SensorData &data)
+int32_t BMI160::getAccXYZ(SensorData &data, AccConfig accConfig)
 {
     uint8_t localData[6];
     int32_t rtnVal = readBlock(DATA_14, DATA_19, localData);
@@ -140,10 +161,33 @@
         data.yAxis.raw = ((localData[3] << 8) | localData[2]);
         data.zAxis.raw = ((localData[5] << 8) | localData[4]);
         
-        //only 2G range right now
-        data.xAxis.scaled = (data.xAxis.raw/16384.0F);
-        data.yAxis.scaled = (data.yAxis.raw/16384.0F);
-        data.zAxis.scaled = (data.zAxis.raw/16384.0F);
+        switch(accConfig.range)
+        {
+            //magic numbers are typical values for LSB/g from EC table
+            case SENS_2G:
+                data.xAxis.scaled = (data.xAxis.raw/16384.0F);
+                data.yAxis.scaled = (data.yAxis.raw/16384.0F);
+                data.zAxis.scaled = (data.zAxis.raw/16384.0F);
+            break;
+            
+            case SENS_4G:
+                data.xAxis.scaled = (data.xAxis.raw/8192.0F);
+                data.yAxis.scaled = (data.yAxis.raw/8192.0F);
+                data.zAxis.scaled = (data.zAxis.raw/8192.0F);
+            break;
+            
+            case SENS_8G:
+                data.xAxis.scaled = (data.xAxis.raw/4096.0F);
+                data.yAxis.scaled = (data.yAxis.raw/4096.0F);
+                data.zAxis.scaled = (data.zAxis.raw/4096.0F);
+            break;
+            
+            case SENS_16G:
+                data.xAxis.scaled = (data.xAxis.raw/2048.0F);
+                data.yAxis.scaled = (data.yAxis.raw/2048.0F);
+                data.zAxis.scaled = (data.zAxis.raw/2048.0F);
+            break;
+        }
     }
     
     return rtnVal;