MPU9250调试

MPU9250 芯片概述

MPU9250芯片是一个9轴姿态传感芯片,其中包含了3轴加速度传感器、3轴角速度传感器以及三轴磁力计。

其本质上是MPU6050芯片+AK8963。

可以获取传感芯片的加速度、角速度、以及磁力值。

角速度可以知芯片的转动速度,加速度可以知道芯片运动的距离、速度情况,而磁力计可以知道物芯片的运动方向。

另外MPU9250芯片内置DMP姿态融合器,可以在不涉及算法的情况下,直接读取出描述物体状态的四元数,从而得出物体的三维角度--航向角、翻滚角、俯仰角。

驱动程序的设计

由于MPU9250芯片使用的是I2C接口,所以在这里,我首先需要I2C的驱动。

在我的驱动中,I2C使用GPIO口模拟的,因为这样在以后移植时更加方便。

在完成IOI2C的驱动之后,就是对MPU9250的寄存器进行操作,来成功获取传感数据。

MPU9250的寄存器操作

操作MPU9250寄存器并且开启DMP模式,获取三维角度,其步骤如下:

  1. 复位,配置PWR_MGMT_1 0x80,延时一段时间
  2. 配置PWR_MGMT_1(一般为00,表示使用内部晶振20Mhz)
  3. 设置采样频率
  4. 设置量程(角速度、加速度量程)
  5. 外部中断打开,并且配置成相应的工作方式
  6. 开启DMP,以及FIFO

其中DMP的开启需要密码,而且具体的操作方法及寄存器在数据手册上都无法找到,是本人在网站经过查找融合了多人的驱动调试出来的。

代码调用

本人将调通之后的代码整理之后,只需调用几个API就可以实现参数的获取了。

主要分为两步:

  1. 初始化
	IIC_Init();//模拟I2C驱动的初始化,一定要先初始化I2C接口才能操作MPU9250芯片

	Init_MPU9250_With_DMP();//初始化MPU9250,配置并且开启DMP,设置中断方式为加速度方式
  1. 函数调用
while(1)
{
fifo_count = MPU9250_getFIFOCount();//读取FIFO计数 if(fifo_count >= 0x0200)//如果FIFO值>0x0200,此时DMP的结果错误,直接复位FIFO
{
MPU9250_resetFIFO();
}
else
{ if(fifo_count >= 0x2a)//如果FIFO值 > 0x2a,此时DMP转换完成并且数值正常
{
readdmp(); //首先要读取DMP FIFO,读取之后才能进行计算姿态的操作
MPU9250_resetFIFO();
getyawpitchroll();//计算并且获取yaw、pitch、roll,结果保存在yprf[3]数组中 }
}
}

NOTE:

  • 在判断DMP是否完成时,应当从FIFO的计数中去判断,当计数大于等于42,说明DMP转换完成,也可以采用中断的方式来作为标志。

  • 本例程中使用的I2C为GPIO模拟的I2C,主要是移植方便,但是在将此驱动移植到不同平台时需要注意寄存器以及引脚的定义。

  • 注意芯片上电之后需要先复位,即设置PWR_MGMT_1为0x80,过一段时间之后再设置为0x00,否则有时芯片会工作异常

具体的程序在我的代码库中,如果大家发现其中的问题,欢迎E-mail给我。

代码链接如下:

MPU9250-MPU6050驱动

上一篇:项目中必须知道的关于CSS+DIV的常识


下一篇:java 27 - 2 反射之 反射的概述以及获取Class文件对象的方式