My implementation of Bosh BMI160 Only I2C is tested so far.
Dependents: test_BMI160 TFT_test_MAX32630FTHR
Diff: BMI160.cpp
- Revision:
- 3:9d3079170b35
- Parent:
- 1:d56df81c389b
--- a/BMI160.cpp Mon Sep 11 23:53:22 2017 +0000
+++ b/BMI160.cpp Tue Sep 12 00:34:16 2017 +0000
@@ -95,6 +95,8 @@
#define REG_STEP_CONF_1 0x7B
#define REG_CMD 0x7E
+#define FLOAT_MAX_16BIT 32768.0
+
/* 0x00 CHIP_ID reset value = 0xD1 */
/* 0x02 ERR_REG Reports sensor error flags. Flags are cleared when read.
* bit[7] mag_drdy_err
@@ -552,8 +554,11 @@
void BMI160::init(void)
{
+ acc_range = getAccRange() ;
+ gyr_range = getGyrRange() ;
}
+
void BMI160::setCMD(uint8_t cmd)
{
uint8_t data[2] ;
@@ -595,6 +600,7 @@
printf("illegal Acc Range %X detected\n", data & 0x0F) ;
break ;
}
+ acc_range = range ;
return(range) ;
}
@@ -623,10 +629,11 @@
printf("illegal Gyr Range %d detected\n", data & 0x07) ;
break ;
}
+ gyr_range = range ;
return(range) ;
}
-int16_t BMI160::getAccX(void)
+int16_t BMI160::getAccRawX(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -635,7 +642,7 @@
return( value ) ;
}
-int16_t BMI160::getAccY(void)
+int16_t BMI160::getAccRawY(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -644,7 +651,7 @@
return( value ) ;
}
-int16_t BMI160::getAccZ(void)
+int16_t BMI160::getAccRawZ(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -653,7 +660,7 @@
return( value ) ;
}
-void BMI160::getAcc(int16_t *value)
+void BMI160::getAccRaw(int16_t *value)
{
uint8_t data[6] ;
readRegs(REG_DATA_14, data, 6) ;
@@ -662,7 +669,7 @@
value[2] = (data[5] << 8) | data[4] ;
}
-int16_t BMI160::getGyrX(void)
+int16_t BMI160::getGyrRawX(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -671,7 +678,7 @@
return( value ) ;
}
-int16_t BMI160::getGyrY(void)
+int16_t BMI160::getGyrRawY(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -680,7 +687,7 @@
return( value ) ;
}
-int16_t BMI160::getGyrZ(void)
+int16_t BMI160::getGyrRawZ(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -689,11 +696,71 @@
return( value ) ;
}
-void BMI160::getGyr(int16_t *value)
+void BMI160::getGyrRaw(int16_t *value)
{
uint8_t data[6] ;
readRegs(REG_DATA_8, data, 6) ;
value[0] = (data[1] << 8) | data[0] ;
value[1] = (data[3] << 8) | data[2] ;
value[2] = (data[5] << 8) | data[4] ;
-}
\ No newline at end of file
+}
+
+float BMI160::getAccX(void)
+{
+ float value ;
+ value = acc_range * getAccRawX() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+float BMI160::getAccY(void)
+{
+ float value ;
+ value = acc_range * getAccRawY() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+float BMI160::getAccZ(void)
+{
+ float value ;
+ value = acc_range * getAccRawZ() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+void BMI160::getAcc(float *value)
+{
+ int16_t data[3] ;
+ getAccRaw(data) ;
+ value[0] = acc_range * data[0] / FLOAT_MAX_16BIT ;
+ value[1] = acc_range * data[1] / FLOAT_MAX_16BIT ;
+ value[2] = acc_range * data[2] / FLOAT_MAX_16BIT ;
+}
+
+float BMI160::getGyrX(void)
+{
+ float value ;
+ value = gyr_range * getGyrRawX() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+float BMI160::getGyrY(void)
+{
+ float value ;
+ value = gyr_range * getGyrRawY() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+float BMI160::getGyrZ(void)
+{
+ float value ;
+ value = gyr_range * getGyrRawZ() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+void BMI160::getGyr(float *value)
+{
+ int16_t data[3] ;
+ getGyrRaw(data) ;
+ value[0] = gyr_range * data[0] / FLOAT_MAX_16BIT ;
+ value[1] = gyr_range * data[1] / FLOAT_MAX_16BIT ;
+ value[2] = gyr_range * data[2] / FLOAT_MAX_16BIT ;
+}
\ No newline at end of file