OpenEdv-开源电子网

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

请教关于MPU6050采样频率和DMP输出频率的问题

[复制链接]

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
发表于 2019-7-17 15:55:14 | 显示全部楼层 |阅读模式
1金钱
最近在做风力摆系统,用到MPU6050,在MPU6050初始化中,有多处涉及初始化频率的地方,小白一个,希望大佬可以帮助以下,谢谢啦。
在MPU_Init()中
  1. //初始化MPU6050
  2. //返回值:0,成功
  3. //    其他,错误代码
  4. u8 MPU_Init(void)
  5. {
  6.         u8 res;
  7.         IIC_Init();//初始化IIC总线
  8.        
  9.         delay_ms(1000);
  10.        
  11.         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);        //复位MPU6050
  12.     delay_ms(100);
  13.         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);        //唤醒MPU6050
  14.         MPU_Set_Gyro_Fsr(3);                                        //陀螺仪传感器,±2000dps
  15.         MPU_Set_Accel_Fsr(0);                                        //加速度传感器,±2g
  16.         MPU_Set_Rate(50);                                                //设置采样率50Hz
  17.         MPU_Write_Byte(MPU_INT_EN_REG,0X00);        //关闭所有中断
  18.         MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);        //I2C主模式关闭
  19.         MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);        //关闭FIFO
  20.         MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);        //INT引脚低电平有效
  21.         res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
  22.         if(res==MPU_ADDR)//器件ID正确
  23.         {
  24.                 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);        //设置CLKSEL,PLL X轴为参考
  25.                 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);        //加速度与陀螺仪都工作
  26.                 //MPU_Set_Rate(50);                                                //设置采样率为50Hz
  27.                 MPU_Set_Rate(200);
  28.         }else return 1;
  29.         return 0;
  30. }
复制代码
初始化了两次采样频率。
在mpu_dmp_init()
  1. //mpu6050,dmp初始化
  2. //返回值:0,正常
  3. //    其他,失败
  4. u8 mpu_dmp_init(void)
  5. {
  6.         u8 res=0;
  7.         IIC_Init();                 //初始化IIC总线
  8.         if(mpu_init()==0)        //初始化MPU6050
  9.         {         
  10.                 res=mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL);//设置所需要的传感器
  11.                 if(res)return 1;
  12.                 res=mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL);//设置FIFO
  13.                 if(res)return 2;
  14.                 res=mpu_set_sample_rate(DEFAULT_MPU_HZ);        //设置采样率
  15.                 if(res)return 3;
  16.                 res=dmp_load_motion_driver_firmware();                //加载dmp固件
  17.                 if(res)return 4;
  18.                 res=dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation));//设置陀螺仪方向
  19.                 if(res)return 5;
  20.                 res=dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_TAP|        //设置dmp功能
  21.                     DMP_FEATURE_ANDROID_ORIENT|DMP_FEATURE_SEND_RAW_ACCEL|DMP_FEATURE_SEND_CAL_GYRO|
  22.                     DMP_FEATURE_GYRO_CAL);
  23.                 if(res)return 6;
  24.                 res=dmp_set_fifo_rate(DEFAULT_MPU_HZ);        //设置DMP输出速率(最大不超过200Hz)
  25.                 if(res)return 7;   
  26.                 res=run_self_test();                //自检
  27.                 if(res)return 8;   
  28.                 res=mpu_set_dmp_state(1);        //使能DMP
  29.                 if(res)return 9;     
  30.         }
  31.         return 0;
  32. }
复制代码
初始化了DMP输出输出频率
————————————————————————————————————————————————————————————————————————————————————————————
一些疑问:
      1.为什么要初始化两次采样频率
      2.为什么采样频率比DMP输出频率低
      3.如果我以200HZ频率读取DMP,可以吗?需要修改DMP输出频率和采样频率吗?
      4.谢谢大家









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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-7-18 02:20:00 | 显示全部楼层
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2019-5-9
在线时间
6 小时
发表于 2019-7-23 23:55:30 | 显示全部楼层
我的20多块的原子的6050调到了200hz,但是调试的时候发现实际输出只有20hz
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-24 21:52:04 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-7-24 21:54 编辑

好像就是有问题,DEFAULT_MPU_HZ改成200,int引脚是200hz了但是 int中断内读数据,数据连续几个都不变达不到200hz,感觉比楼上好点100hz数据还可以
回复

使用道具 举报

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
 楼主| 发表于 2019-7-25 16:25:19 | 显示全部楼层
木桃 发表于 2019-7-23 23:55
我的20多块的原子的6050调到了200hz,但是调试的时候发现实际输出只有20hz

获取姿态角那个函数非常耗时间,你的会出现这样的问题吗?
回复

使用道具 举报

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
 楼主| 发表于 2019-7-26 13:46:05 | 显示全部楼层
nashui_sx 发表于 2019-7-24 21:52
好像就是有问题,DEFAULT_MPU_HZ改成200,int引脚是200hz了但是 int中断内读数据,数据连续几个都不变达不 ...

INT触发脉冲的确是和DEFAULT_MPU_HZ设置的基本保持一致,但是通过mpu_dmp_get_data(&pitch,&roll,&yaw)基本会频率减半,只有100HZ左右;
不过MPU_Set_Rate(50)设置作用是什么还没搞清楚               
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-28 15:45:51 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-7-28 15:47 编辑

QQ图片20190728154531.jpg
Sampling Rate : Sensor fusion requires large computational power from the MCU. This plays into
how much processing is possible per sample and limits your sampling rate. For example the TI 16-bit
MSP430 with the Motion Driver should be limited to 100Hz sampling rate if the MCU is doing the full
9-axis fusion. Anything over 100Hz sampling rate the MSP430 start missing data. Higher end 32-bit
MCUs can usually achieve 200Hz sensor fusion if there are no other large computational
functionality required in the system. This sample rate can be increased if you offload the processing
onto the DMP.  

回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-20
在线时间
7 小时
发表于 2019-7-28 22:57:12 | 显示全部楼层
我拿示波器测量INT脚输出波形,频率一直在跳,50,100,200的跳
回复

使用道具 举报

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
 楼主| 发表于 2019-7-29 08:16:40 | 显示全部楼层
BarryAllen 发表于 2019-7-28 22:57
我拿示波器测量INT脚输出波形,频率一直在跳,50,100,200的跳

不是吧,INT波形还是和DEFAULT_MPU_HZ保持一致的。
回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-20
在线时间
7 小时
发表于 2019-7-29 11:40:18 | 显示全部楼层
czw 发表于 2019-7-29 08:16
不是吧,INT波形还是和DEFAULT_MPU_HZ保持一致的。

理论上应该是这样的,但我确实测不到稳定的波形,是我程序的问题么,我之前F1的程序没问题,就是移植到F4上面去,就出现问题了
回复

使用道具 举报

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
 楼主| 发表于 2019-7-29 13:09:16 | 显示全部楼层
BarryAllen 发表于 2019-7-29 11:40
理论上应该是这样的,但我确实测不到稳定的波形,是我程序的问题么,我之前F1的程序没问题,就是移植到F4 ...

INT输出关程序什么是,这个是模块的输出呀。
回复

使用道具 举报

4

主题

21

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-20
在线时间
7 小时
发表于 2019-7-29 14:04:42 | 显示全部楼层
czw 发表于 2019-7-29 13:09
INT输出关程序什么是,这个是模块的输出呀。

我也感觉没问题。。。。但确实不一样
回复

使用道具 举报

37

主题

212

帖子

0

精华

高级会员

Rank: 4

积分
900
金钱
900
注册时间
2019-6-6
在线时间
100 小时
发表于 2019-9-27 14:38:43 | 显示全部楼层
czw 发表于 2019-7-25 16:25
获取姿态角那个函数非常耗时间,你的会出现这样的问题吗?

请问你获取一次三个欧拉角要多久,我用f1的板子读取一次mpu_dmp_get_data竟然要56ms左右
不会就要俯身倾耳以请啊,博客地址:https://blog.csdn.net/qq_39521541?spm=1001.2101.3001.5343
回复

使用道具 举报

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
 楼主| 发表于 2019-11-3 21:39:06 | 显示全部楼层
Advent 发表于 2019-9-27 14:38
请问你获取一次三个欧拉角要多久,我用f1的板子读取一次mpu_dmp_get_data竟然要56ms左右

基本可以达到200HZ,后来找到问题所在了。在这种频率比较高情况通常不要去操作液晶屏或者给串口发数据!
回复

使用道具 举报

4

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2022-3-16
在线时间
7 小时
发表于 2022-5-14 22:34:49 | 显示全部楼层
czw 发表于 2019-7-25 16:25
获取姿态角那个函数非常耗时间,你的会出现这样的问题吗?

有什么办法可以减少这个时间吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 18:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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