基于MPU9250的IMU库,可以测量pitch,roll,yaw,compass

imu.h

Committer:
adaphoto
Date:
2018-06-21
Revision:
0:35bba382318b
Child:
1:7cf70724bdb0

File content as of revision 0:35bba382318b:

#ifndef __IMU_H_ADA
#define __IMU_H_ADA

#include "mbed.h"
#include "rtos.h"

#include "math.h"

#define M_PI  (float)3.1415926535
#define Kp     4.50f   // proportional gain governs rate of convergence to accelerometer/magnetometer
#define Ki     1.0f    // integral gain governs rate of convergence of gyroscope biases

// define MPU9250 register address
//****************************************
#define SMPLRT_DIV      0x19    //Sample Rate Divider. Typical values:0x07(125Hz) 1KHz internal sample rate
#define CONFIG          0x1A    //Low Pass Filter.Typical values:0x06(5Hz)
#define GYRO_CONFIG     0x1B    //Gyro Full Scale Select. Typical values:0x10(1000dps)
#define ACCEL_CONFIG    0x1C    //Accel Full Scale Select. Typical values:0x01(2g)

#define ACCEL_XOUT_H    0x3B
#define ACCEL_XOUT_L    0x3C
#define ACCEL_YOUT_H    0x3D
#define ACCEL_YOUT_L    0x3E
#define ACCEL_ZOUT_H    0x3F
#define ACCEL_ZOUT_L    0x40

#define TEMP_OUT_H      0x41
#define TEMP_OUT_L      0x42

#define GYRO_XOUT_H     0x43
#define GYRO_XOUT_L     0x44    
#define GYRO_YOUT_H     0x45
#define GYRO_YOUT_L     0x46
#define GYRO_ZOUT_H     0x47
#define GYRO_ZOUT_L     0x48

        
#define MAG_XOUT_L      0x03
#define MAG_XOUT_H      0x04
#define MAG_YOUT_L      0x05
#define MAG_YOUT_H      0x06
#define MAG_ZOUT_L      0x07
#define MAG_ZOUT_H      0x08


#define PWR_MGMT_1      0x6B    //Power Management. Typical values:0x00(run mode)
#define WHO_AM_I        0x75  //identity of the device


#define GYRO_ADDRESS   0xD0   //Gyro and Accel device address
#define MAG_ADDRESS    0x18   //compass device address
#define ACCEL_ADDRESS  0xD0 

#define ADDRESS_AD0_LOW     0xD0 //address pin low (GND), default for InvenSense evaluation board
#define ADDRESS_AD0_HIGH    0xD1 //address pin high (VCC)
#define DEFAULT_ADDRESS     GYRO_ADDRESS
#define WHO_AM_I_VAL        0x73 //identity of MPU9250 is 0x71. identity of MPU9255 is 0x73.

    typedef struct
    {
        int16_t X;
        int16_t Y;
        int16_t Z;
    }MPU9250_TypeDef;
    
    typedef struct
    {
        int16_t X_Off_Err;
        int16_t Y_Off_Err;
        int16_t Z_Off_Err;
    }MPU9250_TypeDef_Off;
    
    typedef struct
    {
        uint8_t Index;
        int16_t AvgBuffer[8];
    }MPU9250_AvgTypeDef;

class IMU 
{
    
    public:
    void IMU_Init();
    void IMU_GetYawPitchRoll(float*Angles);
    //MPU9255
    void MPU9250_Init();
    void MPU9250_READ_ACCEL();
    void MPU9250_READ_GYRO();
    void MPU9250_READ_MAG();
    bool MPU9250_Check();
    void MPU9250_CalAvgValue(uint8_t *pIndex, int16_t *pAvgBuffer, int16_t InVal, int32_t *pOutVal);
    void MPU9250_InitGyrOffset();
    
    int16_t accel[3], gyro[3], magn[3];
    
    private:
    
    char    BUF[10];
    //int16_t accel[3], gyro[3], magn[3];
    float   angles[3];
    float   q0, q1, q2, q3;
    MPU9250_TypeDef     MPU9250_Offset;//={0};
    MPU9250_TypeDef_Off MPU9250_Magn_Offset;//={0};
    
    float   invSqrt(float x);
    void    IMU_AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz);
    void    IMU_GetQuater(void);
    
    //void    MPU9250_CalAvgValue(uint8_t *pIndex, int16_t *pAvgBuffer, int16_t InVal, int32_t *pOutVal);
    
    void    I2C_WriteOneByte(uint8_t DevAddr, uint8_t RegAddr, uint8_t Data);
    uint8_t I2C_ReadOneByte(uint8_t DevAddr, uint8_t RegAddr);
};

#endif