MPU9250配置及原始数据读取
1. 初始化:
(1)对部分寄存器进行了解:
#define SMPLRT_DIV 0X19 //陀螺仪采样率典型值为0X07 1000/(1+7)=125HZ
#define CONFIG 0X1A //低通滤波器 典型值0x06 5hz
#define GYRO_CONFIG 0X1B //陀螺仪测量范围 0X18 正负2000度
#define ACCEL_CONFIG 0X1C //加速度计测量范围 0X18 正负16g
#define ACCEL_CONFIG2 0X1D //加速度计低通滤波器 0x06 5hz
#define PWR_MGMT_1 0X6B//电源管理1 典型值为0x00
#define PWR_MGMT_2 0X6C //电源管理2 典型值为0X00
#define WHO_AM_I 0X75 //器件ID MPU9250默认ID为0X71
#define USER_CTRL 0X6A //用户配置当为0X10时使用SPI模式
#define MPU9250_CS PDout(3) //MPU9250片选信号
#define I2C_ADDR 0X68 //i2c的地址
#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
当然以上的都是把数据手册的地址进行定义
(2)初始化配置
先看一下数据手册
即存在MPU9250就可以从这个地址中读出固定ID :0x71
即陀螺仪采样率=1000/1+SMPLRT_DIV
加速度计测量范围配置
加速度采样频率配置
接下来就是实现代码
//MPU9250初始化
int MPU9250_Init(void)
{
uint8_t value;
I2CReadBytes(I2C_ADDR,(WHO_AM_I|0x80),1,&value);//获取器件ID
if(value==0x71)
{
I2CWriteBytes(I2C_ADDR,PWR_MGMT_1,1,0X80); //电源管理,复位MPU9250
DBG_PRINTF("MPU9250Inint OK!!!\n");
I2CWriteBytes(I2C_ADDR,SMPLRT_DIV,1,0x07);//陀螺仪采样率1000/(1+7)=125HZ
I2CWriteBytes(I2C_ADDR,CONFIG,1,0X06); //低通滤波器 0x06 5hz
I2CWriteBytes(I2C_ADDR,ACCEL_CONFIG,1,0x18); //加速度计测量范围 0X18 正负16g
I2CWriteBytes(I2C_ADDR,ACCEL_CONFIG2,1,0x00); //加速度采样频率460HZ
return 0;
}
return 1;
}
2.读取数据
这里 贴出加速度XYZ轴的寄存器数据手册,接下来就是,温度,然后角速度XYZ轴,地址是连续的。
/*MPU9250数据读取*/
int MPU9250_ReadValues(void *bleData)
{
struct sensor_9axis_data *tmp=NULL;
int8_t MPU9250_buf[14];
tmp = (struct sensor_9axis_data *) bleData;
I2CReadBytes(I2C_ADDR,(ACCEL_XOUT_H),14,MPU9250_buf);
MPU9250_ACC_LAST.X = ((int16_t)MPU9250_buf[0]<<8)| MPU9250_buf[1];//加速度原始数据
MPU9250_ACC_LAST.Y = ((int16)MPU9250_buf[2]<<8)| MPU9250_buf[3];
MPU9250_ACC_LAST.Z = ((int16)MPU9250_buf[4]<<8)| MPU9250_buf[5];
MPU9250_TEMP_LAST = ((int16)MPU9250_buf[6]<<8) |MPU9250_buf[7];//温度
MPU9250_GYRO_LAST.X = ((int16)MPU9250_buf[8]<<8)| MPU9250_buf[9];//角速度原始数据
MPU9250_GYRO_LAST.Y = ((int16)MPU9250_buf[10]<<8)| MPU9250_buf[11];
MPU9250_GYRO_LAST.Z = ((int16)MPU9250_buf[12]<<8)| MPU9250_buf[13];
return 0;
}