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