BMI160 Initial

Dependents:   MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_Pitch_Charles Maxim_Squeeks

Files at this revision

API Documentation at this revision

Comitter:
j3
Date:
Tue Dec 20 21:20:22 2016 +0000
Parent:
14:646eb94fa2eb
Child:
16:12782f5d4aa4
Commit message:
working

Changed in this revision

bmi160.cpp Show annotated file Show diff for this revision Revisions of this file
bmi160.h Show annotated file Show diff for this revision Revisions of this file
--- a/bmi160.cpp	Tue Dec 20 19:32:26 2016 +0000
+++ b/bmi160.cpp	Tue Dec 20 21:20:22 2016 +0000
@@ -130,21 +130,20 @@
         data.raw = ((localData[1] << 8) | localData[0]);
         switch(range)
         {
-            //magic numbers are typical values for LSB/g from EC table
             case SENS_2G:
-                data.scaled = (data.raw/16384.0F);
+                data.scaled = (data.raw/SENS_2G_LSB_PER_G);
             break;
             
             case SENS_4G:
-                data.scaled = (data.raw/8192.0F);
+                data.scaled = (data.raw/SENS_4G_LSB_PER_G);
             break;
             
             case SENS_8G:
-                data.scaled = (data.raw/4096.0F);
+                data.scaled = (data.raw/SENS_8G_LSB_PER_G);
             break;
             
             case SENS_16G:
-                data.scaled = (data.raw/2048.0F);
+                data.scaled = (data.raw/SENS_16G_LSB_PER_G);
             break;
         }
     }
@@ -167,29 +166,28 @@
         
         switch(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);
+                data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
             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);
+                data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
             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);
+                data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
             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);
+                data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
             break;
         }
     }
@@ -199,14 +197,63 @@
 
 
 //***************************************************************************** 
-int32_t BMI160::getSensorTime(float *data)
+int32_t BMI160::getAccXYZandSensorTime(SensorData &data, SensorTime &sensorTime, AccRange range)
+{
+    uint8_t localData[9];
+    int32_t rtnVal = readBlock(DATA_14, SENSORTIME_2, localData);
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        data.xAxis.raw = ((localData[1] << 8) | localData[0]);
+        data.yAxis.raw = ((localData[3] << 8) | localData[2]);
+        data.zAxis.raw = ((localData[5] << 8) | localData[4]);
+        
+        switch(range)
+        {
+            case SENS_2G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
+            break;
+            
+            case SENS_4G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
+            break;
+            
+            case SENS_8G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
+            break;
+            
+            case SENS_16G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
+            break;
+        }
+        
+        sensorTime.raw = ((localData[8] << 16) | (localData[7] << 8) | 
+                           localData[6]);
+        sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
+    }
+    
+    return rtnVal;
+}
+
+
+//***************************************************************************** 
+int32_t BMI160::getSensorTime(SensorTime &sensorTime)
 {
     uint8_t localData[3];
     int32_t rtnVal = readBlock(SENSORTIME_0, SENSORTIME_2, localData);
     
     if(rtnVal == RTN_NO_ERROR)
     {
-        *data = (((localData[2] << 16) | (localData[1] << 8) | localData[0]) * 39e-6);
+        sensorTime.raw = ((localData[2] << 16) | (localData[1] << 8) | 
+                           localData[0]);
+        sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
     }
     
     return rtnVal;
--- a/bmi160.h	Tue Dec 20 19:32:26 2016 +0000
+++ b/bmi160.h	Tue Dec 20 21:20:22 2016 +0000
@@ -69,7 +69,7 @@
     {
         X_AXIS = 0,
         Y_AXIS,
-        Z_AXIS   
+        Z_AXIS
     };
     
     ///Structure for axis data
@@ -79,6 +79,16 @@
         float scaled; ///<Axis scaled data 
     };
     
+    ///Structure for sensor time data
+    struct SensorTime
+    {
+        uint32_t raw;  ///<raw SensorTime
+        float seconds; ///<SensorTime as seconds
+    };
+    
+    ///Period of internal counter
+    static const float SENSOR_TIME_LSB = 39e-6;
+    
     ///Structure for holding sensor data
     struct SensorData
     {
@@ -285,12 +295,17 @@
     ///Accelerometer ranges
     enum AccRange
     {
-        SENS_2G = 0,  ///<Accelerometer range +-2G
-        SENS_4G,      ///<Accelerometer range +-4G
-        SENS_8G,      ///<Accelerometer range +-8G
-        SENS_16G,     ///<Accelerometer range +-16G
+        SENS_2G = 0x03,  ///<Accelerometer range +-2G
+        SENS_4G = 0x05,  ///<Accelerometer range +-4G
+        SENS_8G = 0x08,  ///<Accelerometer range +-8G
+        SENS_16G = 0x0C, ///<Accelerometer range +-16G
     };
     
+    static const float SENS_2G_LSB_PER_G = 16384.0F;
+    static const float SENS_4G_LSB_PER_G = 8192.0F; 
+    static const float SENS_8G_LSB_PER_G = 4096.0F;
+    static const float SENS_16G_LSB_PER_G = 2048.0F;
+    
     ///Accelerometer configuration data structure
     struct AccConfig
     {
@@ -473,19 +488,34 @@
     ///@param[out] data - Structure holds raw and scaled data for all three axis
     ///
     ///@returns 0 on success, non 0 on failure
-    int32_t getAccXYZ(SensorData &data, AccRange range);  
+    int32_t getAccXYZ(SensorData &data, AccRange range); 
+    
+    
+    ///@brief Get accelerometer xyz axis and sensor time.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - SensorData structure
+    ///@param[in] sensorTime - SensorTime structure for data
+    ///@param[in] range - Accelerometer range
+    ///
+    ///On Exit:
+    ///@param[out] data - Structure holds raw and scaled data for all three axis
+    ///@param[out] sensorTime - Holds sensor time on success
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t getAccXYZandSensorTime(SensorData &data, SensorTime &sensorTime, AccRange range); 
     
     
     ///@brief Get sensor time.\n
     ///
     ///On Entry:
-    ///@param[in] data - pointer to float for holding data 
+    ///@param[in] sensorTime - SensorTime structure for data
     ///
     ///On Exit:
-    ///@param[out] data - time in seconds, as float
+    ///@param[out] sensorTime - Holds sensor time on success
     ///
     ///@returns returns 0 on success, non 0 on failure
-    int32_t getSensorTime(float *data);
+    int32_t getSensorTime(SensorTime &sensorTime);
     
     
     ///@brief Get die temperature.\n