BMI160 Initial
Dependents: MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_Pitch_Charles Maxim_Squeeks
Revision 9:ca6b5fecdd63, committed 2016-12-20
- Comitter:
- j3
- Date:
- Tue Dec 20 01:08:33 2016 +0000
- Parent:
- 8:a89b529b1d96
- Child:
- 10:9e219f2f1fb3
- Commit message:
- Added range support for accelerometer
Changed in this revision
--- 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;
--- a/bmi160.h Tue Dec 20 00:10:04 2016 +0000
+++ b/bmi160.h Tue Dec 20 01:08:33 2016 +0000
@@ -279,6 +279,18 @@
SENS_16G, ///<Accelerometer range +-16G
};
+ ///Structure for holding accelerometer configuration
+ struct AccConfig
+ {
+ AccRange range;
+ AccUnderSampling us;
+ AccBandWidthParam bwp;
+ AccOutPutDataRate odr;
+ };
+
+ ///Accelerometer default configuration
+ static const AccConfig DEFAULT_ACC_CONFIG;
+
///BMI160 Power Modes
enum PowerModes
{
@@ -419,36 +431,26 @@
///On Entry:
///@param[in] axis - Sensor axis
///@param[in] data - AxisData structure
+ ///@param[in] accConfig - Accelerometer configuration structure
///
///On Exit:
///@param[out] data - Structure holds raw and scaled axis data
///
///@returns 0 on success, non 0 on failure
- int32_t getAccAxis(SensorAxis axis, AxisData &data);
+ int32_t getAccAxis(SensorAxis axis, AxisData &data, AccConfig accConfig);
///@brief Get accelerometer xyz axis as float.\n
///
///On Entry:
///@param[in] data - SensorData structure
+ ///@param[in] accConfig - Accelerometer configuration structure
///
///On Exit:
///@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);
-
-
-protected:
-
- struct AccConfig
- {
- AccRange range;
- AccUnderSampling us;
- AccBandWidthParam bwp;
- AccOutPutDataRate odr;
- };
-
+ int32_t getAccXYZ(SensorData &data, AccConfig accConfig);
};
--- a/bmi160_i2c.cpp Tue Dec 20 00:10:04 2016 +0000
+++ b/bmi160_i2c.cpp Tue Dec 20 01:08:33 2016 +0000
@@ -38,6 +38,7 @@
BMI160_I2C::BMI160_I2C(I2C &i2cBus, uint8_t i2cAdrs)
:m_i2cBus(i2cBus), m_Wadrs(i2cAdrs << 1), m_Radrs((i2cAdrs << 1) | 1)
{
+
}
--- a/bmi160_spi.cpp Tue Dec 20 00:10:04 2016 +0000
+++ b/bmi160_spi.cpp Tue Dec 20 01:08:33 2016 +0000
@@ -38,6 +38,7 @@
BMI160_SPI::BMI160_SPI(SPI &spiBus, DigitalOut &cs)
:m_spiBus(spiBus), m_cs(cs)
{
+
}