OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9086|回复: 7

使用DMP卡在FIFO程序段可以尝试降低DMP的输出速率

[复制链接]

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2015-9-14 16:34:07 | 显示全部楼层 |阅读模式
在原子F4的MPU6050的程序中,DMP得到欧拉角的过程是这样的(箭头表示调用函数):
-->mpu_dmp_get_data          //DMP得到角度
   -->dmp_read_fifo               //DMP读取FIFO数据
      -->mpu_read_fifo_stream  

在最后一个函数中,有一个判断语句:
[mw_shl_code=c,true] 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 full\t\n"); mpu_reset_fifo(); return -2; } }[/mw_shl_code]
可以看到,当FIFO大于50%的时候程序会清空FIFO,然后重新读取.若此时"重新读取"的到这里的时候又满了,就会无限循环这个过程.你可以直接注释掉这一段,但是可能以后读取的数据中会出现莫名其妙的值.更好的方式是降低DMP的输出速率.

把程序定位到DMP初始化部分,通过dmp_set_fifo_rate(DEFAULT_MPU_HZ)降低到50hz等;
[mw_shl_code=c,true]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; } [/mw_shl_code]
以下是我把速率设置到最高(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行:
[mw_shl_code=c,true]#define DEFAULT_MPU_HZ (50) //100Hz[/mw_shl_code]
将默认的100改为50.(单位hz)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2015-9-14 16:36:31 | 显示全部楼层
人家都追求输出速度高,楼主追求速度低,也是反其道而行
学无止境
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-9-14 23:42:59 | 显示全部楼层
谢谢分享。。。
这个问题,之前就有客户遇到过。
楼主分析的不错
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-6-23
在线时间
15 小时
发表于 2015-9-15 23:57:56 | 显示全部楼层
我定时器4;5毫秒中断读取。100Hz的速度可能有一秒钟失败一次。
回复 支持 反对

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3130
金钱
3130
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-7-14 15:18:47 | 显示全部楼层
如果读快了,DMP的FIFO数据很快就为空,读慢了FIFO又很快就会满,有个数据就绪中断,但是又是MPU寄存器数据就绪中断,读寄存器出来的数据不是融合后的数据,有没有办法每隔一段时间去读,每次都不会失败?
坚持不懈的努力!
回复 支持 反对

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3130
金钱
3130
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-7-14 15:33:23 | 显示全部楼层
我觉得作者的说法有点错误,不是50%的时候就清除FIFO数据,是检测到FIFO数据个数到50%以后就要去检测FIFO数据满标志位,如果满了就清除FIFO数据。我也试过注释掉这段代码,但是读出来的数据确实不是想要的错误数据。根据手册上寄存器说明(请看下图),FIFO更新的数据会不断替换掉老数据,如果检测到FIFO满标志时不清除FIFO数据,开启FIFO溢出中断,中断中去读取数据是不是就可以正常读取?这样对开了ucos操作系统是不是就好做了很多?C:\Users\Administrator\Desktop
坚持不懈的努力!
回复 支持 反对

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3130
金钱
3130
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-7-14 15:34:57 | 显示全部楼层
不知道怎么发图片,只能发个附件了
QQ截图20170714152703.png
坚持不懈的努力!
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-6-30
在线时间
8 小时
发表于 2020-8-10 14:45:13 | 显示全部楼层
碰到了这个问题,用了50hz还是没能彻底解决,还是会出现读着读着卡死的情况
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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