BMI160 Initial
Dependents: MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_Pitch_Charles Maxim_Squeeks
Revision 8:a89b529b1d96, committed 2016-12-20
- Comitter:
- j3
- Date:
- Tue Dec 20 00:10:04 2016 +0000
- Parent:
- 7:9848196cb65e
- Child:
- 9:ca6b5fecdd63
- Commit message:
- Added ACC get data fxs
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 Thu Dec 15 23:46:42 2016 +0000
+++ b/bmi160.cpp Tue Dec 20 00:10:04 2016 +0000
@@ -84,3 +84,67 @@
return rtnVal;
}
+
+
+//*****************************************************************************
+int32_t BMI160::getSensorDataAndTime(uint8_t *data)
+{
+ return readBlock(DATA_0, SENSORTIME_2, data);
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getAccAxis(SensorAxis axis, AxisData &data)
+{
+ uint8_t localData[2];
+ int32_t rtnVal;
+
+ switch(axis)
+ {
+ case X_AXIS:
+ rtnVal = readBlock(DATA_14, DATA_15, localData);
+ break;
+
+ case Y_AXIS:
+ rtnVal = readBlock(DATA_16, DATA_17, localData);
+ break;
+
+ case Z_AXIS:
+ rtnVal = readBlock(DATA_18, DATA_19, localData);
+ break;
+
+ default:
+ rtnVal = -1;
+ break;
+ }
+
+ if(rtnVal == RTN_NO_ERROR)
+ {
+ data.raw = ((localData[1] << 8) | localData[0]);
+ data.scaled = (data.raw/16384.0F); //only 2G range right now
+ }
+
+ return rtnVal;
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getAccXYZ(SensorData &data)
+{
+ uint8_t localData[6];
+ int32_t rtnVal = readBlock(DATA_14, DATA_19, 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]);
+
+ //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);
+ }
+
+ return rtnVal;
+}
--- a/bmi160.h Thu Dec 15 23:46:42 2016 +0000
+++ b/bmi160.h Tue Dec 20 00:10:04 2016 +0000
@@ -64,6 +64,29 @@
ACC ///<g sensor
};
+ ///Sensor Axis
+ enum SensorAxis
+ {
+ X_AXIS = 0,
+ Y_AXIS,
+ Z_AXIS
+ };
+
+ ///Structure for axis data
+ struct AxisData
+ {
+ int16_t raw; ///<Axis raw data
+ float scaled; ///<Axis scaled data
+ };
+
+ ///Structure for holding sensor data
+ struct SensorData
+ {
+ AxisData xAxis; ///<Sensor X axis data
+ AxisData yAxis; ///<Sensor Y axis data
+ AxisData zAxis; ///<Sensor Z axis data
+ };
+
///BMI160 registers
enum Registers
{
@@ -177,6 +200,7 @@
///<softreset, NVM programming, etc.
};
+
///ERR_REG Bit Mask bit0
static const uint8_t FATAL_ERR = 0x01;
///ERR_REG Bit Mask bits4:1
@@ -201,6 +225,60 @@
PFD_USED_LPM ///<Pre-filtered data are used in low power mode
};
+
+ ///ACC_CONF Bit Mask bits3:0
+ static const uint8_t ACC_ODR = 0x0F;
+ ///ACC_CONF Bit Mask bits6:4
+ static const uint8_t ACC_BWP = 0x70;
+ ///ACC_CONF Bit Mask bit7
+ static const uint8_t ACC_US = 0x80;
+
+ ///ACC_CONF bits3:0 codes
+ enum AccOutPutDataRate
+ {
+ ACC_ODR_1 = 1, ///< 25/32Hz
+ ACC_ODR_2, ///< 25/16Hz
+ ACC_ODR_3, ///< 25/8Hz
+ ACC_ODR_4, ///< 25/4Hz
+ ACC_ODR_5, ///< 25/2Hz
+ ACC_ODR_6, ///< 25Hz
+ ACC_ODR_7, ///< 50Hz
+ ACC_ODR_8, ///< 100Hz
+ ACC_ODR_9, ///< 200Hz
+ ACC_ODR_10, ///< 400Hz
+ ACC_ODR_11, ///< 800Hz
+ ACC_ODR_12 ///< 1600Hz
+ };
+
+ ///ACC_CONF bits6:4 codes
+ enum AccBandWidthParam
+ {
+ ACC_BWP_0 = 0, ///< Average 1 cycle
+ ACC_BWP_1, ///< Average 2 cycles
+ ACC_BWP_2, ///< Average 4 cycles, use this setting when acc_us = 0
+ ACC_BWP_3, ///< Average 8 cycles
+ ACC_BWP_4, ///< Average 16 cycles
+ ACC_BWP_5, ///< Average 32 cycles
+ ACC_BWP_6, ///< Average 64 cycles
+ ACC_BWP_7 ///< Average 128 cycles
+ };
+
+ ///ACC_CONF bit7
+ enum AccUnderSampling
+ {
+ ACC_US_OFF = 0,
+ ACC_US_ON
+ };
+
+ ///Accelerometer range values
+ enum AccRange
+ {
+ SENS_2G = 0, ///<Accelerometer range +-2G
+ SENS_4G, ///<Accelerometer range +-4G
+ SENS_8G, ///<Accelerometer range +-8G
+ SENS_16G, ///<Accelerometer range +-16G
+ };
+
///BMI160 Power Modes
enum PowerModes
{
@@ -215,8 +293,8 @@
{
START_FOC = 0x03, ///<Starts Fast Offset Calibrartion
ACC_SET_PMU_MODE = 0x10, ///<Sets acc power mode
- GYR_SET_PMU_MODE = 0x14, ///<Sets gyro power mode
- MAG_SET_PMU_MODE = 0x18, ///<Sets mag power mode
+ GYR_SET_PMU_MODE = 0x14, ///<Sets gyro power mode
+ MAG_SET_PMU_MODE = 0x18, ///<Sets mag power mode
PROG_NVM = 0xA0, ///<Writes NVM backed registers into NVM
FIFO_FLUSH = 0xB0, ///<Clears FIFO
INT_RESET, ///<Clears interrupt engine, INT_STATUS, and
@@ -324,16 +402,53 @@
int32_t getTemperature(float *temp);
- ///@brief fx documentation template.\n
+ ///@brief Read data registers and sensortime.\n
+ ///
+ ///On Entry:
+ ///@param[in] data - buffer at least 23 bytes long
+ ///
+ ///On Exit:
+ ///@param[out] data - holds raw sensor data on success
+ ///
+ ///@returns 0 on success, non 0 on failure
+ int32_t getSensorDataAndTime(uint8_t *data);
+
+
+ ///@brief Get accelerometer axis as float.\n
///
///On Entry:
- ///@param[in] none
+ ///@param[in] axis - Sensor axis
+ ///@param[in] data - AxisData 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);
+
+
+ ///@brief Get accelerometer xyz axis as float.\n
+ ///
+ ///On Entry:
+ ///@param[in] data - SensorData structure
///
///On Exit:
- ///@param[out] none
+ ///@param[out] data - Structure holds raw and scaled data for all three axis
///
- ///@returns none
+ ///@returns 0 on success, non 0 on failure
+ int32_t getAccXYZ(SensorData &data);
+
+
+protected:
+ struct AccConfig
+ {
+ AccRange range;
+ AccUnderSampling us;
+ AccBandWidthParam bwp;
+ AccOutPutDataRate odr;
+ };
+
};
@@ -410,3 +525,14 @@
};
#endif /* BMI160_H */
+
+
+///@brief fx documentation template.\n
+///
+///On Entry:
+///@param[in] none
+///
+///On Exit:
+///@param[out] none
+///
+///@returns none