AHRS

Dependencies:   Eigen

Dependents:   IndNav_QK3_T265

BMI088.h

Committer:
pmic
Date:
2020-01-27
Revision:
30:9b0cd3caf0ec
Parent:
29:cd963a6d31c5

File content as of revision 30:9b0cd3caf0ec:

#ifndef BMI088_H
#define BMI088_H

#include <stdint.h>
#include "mbed.h"

#define BMI088_ACC_ADDRESS              0x18

#define BMI088_ACC_CHIP_ID              0x00 // Default value 0x1E
#define BMI088_ACC_ERR_REG              0x02
#define BMI088_ACC_STATUS               0x03

#define BMI088_ACC_X_LSB                0x12
#define BMI088_ACC_X_MSB                0x13
#define BMI088_ACC_Y_LSB                0x14
#define BMI088_ACC_Y_MSB                0x15
#define BMI088_ACC_Z_LSB                0x16
#define BMI088_ACC_Z_MSB                0x17

#define BMI088_ACC_SENSOR_TIME_0        0x18
#define BMI088_ACC_SENSOR_TIME_1        0x19
#define BMI088_ACC_SENSOR_TIME_2        0x1A


#define BMI088_ACC_INT_STAT_1           0x1D

#define BMI088_ACC_TEMP_MSB             0x22
#define BMI088_ACC_TEMP_LSB             0x23

#define BMI088_ACC_CONF                 0x40
#define BMI088_ACC_RANGE                0x41

#define BMI088_ACC_INT1_IO_CTRL         0x53
#define BMI088_ACC_INT2_IO_CTRL         0x54
#define BMI088_ACC_INT_MAP_DATA         0x58

#define BMI088_ACC_SELF_TEST            0x6D

#define BMI088_ACC_PWR_CONF             0x7C
#define BMI088_ACC_PWR_CTRl             0x7D

#define BMI088_ACC_SOFT_RESET           0x7E

#define BMI088_GYRO_ADDRESS             0x68

#define BMI088_GYRO_CHIP_ID             0x00 // Default value 0x0F

#define BMI088_GYRO_RATE_X_LSB          0x02
#define BMI088_GYRO_RATE_X_MSB          0x03
#define BMI088_GYRO_RATE_Y_LSB          0x04
#define BMI088_GYRO_RATE_Y_MSB          0x05
#define BMI088_GYRO_RATE_Z_LSB          0x06
#define BMI088_GYRO_RATE_Z_MSB          0x07

#define BMI088_GYRO_INT_STAT_1          0x0A

#define BMI088_GYRO_RANGE               0x0F
#define BMI088_GYRO_BAND_WIDTH          0x10

#define BMI088_GYRO_LPM_1               0x11

#define BMI088_GYRO_SOFT_RESET          0x14

#define BMI088_GYRO_INT_CTRL            0x15
#define BMI088_GYRO_INT3_INT4_IO_CONF   0x16
#define BMI088_GYRO_INT3_INT4_IO_MAP    0x18

#define BMI088_GYRO_SELF_TEST           0x3C


enum device_type_t { // device type
    ACC = 0x00, //
    GYRO = 0x01, //
};

enum acc_scale_type_t { // measurement rage
    RANGE_3G = 0x00, //
    RANGE_6G = 0x01, //
    RANGE_12G = 0x02, //
    RANGE_24G = 0x03, //
};

enum acc_odr_type_t { // Normal fg(Hz) | OSR2 fg(Hz) | OSR4 fg(Hz) <- output data rate
    ODR_12 = 0x05,    //          5             2             1
    ODR_25 = 0x06,    //         10             5             3
    ODR_50 = 0x07,    //         20             9             5
    ODR_100 = 0x08,   //         40            19            10
    ODR_200 = 0x09,   //         80            38            20
    ODR_400 = 0x0A,   //        145            75            40
    ODR_800 = 0x0B,   // 230xy/200z           140            80
    ODR_1600 = 0x0C,  // 280xy/245z    234xy/215z           145
};

enum acc_power_type_t { // power mode
    ACC_ACTIVE = 0x00, //
    ACC_SUSPEND = 0x03, //
};

enum gyro_scale_type_t { // measurement rage
    RANGE_2000 = 0x00, //
    RANGE_1000 = 0x01, //
    RANGE_500 = 0x02, //
    RANGE_250 = 0x03, //
    RANGE_125 = 0x04, //
};

enum gyro_odr_type_t { // output data rate
    ODR_2000_BW_532 = 0x00, //
    ODR_2000_BW_230 = 0x01, //
    ODR_1000_BW_116 = 0x02, //
    ODR_400_BW_47 = 0x03, //
    ODR_200_BW_23 = 0x04, //
    ODR_100_BW_12 = 0x05, //
    ODR_200_BW_64 = 0x06, //
    ODR_100_BW_32 = 0x07, //
};

enum gyro_power_type_t { // power mode
    GYRO_NORMAL = 0x00, //
    GYRO_SUSPEND = 0x80, //
    GYRO_DEEP_SUSPEND = 0x20, //
};

class BMI088
{
public:

    // Constructor
    BMI088(I2C& i2c);

    // Deconstructor
    //virtual ~BMI088();

    // Methods
    bool isConnection(void);

    void initialize(void);


    void setAccPowerMode(acc_power_type_t mode);
    void setGyroPowerMode(gyro_power_type_t mode);

    void setAccScaleRange(acc_scale_type_t range);
    void setAccOutputDataRate(acc_odr_type_t odr);
    void setAccOutputDataRateOSR2(acc_odr_type_t odr);
    void setAccOutputDataRateOSR4(acc_odr_type_t odr);

    void setGyroScaleRange(gyro_scale_type_t range);
    void setGyroOutputDataRate(gyro_odr_type_t odr);

    void getAcceleration(float* x, float* y, float* z);
    float getAccelerationX(void);
    float getAccelerationY(void);
    float getAccelerationZ(void);

    void getGyroscope(float* x, float* y, float* z);
    float getGyroscopeX(void);
    float getGyroscopeY(void);
    float getGyroscopeZ(void);

    int16_t getTemperature(void);

    uint8_t getAccID(void);
    uint8_t getGyroID(void);

    void resetAcc(void);
    void resetGyro(void);
    
    void readAccel(void);
    void readGyro(void);
    float gyroX, gyroY, gyroZ; // x, y, and z axis readings of the gyroscope (float value)
    float accX, accY, accZ; // x, y, and z axis readings of the accelerometer (float value)

private:

    // Methods
    void write8(device_type_t dev, uint8_t reg, uint8_t val);
    uint8_t read8(device_type_t dev, uint8_t reg);
    uint16_t read16(device_type_t dev, uint8_t reg);
    uint16_t read16Be(device_type_t dev, uint8_t reg);
    uint32_t read24(device_type_t dev, uint8_t reg);
    void read(device_type_t dev, uint8_t reg, uint8_t *buf, uint16_t len);

    // Class Variables
    I2C *i2c;
    uint16_t begin();

    float accRange;
    float gyroRange;
    uint8_t devAddrAcc;
    uint8_t devAddrGyro;
};

//extern BMI088 bmi088;

#endif