MPU6050/MPU9150传感器的DMP数据读取中遇到的问题总结

MPU6050/MPU9150传感器的DMP数据读取中遇到的问题总结

源代码的问题,本文就不啰嗦了,大家参考正点原子的MPU6050例程即可。MPU9150和MPU6050用一模一样的代码就可以。
本文只罗列在DMP使用过程中遇到的坑和解法。

问题1:MPU6050的AD0引脚接了3.3V,器件地址在程序中设置了是0X69,但是初始化不成功/h2>

首先,一般的初始化代码大致如下:

大家可以在这段初始化代码里设置断点,看看问题发生在哪个位置!

解法1:

  • 若是在”if(res==MPU_ADDR) “这句话以前就发生问题了,那么应该是I2C的设置有问题,连线出错了,或者是电源电压,总之硬件和软件I2C的配置应该有问题。
  • 若是问题发生在”if(res==MPU_ADDR) “,那么大家可以打印出”res”这个变量,这个变量的值应该是0X68。因此,肯定和我们设置好的”MPU_ADDR=0X69″不符了,自然初始化就运行不下去了。这时候解决方法很简单:

至于为什么AD0接了3.3V,器件返回的地址还是0X68/strong>
这个其实是我们自己弄混了。器件地址就是0X68,这是内置的。至于我们通过AD0接了3.3V,改变的只是器件的操作地址,我们必须通过0X69来操作器件了。而器件自己认为自己的地址还是0X68。

问题2:AD0引脚接了3.3V,MPU6050初始化成功,但是DMP的初始化(mpu_dmp_init)失败,导致欧拉角数据全为0/h2>

mpu_dmp_init函数的代码如下:

老实说,这段代码写得很瞎。没想到这还是官方提供的。我们先分析一下这段代码:

这句话说明,mpu_init()返回值是0时,才执行if语句内部的DMP初始化命令,也就是说mpu_init()返回值必须是0啊,要是不是0,连DMP初始化命令都不执行,那DMP初始化肯定失败呀。

但是,往下看你会发现,要是mpu_init()返回值不是0的话,不执行if语句,那么就直接跳到return 0这句话上了。而返回值为0,代表的是初始化正常。。。

看到这,我真是无语了。。。我之前一直认为DMP初始化成功了,只是数据读不出来。结果发现这里有问题,我也是费了好大一番劲呢。

解法2:

我遇到的问题是mpu_init()返回值不是0,然后直接没有运行DMP的初始化命令。
首先,MPU初始化成功了,另外原始数据也可以读到,可以说明I2C应该没有问题。应该问题就是出在DMP初始化上了。
一步步的追溯发现了问题的根源:

我发现在上面这句if语句中出错了,返回了-1。于是,我进一步查看了st.hw->addr这个变量的数值,发现这个变量被设置成了0X68。。。
我的AD0引脚接了3.3V了啊,这里必须得是0X69呀,于是我改成了0X69。一切都恢复正常了,可以读到欧拉角数据了。

这里我不得不再吐槽吐槽,这个地方的地址要改,怎么从来没有人说过呢br> 改的位置,我告诉大家:

问题3:MPU6050初始化成功,DMP的初始化成功,但读出来的欧拉角数据全为0/h2>

解法3:

这个问题很常见,就是FIFO溢出导致的。大家可以缩短读取数据的间隔时间,避免数据溢出。

试试看这句话,如果是因为FIFO溢出的话,写上这句话,肯定就能读出来了。

总结

MPU6050/MPU9150的数据读取阶段可以分成:

  • I2C配置
  • MPU6050/MPU9150的初始化
  • DMP功能初始化
  • 读取原始数据和欧拉角

问题可能出现的位置:

  • MPU6050/MPU9150的初始化就不成功,那么需要检查I2C的问题了,或者是地址的配置问题,硬件层面的问题可能性很大。
  • 读取原始数据可以,但欧拉角不行。那说明 MPU6050/MPU9150的初始化成功了,I2C应该也没什么问题,那就是DMP配置的问题了,这就是软件层面的问题了。
  • 如果DMP配置也没有问题,那么就是FIFO读取时候的问题了。这个容易解决。

最后给大家一点小贴士,一点要用仿真器单步调试程序,定位出问题的位置,这样才能最快的解决问题。一味在网上搜索类似的问题,很可能现象相同,但是根本的原因又完全不同!

来源:西涯先生

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年5月1日
下一篇 2019年5月1日

相关推荐