MPU6050 DMP 库使用问题
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显示:
刷新频率有点低
--程序
LabVIEW中通过串口通信接到做的3D显示--程序能否分享下 虽然不太懂,噪声应该是会会在的,但一般平衡车的做法,是通过数据滤波、数据融合等方法,将数据变得稳定、可靠、可用。。。。应该从降低底噪、噪声方面下功夫吧。。。 如果delay设定是300ms,那么得到的数据都是准确的;如果delay设定是30ms,那么10个数据中只有一个是准的,中间的9个数据都是白噪声 目前可以定位问题出在 DMP的fifo数据读取上:
1.定位方法:
代码中每次去检查fifo中是否够读取一次数据,如果够的话,就连续读取,这样可以获得比中断频率更高的更新速率,如果读取的不够迅速,那么就会报fifo的错误;在程序中发现如果出现fifo错误以后数据都是对的,所以在原来的代码中每次读取后就reset fifo, 并输出“fifo reset” 结果就每次都是对的。
可以最高到200Hz。
2. to-do:
应该是fifo的问题,继续研究; 同时 Acc 最高速率就是1K,所以如果可以达到0.2K Hz 也差不多够用,也许加了算法以后 整体控制的速率达到0.2Hz 就可以。所以也是一个折中的解决方案,可以继续往下做其他的部分了。
大家一起讨论下。 我的MPU6050初始化只用了以后寄存器,0x6B-0x80;0x6B-0x03;0x1A- 0x00;0x1B- 0x18,根据MPU6050寄存器MAP介绍,我把它理解成采样频率是:
采样频率=陀螺仪输出频率/(1+SMPLRT_DIV)
=8000/(1+0)=8K
我用这个设置,直接就是去了一个零飘,用PD控制能稳定做一个倒立摆!反之,如果我用DMP,去控制同样的倒立摆,还没有成功过!
所以,我倒觉得在一系列不稳定系统的控制当中,速率的重要性够大的........
本帖最后由 ironlee 于 2013-5-9 21:10 编辑
拾瑞 发表于 2013-5-9 17:51 static/image/common/back.gif
我的MPU6050初始化只用了以后寄存器,0x6B-0x80;0x6B-0x03;0x1A- 0x00;0x1B- 0x18,根据MPU6050寄存器MAP介绍 ...
请问你的0X6B寄存器是写了两次?不是笔误么
还有,ACCEL_CONFIG不用初始化么 不是笔误!0x80是复位所有寄存器,0X03要查具体的寄存器MAP了,我记不清楚了;
0x1A- 0x00;0x1B- 0x18,是设置陀螺仪的,我没有设置ACCEL!ACC只有1KHZ,同样设置以后,出来的数据是无法与GYRO融合的! 有关DMP 更新速率的问题,我发信给 库函数的原作者 Jeff, 他建议将终端的速率调慢 到25Hz,但是没有什么效果。 刚接触,请问楼主的意思是在什么地方加入delay呢?在那一行?我也是用了他的实例,发现processing中的飞机不动不知道什么原因 你是怎么弄的呢,我运行了MPU6050 DMP6得到的是乱码,求指导 应该是FIFO的问题;
在arduino loop代码最后mpu.resetFIFO();采样数据就稳定了。。。。 拾瑞 发表于 2013-5-9 17:51 static/image/common/back.gif
我的MPU6050初始化只用了以后寄存器,0x6B-0x80;0x6B-0x03;0x1A- 0x00;0x1B- 0x18,根据MPU6050寄存器MAP介绍 ...
你这样采样速率不是大于加速度计的更新速度了嘛?这样融合会有问题吧,怎么解决的说? 请问怎么看到更新速率...?还有DMP初始化里没有对低通滤波器进行配置,这样是不是默认为0.即陀螺仪采样速率为8K,加速度计为1K,如果是这样的话更新速率怎么能是1K/(1+4)=200?
页:
[1]
2