Library for Bosch Sensortech BMI160 IMU
Fork of BMI160 by
Diff: bmi160.cpp
- Revision:
- 15:dc35ccc0b08e
- Parent:
- 14:646eb94fa2eb
- Child:
- 16:12782f5d4aa4
--- 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;