完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在原子F4的MPU6050的程序中,DMP得到欧拉角的过程是这样的(箭头表示调用函数):
-->mpu_dmp_get_data //DMP得到角度 -->dmp_read_fifo //DMP读取FIFO数据 -->mpu_read_fifo_stream 在最后一个函数中,有一个判断语句: [C] 纯文本查看 复制代码 if (fifo_count > (st.hw->max_fifo >> 1)) { /* FIFO is 50% full, better check overflow bit. */ if (i2c_read(st.hw->addr, st.reg->int_status, 1, tmp)) return -1; if (tmp[0] & BIT_FIFO_OVERFLOW) { printf("FIFO fulltn"); mpu_reset_fifo(); return -2; } }可以看到,当FIFO大于50%的时候程序会清空FIFO,然后重新读取.若此时"重新读取"的到这里的时候又满了,就会无限循环这个过程.你可以直接注释掉这一段,但是可能以后读取的数据中会出现莫名其妙的值.更好的方式是降低DMP的输出速率. 把程序定位到DMP初始化部分,通过dmp_set_fifo_rate(DEFAULT_MPU_HZ)降低到50hz等; [C] 纯文本查看 复制代码 u8 mpu_dmp_init(void){u8 res=0;IIC_Init(); if(mpu_init()==0){ res=mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL);if(res)return 1; res=mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL);if(res)return 2; res=mpu_set_sample_rate(DEFAULT_MPU_HZ);if(res)return 3; res=dmp_load_motion_driver_firmware();if(res)return 4; res=dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation));if(res)return 5; res=dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_TAP| DMP_FEATURE_ANDROID_ORIENT|DMP_FEATURE_SEND_RAW_ACCEL|DMP_FEATURE_SEND_CAL_GYRO| DMP_FEATURE_GYRO_CAL);if(res)return 6; res=dmp_set_fifo_rate(DEFAULT_MPU_HZ); //设置FIFO输出速率if(res)return 7; res=run_self_test();if(res)return 8; res=mpu_set_dmp_state(1);if(res)return 9; } 以下是我把速率设置到最高(200hz)的调试信息: 每一个行对应一次数据的读取,出现(stream)FIFO full表示读取失败(其实是50%full,程序清空FIFO重新读取).可以发现是比较频繁的,若设置为50,则读取失败的次数明显降低很多.我们可以通过在进入读取程序的时候写入调试信息,观测其FIFO情况. 因为程序使用的是while(mpu_dmp_get_data(&pitch,&roll,&yaw))不断的读取直到成功,所以出现死循环的原因可能是中断. 考虑一种情况,在你读取FIFO的过程中,出现一个中断,单片机处理其他事情后FIFO已经50%full了,于是清空管道重新读取,在第二次读取FIFO依旧出现这个中断,再次回来FIFO依旧是50%Full,于是出现了死循环.但是这只是经网友提醒后猜测的一种情况.并不清楚程序是否可能真的出现这种情况. 总之,假设你的程序一直卡在FIFO里面,可以根据自己写入的调试信息,观察FIFO数据情况,然后不断降低DMP输出速率,直到程序可以较好的运行. 比如在inv_mpu.c第26行: [C] 纯文本查看 复制代码 #define DEFAULT_MPU_HZ (50)//100Hz将默认的100改为50.(单位hz) |
|
相关推荐
6个回答
|
|
人家都追求输出速度高,楼主追求速度低,也是反其道而行
|
|
|
|
|
|
|
|
我定时器4;5毫秒中断读取。100Hz的速度可能有一秒钟失败一次。
|
|
|
|
如果读快了,DMP的FIFO数据很快就为空,读慢了FIFO又很快就会满,有个数据就绪中断,但是又是MPU寄存器数据就绪中断,读寄存器出来的数据不是融合后的数据,有没有办法每隔一段时间去读,每次都不会失败?
|
|
|
|
我觉得作者的说法有点错误,不是50%的时候就清除FIFO数据,是检测到FIFO数据个数到50%以后就要去检测FIFO数据满标志位,如果满了就清除FIFO数据。我也试过注释掉这段代码,但是读出来的数据确实不是想要的错误数据。根据手册上寄存器说明(请看下图),FIFO更新的数据会不断替换掉老数据,如果检测到FIFO满标志时不清除FIFO数据,开启FIFO溢出中断,中断中去读取数据是不是就可以正常读取?这样对开了ucos操作系统是不是就好做了很多?C:UsersAdministratorDesktop
|
|
|
|
不知道怎么发图片,只能发个附件了
|
|
|
|
只有小组成员才能发言,加入小组>>
请问下图大疆lightbridge2遥控器主板电源芯片型号是什么?
4475 浏览 1 评论
使用常见的二极管、三极管和mos做MCU和模组的电平转换电路,但是模组和MCU无法正常通信,为什么?
346浏览 2评论
为了提高USIM卡电路的可靠性和稳定性,在电路设计中须注意的点有哪些?
351浏览 2评论
376浏览 2评论
367浏览 2评论
419浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 07:39 , Processed in 0.994115 second(s), Total 86, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号