ICM20948+madgwickフィルター 地磁気は不使用で6軸のみ使用 最初5s静置してジャイロのオフセットを求めキャリブレーション 地磁気を測らないためヨー軸ドリフトがあるが,緩やかに動かせば2,3分程度はヨー軸も正しい値を測定できた

Dependencies:   mbed MadgwickFilter

ICM20948.hpp

Committer:
hiramitsu
Date:
2021-10-18
Revision:
0:ce9707156696

File content as of revision 0:ce9707156696:

#ifndef ICM20948_HPP
#define ICM20948_HPP


// USER BANK 0
#define ICM20948_WHO_AM_I         0x00 // Should return 0xEA
#define ICM20948_PWR_MGMT_1       0x06  // Device defaults to the SLEEP mode
#define ICM20948_PWR_MGMT_2       0x07
#define ICM20948_ACCEL_XOUT_H     0x2D
#define ICM20948_ACCEL_XOUT_L     0x2E
#define ICM20948_ACCEL_YOUT_H     0x2F
#define ICM20948_ACCEL_YOUT_L     0x30
#define ICM20948_ACCEL_ZOUT_H     0x31
#define ICM20948_ACCEL_ZOUT_L     0x32
#define ICM20948_GYRO_XOUT_H      0x33
#define ICM20948_GYRO_XOUT_L      0x34
#define ICM20948_GYRO_YOUT_H      0x35
#define ICM20948_GYRO_YOUT_L      0x36
#define ICM20948_GYRO_ZOUT_H      0x37
#define ICM20948_GYRO_ZOUT_L      0x38
#define ICM20948_TEMP_OUT_H       0x39
#define ICM20948_TEMP_OUT_L       0x3A

// USER BANK 2
#define ICM20948_GYRO_SMPLRT_DIV  0x00
#define ICM20948_GYRO_CONFIG_1    0x01
#define ICM20948_ACCEL_SMPLRT_DIV_2 0x11
#define ICM20948_ACCEL_CONFIG     0x14

// COMMON
#define ICM20948_REG_BANK_SEL     0x7F

// OTHER
#define USER_BANK_0               0x00
#define USER_BANK_1               0x10
#define USER_BANK_2               0x20
#define USER_BANK_3               0x30

// ジャイロのレンジは2:1bitの値に相当
// ジャイロのモジュール内ローパスフィルタは5:3,0bitに相当
#define GYRO_RATE_250             0x00
#define GYRO_RATE_500             0x02
#define GYRO_RATE_1000            0x04
#define GYRO_RATE_2000            0x06
#define GYRO_LPF_OFF              0x00
#define GYRO_LPF_230Hz            0x01
#define GYRO_LPF_17Hz             0x29
#define GYRO_SMPLRT_100Hz         0x0A

// 加速度のレンジは2:1bitの値に相当
// 加速度のモジュール内ローパスフィルタは5:3,0bitに相当
#define ACC_RATE_2g               0x00
#define ACC_RATE_4g               0x02
#define ACC_RATE_8g               0x04
#define ACC_RATE_16g              0x06
#define ACC_LPF_OFF               0x00
#define ACC_LPF_136HZ             0x11
#define ACC_SMPLRT_100Hz          0x0A



 
// Using the GY-521 breakout board, I set ADO to 0 by grounding through a 4k7 resistor
// Seven-bit device address is 110100 for ADO = 0 and 110101 for ADO = 1
#define ADO 0
#if ADO
#define ICM20948_slave_addr 0x69<<1  // Device address when ADO = 1
#else
#define ICM20948_slave_addr 0x68<<1  // Device address when ADO = 0
#endif
 
#define IMU_ONE_G 9.80665
//#define ICM20948_slave_addr          0xD0
extern float aRes, gRes; 
extern Serial pc;
 
class ICM20948 {
    public:
        ICM20948();
        ~ICM20948();
         
        void ICM_WriteByte(uint8_t ICM20948_reg, uint8_t ICM20948_data);
        uint8_t ICM_ReadByte(uint8_t ICM20948_reg);
        void    whoAmI();
        void    powerOn();
        void    init();
        void    gyroCalib();
        void    getAccGyro(float acc[3], float gyro[3]);
        int16_t getIMUTemp();
    private:
        float aRes, gRes;
        float gyroBias[3];
};

#endif