AHRS

Dependencies:   Eigen

Dependents:   IndNav_QK3_T265

Committer:
pmic
Date:
Mon Jan 27 10:54:13 2020 +0000
Revision:
30:9b0cd3caf0ec
Parent:
29:cd963a6d31c5
Correct magnetometer.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
altb2 25:fe14dbcef82d 1 #ifndef BMI088_H
altb2 25:fe14dbcef82d 2 #define BMI088_H
altb2 25:fe14dbcef82d 3
altb2 25:fe14dbcef82d 4 #include <stdint.h>
altb2 25:fe14dbcef82d 5 #include "mbed.h"
altb2 25:fe14dbcef82d 6
altb2 25:fe14dbcef82d 7 #define BMI088_ACC_ADDRESS 0x18
altb2 25:fe14dbcef82d 8
altb2 25:fe14dbcef82d 9 #define BMI088_ACC_CHIP_ID 0x00 // Default value 0x1E
altb2 25:fe14dbcef82d 10 #define BMI088_ACC_ERR_REG 0x02
altb2 25:fe14dbcef82d 11 #define BMI088_ACC_STATUS 0x03
altb2 25:fe14dbcef82d 12
altb2 25:fe14dbcef82d 13 #define BMI088_ACC_X_LSB 0x12
altb2 25:fe14dbcef82d 14 #define BMI088_ACC_X_MSB 0x13
altb2 25:fe14dbcef82d 15 #define BMI088_ACC_Y_LSB 0x14
altb2 25:fe14dbcef82d 16 #define BMI088_ACC_Y_MSB 0x15
altb2 25:fe14dbcef82d 17 #define BMI088_ACC_Z_LSB 0x16
altb2 25:fe14dbcef82d 18 #define BMI088_ACC_Z_MSB 0x17
altb2 25:fe14dbcef82d 19
altb2 25:fe14dbcef82d 20 #define BMI088_ACC_SENSOR_TIME_0 0x18
altb2 25:fe14dbcef82d 21 #define BMI088_ACC_SENSOR_TIME_1 0x19
altb2 25:fe14dbcef82d 22 #define BMI088_ACC_SENSOR_TIME_2 0x1A
altb2 25:fe14dbcef82d 23
altb2 25:fe14dbcef82d 24
altb2 25:fe14dbcef82d 25 #define BMI088_ACC_INT_STAT_1 0x1D
altb2 25:fe14dbcef82d 26
altb2 25:fe14dbcef82d 27 #define BMI088_ACC_TEMP_MSB 0x22
altb2 25:fe14dbcef82d 28 #define BMI088_ACC_TEMP_LSB 0x23
altb2 25:fe14dbcef82d 29
altb2 25:fe14dbcef82d 30 #define BMI088_ACC_CONF 0x40
altb2 25:fe14dbcef82d 31 #define BMI088_ACC_RANGE 0x41
altb2 25:fe14dbcef82d 32
altb2 25:fe14dbcef82d 33 #define BMI088_ACC_INT1_IO_CTRL 0x53
altb2 25:fe14dbcef82d 34 #define BMI088_ACC_INT2_IO_CTRL 0x54
altb2 25:fe14dbcef82d 35 #define BMI088_ACC_INT_MAP_DATA 0x58
altb2 25:fe14dbcef82d 36
altb2 25:fe14dbcef82d 37 #define BMI088_ACC_SELF_TEST 0x6D
altb2 25:fe14dbcef82d 38
altb2 25:fe14dbcef82d 39 #define BMI088_ACC_PWR_CONF 0x7C
altb2 25:fe14dbcef82d 40 #define BMI088_ACC_PWR_CTRl 0x7D
altb2 25:fe14dbcef82d 41
altb2 25:fe14dbcef82d 42 #define BMI088_ACC_SOFT_RESET 0x7E
altb2 25:fe14dbcef82d 43
altb2 25:fe14dbcef82d 44 #define BMI088_GYRO_ADDRESS 0x68
altb2 25:fe14dbcef82d 45
altb2 25:fe14dbcef82d 46 #define BMI088_GYRO_CHIP_ID 0x00 // Default value 0x0F
altb2 25:fe14dbcef82d 47
altb2 25:fe14dbcef82d 48 #define BMI088_GYRO_RATE_X_LSB 0x02
altb2 25:fe14dbcef82d 49 #define BMI088_GYRO_RATE_X_MSB 0x03
altb2 25:fe14dbcef82d 50 #define BMI088_GYRO_RATE_Y_LSB 0x04
altb2 25:fe14dbcef82d 51 #define BMI088_GYRO_RATE_Y_MSB 0x05
altb2 25:fe14dbcef82d 52 #define BMI088_GYRO_RATE_Z_LSB 0x06
altb2 25:fe14dbcef82d 53 #define BMI088_GYRO_RATE_Z_MSB 0x07
altb2 25:fe14dbcef82d 54
altb2 25:fe14dbcef82d 55 #define BMI088_GYRO_INT_STAT_1 0x0A
altb2 25:fe14dbcef82d 56
altb2 25:fe14dbcef82d 57 #define BMI088_GYRO_RANGE 0x0F
altb2 25:fe14dbcef82d 58 #define BMI088_GYRO_BAND_WIDTH 0x10
altb2 25:fe14dbcef82d 59
altb2 25:fe14dbcef82d 60 #define BMI088_GYRO_LPM_1 0x11
altb2 25:fe14dbcef82d 61
altb2 25:fe14dbcef82d 62 #define BMI088_GYRO_SOFT_RESET 0x14
altb2 25:fe14dbcef82d 63
altb2 25:fe14dbcef82d 64 #define BMI088_GYRO_INT_CTRL 0x15
altb2 25:fe14dbcef82d 65 #define BMI088_GYRO_INT3_INT4_IO_CONF 0x16
altb2 25:fe14dbcef82d 66 #define BMI088_GYRO_INT3_INT4_IO_MAP 0x18
altb2 25:fe14dbcef82d 67
altb2 25:fe14dbcef82d 68 #define BMI088_GYRO_SELF_TEST 0x3C
altb2 25:fe14dbcef82d 69
altb2 25:fe14dbcef82d 70
altb2 25:fe14dbcef82d 71 enum device_type_t { // device type
altb2 25:fe14dbcef82d 72 ACC = 0x00, //
altb2 25:fe14dbcef82d 73 GYRO = 0x01, //
altb2 25:fe14dbcef82d 74 };
altb2 25:fe14dbcef82d 75
altb2 25:fe14dbcef82d 76 enum acc_scale_type_t { // measurement rage
altb2 25:fe14dbcef82d 77 RANGE_3G = 0x00, //
altb2 25:fe14dbcef82d 78 RANGE_6G = 0x01, //
altb2 25:fe14dbcef82d 79 RANGE_12G = 0x02, //
altb2 25:fe14dbcef82d 80 RANGE_24G = 0x03, //
altb2 25:fe14dbcef82d 81 };
altb2 25:fe14dbcef82d 82
pmic 29:cd963a6d31c5 83 enum acc_odr_type_t { // Normal fg(Hz) | OSR2 fg(Hz) | OSR4 fg(Hz) <- output data rate
pmic 29:cd963a6d31c5 84 ODR_12 = 0x05, // 5 2 1
pmic 29:cd963a6d31c5 85 ODR_25 = 0x06, // 10 5 3
pmic 29:cd963a6d31c5 86 ODR_50 = 0x07, // 20 9 5
pmic 29:cd963a6d31c5 87 ODR_100 = 0x08, // 40 19 10
pmic 29:cd963a6d31c5 88 ODR_200 = 0x09, // 80 38 20
pmic 29:cd963a6d31c5 89 ODR_400 = 0x0A, // 145 75 40
pmic 29:cd963a6d31c5 90 ODR_800 = 0x0B, // 230xy/200z 140 80
pmic 29:cd963a6d31c5 91 ODR_1600 = 0x0C, // 280xy/245z 234xy/215z 145
altb2 25:fe14dbcef82d 92 };
altb2 25:fe14dbcef82d 93
altb2 25:fe14dbcef82d 94 enum acc_power_type_t { // power mode
altb2 25:fe14dbcef82d 95 ACC_ACTIVE = 0x00, //
altb2 25:fe14dbcef82d 96 ACC_SUSPEND = 0x03, //
altb2 25:fe14dbcef82d 97 };
altb2 25:fe14dbcef82d 98
altb2 25:fe14dbcef82d 99 enum gyro_scale_type_t { // measurement rage
altb2 25:fe14dbcef82d 100 RANGE_2000 = 0x00, //
altb2 25:fe14dbcef82d 101 RANGE_1000 = 0x01, //
altb2 25:fe14dbcef82d 102 RANGE_500 = 0x02, //
altb2 25:fe14dbcef82d 103 RANGE_250 = 0x03, //
altb2 25:fe14dbcef82d 104 RANGE_125 = 0x04, //
altb2 25:fe14dbcef82d 105 };
altb2 25:fe14dbcef82d 106
altb2 25:fe14dbcef82d 107 enum gyro_odr_type_t { // output data rate
altb2 25:fe14dbcef82d 108 ODR_2000_BW_532 = 0x00, //
altb2 25:fe14dbcef82d 109 ODR_2000_BW_230 = 0x01, //
altb2 25:fe14dbcef82d 110 ODR_1000_BW_116 = 0x02, //
altb2 25:fe14dbcef82d 111 ODR_400_BW_47 = 0x03, //
altb2 25:fe14dbcef82d 112 ODR_200_BW_23 = 0x04, //
altb2 25:fe14dbcef82d 113 ODR_100_BW_12 = 0x05, //
altb2 25:fe14dbcef82d 114 ODR_200_BW_64 = 0x06, //
altb2 25:fe14dbcef82d 115 ODR_100_BW_32 = 0x07, //
altb2 25:fe14dbcef82d 116 };
altb2 25:fe14dbcef82d 117
altb2 25:fe14dbcef82d 118 enum gyro_power_type_t { // power mode
altb2 25:fe14dbcef82d 119 GYRO_NORMAL = 0x00, //
altb2 25:fe14dbcef82d 120 GYRO_SUSPEND = 0x80, //
altb2 25:fe14dbcef82d 121 GYRO_DEEP_SUSPEND = 0x20, //
altb2 25:fe14dbcef82d 122 };
altb2 25:fe14dbcef82d 123
altb2 25:fe14dbcef82d 124 class BMI088
altb2 25:fe14dbcef82d 125 {
altb2 25:fe14dbcef82d 126 public:
altb2 25:fe14dbcef82d 127
altb2 25:fe14dbcef82d 128 // Constructor
altb2 25:fe14dbcef82d 129 BMI088(I2C& i2c);
altb2 25:fe14dbcef82d 130
altb2 25:fe14dbcef82d 131 // Deconstructor
altb2 25:fe14dbcef82d 132 //virtual ~BMI088();
altb2 25:fe14dbcef82d 133
altb2 25:fe14dbcef82d 134 // Methods
altb2 25:fe14dbcef82d 135 bool isConnection(void);
altb2 25:fe14dbcef82d 136
altb2 25:fe14dbcef82d 137 void initialize(void);
altb2 25:fe14dbcef82d 138
altb2 25:fe14dbcef82d 139
altb2 25:fe14dbcef82d 140 void setAccPowerMode(acc_power_type_t mode);
altb2 25:fe14dbcef82d 141 void setGyroPowerMode(gyro_power_type_t mode);
altb2 25:fe14dbcef82d 142
altb2 25:fe14dbcef82d 143 void setAccScaleRange(acc_scale_type_t range);
altb2 25:fe14dbcef82d 144 void setAccOutputDataRate(acc_odr_type_t odr);
pmic 29:cd963a6d31c5 145 void setAccOutputDataRateOSR2(acc_odr_type_t odr);
pmic 29:cd963a6d31c5 146 void setAccOutputDataRateOSR4(acc_odr_type_t odr);
altb2 25:fe14dbcef82d 147
altb2 25:fe14dbcef82d 148 void setGyroScaleRange(gyro_scale_type_t range);
altb2 25:fe14dbcef82d 149 void setGyroOutputDataRate(gyro_odr_type_t odr);
altb2 25:fe14dbcef82d 150
altb2 25:fe14dbcef82d 151 void getAcceleration(float* x, float* y, float* z);
altb2 25:fe14dbcef82d 152 float getAccelerationX(void);
altb2 25:fe14dbcef82d 153 float getAccelerationY(void);
altb2 25:fe14dbcef82d 154 float getAccelerationZ(void);
altb2 25:fe14dbcef82d 155
altb2 25:fe14dbcef82d 156 void getGyroscope(float* x, float* y, float* z);
altb2 25:fe14dbcef82d 157 float getGyroscopeX(void);
altb2 25:fe14dbcef82d 158 float getGyroscopeY(void);
altb2 25:fe14dbcef82d 159 float getGyroscopeZ(void);
altb2 25:fe14dbcef82d 160
altb2 25:fe14dbcef82d 161 int16_t getTemperature(void);
altb2 25:fe14dbcef82d 162
altb2 25:fe14dbcef82d 163 uint8_t getAccID(void);
altb2 25:fe14dbcef82d 164 uint8_t getGyroID(void);
altb2 25:fe14dbcef82d 165
altb2 25:fe14dbcef82d 166 void resetAcc(void);
altb2 25:fe14dbcef82d 167 void resetGyro(void);
altb2 25:fe14dbcef82d 168
altb2 25:fe14dbcef82d 169 void readAccel(void);
altb2 25:fe14dbcef82d 170 void readGyro(void);
altb2 25:fe14dbcef82d 171 float gyroX, gyroY, gyroZ; // x, y, and z axis readings of the gyroscope (float value)
pmic 27:973e495f4711 172 float accX, accY, accZ; // x, y, and z axis readings of the accelerometer (float value)
altb2 25:fe14dbcef82d 173
altb2 25:fe14dbcef82d 174 private:
altb2 25:fe14dbcef82d 175
altb2 25:fe14dbcef82d 176 // Methods
altb2 25:fe14dbcef82d 177 void write8(device_type_t dev, uint8_t reg, uint8_t val);
altb2 25:fe14dbcef82d 178 uint8_t read8(device_type_t dev, uint8_t reg);
altb2 25:fe14dbcef82d 179 uint16_t read16(device_type_t dev, uint8_t reg);
altb2 25:fe14dbcef82d 180 uint16_t read16Be(device_type_t dev, uint8_t reg);
altb2 25:fe14dbcef82d 181 uint32_t read24(device_type_t dev, uint8_t reg);
altb2 25:fe14dbcef82d 182 void read(device_type_t dev, uint8_t reg, uint8_t *buf, uint16_t len);
altb2 25:fe14dbcef82d 183
altb2 25:fe14dbcef82d 184 // Class Variables
altb2 25:fe14dbcef82d 185 I2C *i2c;
altb2 25:fe14dbcef82d 186 uint16_t begin();
altb2 25:fe14dbcef82d 187
altb2 25:fe14dbcef82d 188 float accRange;
altb2 25:fe14dbcef82d 189 float gyroRange;
altb2 25:fe14dbcef82d 190 uint8_t devAddrAcc;
altb2 25:fe14dbcef82d 191 uint8_t devAddrGyro;
altb2 25:fe14dbcef82d 192 };
altb2 25:fe14dbcef82d 193
altb2 25:fe14dbcef82d 194 //extern BMI088 bmi088;
altb2 25:fe14dbcef82d 195
altb2 25:fe14dbcef82d 196 #endif