极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 68347|回复: 26

MPU6050 DMP 库使用问题

[复制链接]
发表于 2013-5-8 17:23:29 | 显示全部楼层 |阅读模式
Hi,求助使用MPU6050 DMP库函数

[问题]: 使用MPU6050 DMP 库函数获得姿态信息的更新速率只有3Hz

[描述]:
硬件: Arduino Uno + MPU 6050
库函数及代码:https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050

直接运行范例程序:i2cdevlib / Arduino / MPU6050 / Examples / MPU6050_DMP6 /
                          (路径:https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050/Examples/MPU6050_DMP6      )
发现获得的姿态信息夹杂了大量的噪声

在程序里面添加了演示函数 delay(), 并设定延时,当延时时间大于300以后可以得到稳定的数据。

各位有没有相同的经历一起讨论一下。

目前大致可以知道是因为DMP的问题导致,但是还没有找到原因。
调试方案:
1. 在MPU_6050_6Axis_MotionApps20.h 中输出了所有DMP调试的判断语句,没有发现特别的错误信息。
2. 在MPU_6050_6Axis_MotionApps20.h, 更改了 Gyro的更新速率:
                    “DEBUG_PRINTLN(F("Setting sample rate to 200Hz..."));
                                   setRate(4); // 1khz / (1 + 4) = 200 Hz”

  发现可以提高更新速率到6Hz左右(delay演示设定为150,速率稳定)但是也无法再提高。
3. 运行i2cdevlib / Arduino / MPU6050 / Examples / MPU6050_raw /
(https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050/Examples/MPU6050_raw)  
  速率可以很快。
4. 波特率设定 38400, 更改到其他更低波特率如9600,没有改善。

分享一下在LabVIEW中通过串口通信接到做的3D显示:


   
                       

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-5-8 18:48:06 | 显示全部楼层
刷新频率有点低
回复 支持 反对

使用道具 举报

发表于 2013-5-8 20:18:28 | 显示全部楼层

--程序

LabVIEW中通过串口通信接到做的3D显示--程序能否分享下
回复 支持 反对

使用道具 举报

发表于 2013-5-8 21:15:11 | 显示全部楼层
虽然不太懂,噪声应该是会会在的,但一般平衡车的做法,是通过数据滤波、数据融合等方法,将数据变得稳定、可靠、可用。。。。
应该从降低底噪、噪声方面下功夫吧。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-8 22:54:57 | 显示全部楼层
如果delay设定是300ms,那么得到的数据都是准确的;如果delay设定是30ms,那么10个数据中只有一个是准的,中间的9个数据都是白噪声
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-9 00:59:21 | 显示全部楼层
目前可以定位问题出在 DMP的fifo数据读取上:
1.定位方法:
   代码中每次去检查fifo中是否够读取一次数据,如果够的话,就连续读取,这样可以获得比中断频率更高的更新速率,如果读取的不够迅速,那么就会报fifo的错误;在程序中发现如果出现fifo错误以后数据都是对的,所以在原来的代码中每次读取后就reset fifo, 并输出“fifo reset” 结果就每次都是对的。
可以最高到200Hz。
2. to-do:
    应该是fifo的问题,继续研究; 同时 Acc 最高速率就是1K,所以如果可以达到0.2K Hz 也差不多够用,也许加了算法以后 整体控制的速率达到0.2Hz 就可以。所以也是一个折中的解决方案,可以继续往下做其他的部分了。

大家一起讨论下。
回复 支持 反对

使用道具 举报

发表于 2013-5-9 17:51:09 | 显示全部楼层
我的MPU6050初始化只用了以后寄存器,0x6B-0x80;0x6B-0x03;0x1A- 0x00;0x1B- 0x18,根据MPU6050寄存器MAP介绍,我把它理解成采样频率是:
采样频率=陀螺仪输出频率/(1+SMPLRT_DIV)
            =8000/(1+0)=8K
我用这个设置,直接就是去了一个零飘,用PD控制能稳定做一个倒立摆!反之,如果我用DMP,去控制同样的倒立摆,还没有成功过!
所以,我倒觉得在一系列不稳定系统的控制当中,速率的重要性够大的........
回复 支持 反对

使用道具 举报

发表于 2013-5-9 21:08:54 | 显示全部楼层
本帖最后由 ironlee 于 2013-5-9 21:10 编辑
拾瑞 发表于 2013-5-9 17:51
我的MPU6050初始化只用了以后寄存器,0x6B-0x80;0x6B-0x03;0x1A- 0x00;0x1B- 0x18,根据MPU6050寄存器MAP介绍 ...


请问你的0X6B寄存器是写了两次?不是笔误么
还有,ACCEL_CONFIG不用初始化么
回复 支持 反对

使用道具 举报

发表于 2013-5-10 11:39:55 | 显示全部楼层
不是笔误!0x80是复位所有寄存器,0X03要查具体的寄存器MAP了,我记不清楚了;
0x1A- 0x00;0x1B- 0x18,是设置陀螺仪的,我没有设置ACCEL!ACC只有1KHZ,同样设置以后,出来的数据是无法与GYRO融合的!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-10 15:00:43 | 显示全部楼层
有关DMP 更新速率的问题,我发信给 库函数的原作者 Jeff, 他建议将终端的速率调慢 到25Hz,但是没有什么效果。
回复 支持 反对

使用道具 举报

发表于 2013-5-14 23:34:43 | 显示全部楼层
刚接触,请问楼主的意思是在什么地方加入delay呢?在那一行?我也是用了他的实例,发现processing中的飞机不动不知道什么原因
回复 支持 反对

使用道具 举报

发表于 2013-5-26 13:37:24 | 显示全部楼层
你是怎么弄的呢,我运行了MPU6050 DMP6得到的是乱码,求指导
回复 支持 反对

使用道具 举报

发表于 2013-10-16 13:42:16 | 显示全部楼层
应该是FIFO的问题;
在arduino loop代码最后mpu.resetFIFO();采样数据就稳定了。。。。
回复 支持 反对

使用道具 举报

发表于 2013-11-29 23:24:19 | 显示全部楼层
拾瑞 发表于 2013-5-9 17:51
我的MPU6050初始化只用了以后寄存器,0x6B-0x80;0x6B-0x03;0x1A- 0x00;0x1B- 0x18,根据MPU6050寄存器MAP介绍 ...

你这样采样速率不是大于加速度计的更新速度了嘛?这样融合会有问题吧,怎么解决的说?
回复 支持 反对

使用道具 举报

发表于 2013-11-29 23:28:23 | 显示全部楼层
请问怎么看到更新速率...?还有DMP初始化里没有对低通滤波器进行配置,这样是不是默认为0.即陀螺仪采样速率为8K,加速度计为1K,如果是这样的话更新速率怎么能是1K/(1+4)=200?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 18:18 , Processed in 0.068981 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表