MPU6050读不出来数据

我使用的是MPU6050 GY521,STM32F407,软件模拟iic。

问题描述:

MPU6050之前使用正点原子的例程可以读出数据,但是和超声波测距的程序融合在一起以后就出不来数据,而且现在单独使用MPU6050也都不出数据了。

单步调试发现if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)在这句中,mpu_dmp_get_data(&pitch,&roll,&yaw)的返回值为-1,if进不去,我一层一层查下去,main.c中mpu_dmp_get_data(&pitch,&roll,&yaw)>>inv_mpu.c中dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more)>>inv_mpu_dmp_motion_driver.c中mpu_read_fifo_stream(dmp.packet_length, fifo_data, more)的返回值是-1>>inv_mpu.c中st.chip_cfg.dmp_on=0。

所以最根源是由于st.chip_cfg.dmp_on这个变量的值不对,不知道是什么问题。


在网上找到许多和我类似的情况,现在一一整理别人的解决办法:

一:返回值是-1的情况

int mpu_read_fifo_stream(unsigned short length, unsigned char *data,
    unsigned char *more)
{
    unsigned char tmp[2];
    unsigned short fifo_count;
    if (!st.chip_cfg.dmp_on)
        return -1;
    if (!st.chip_cfg.sensors)
        return -1;
    if (i2c_read(st.hw->addr, st.reg->fifo_count_h, 2, tmp))
        return -1;
    fifo_count = (tmp[0] << 8) | tmp[1];
    if (fifo_count < length) {
        more[0] = 0;
        return -1;
    }
    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) {
            mpu_reset_fifo();
            return -2;
        }
    }
    if (i2c_read(st.hw->addr, st.reg->fifo_r_w, length, data))
        return -1;
    more[0] = fifo_count / length - 1;
    return 0;
}

这个就是上面提及的函数,里面单步调试时发现是由于这两句导致返回值为-1

 if (!st.chip_cfg.dmp_on)
        return -1;

有人发现电源供电的问题,这句代码是检测DMP是否正常工作的,dmp_on出问题就是dmp这部分没有正常工作,检查模块供电是3.3V,还是5v.


u8 MPU_Init(void)
{ 
	u8 res;
	IIC_Init();
	delay_ms(100);
	MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);	
    delay_ms(100);
	MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);	
	MPU_Set_Gyro_Fsr(3);					
	MPU_Set_Accel_Fsr(0);				
	MPU_Set_Rate(50);						
	MPU_Write_Byte(MPU_INT_EN_REG,0X00);	
	MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);	
	MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);
	MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);	
	res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
	if(res==MPU_ADDR)//Æ÷¼þIDÕýÈ·
	{
		MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);	
		MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);	
		MPU_Set_Rate(50);						
 	}else return 1;
	return 0;
}

有人发现是MPU6050初始化的时候没开FIFO,打开就好了

其中MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);这句话的意思是关闭FIFO,只需要修改一下,打开FIFO。

二:还有返回值是-2的情况

if (tmp[0] & BIT_FIFO_OVERFLOW) {


            mpu_reset_fifo();
            return -2;
问题的本质就是,读取数据速度不够快导致FIFO溢出。

据说解决的方法就是,不能只用一个dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more);函数。

mpu_dmp_get_data要执行足够快,之前我是0.5s调用一次这个函数,结果死活不行,一直溢出,后来改为一直循环执行,每0.5s读取pitch,roll,yaw,就可以正常读出来,不过还是出现多次执行mpu_dmp_get_data后会出现一次溢出然后重置mpu_reset_fifo,这应该是我在while中做其它事偏多导致速度受影响


1.经过初始化之后,如果能够初始化成功,就转到第二步

while(mpu_dmp_init()!=0)
{
printf("MPU6050 INIT ERROR\r\n");
}

2.循环读取数据,直到MPU6050返回0,表示读取FIFO成功

while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0)//返回0就成功了
{
//第一次读取数据的时候不成功,可能是因为IIC速度有点慢,但是循环读取数据能够成功,能够解决这个bug,但是具体如何一次性读取MPU6050数据的话,自己调整好IIC的速度,速度合适的话,一次性就能够读取MPU6050的pitch、roll、yaw数据了
}

三:还有和我类似问题:

移植的freertos和DMP单独测试都好使,但是把DMP放到freeRTOS中就不好使了,具体的在freeRTOS运行之前,加上DMP的初始化就不能运行了,就死在切换任务那个函数不动了。

FreeRTOS运行前不要随意调用操作系统的API,DMP我没用过,但还是建议你启动OS之后再初始化,具体可以参考原子的做法,先创建一个开始任务,然后在开始任务里面初始化某些硬件和创建其他任务,最后删除开始任务本身


而且现在我用新的MPU6050和原子哥的例程还是可以读出数据,那是不是之前的MPU6050由于不知道什么原因坏掉了,那还能不能修复?




  • 24
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
回答: 如果MPU6050数不连续,可能是由于以下几个原因导致的。首先,可能是因为在取传感器数据时,没有正确地设置传感器的寄存器地址。在数据之前,需要先设置要取的寄存器地址,以确保正确数据。其次,可能是因为在数据时,没有正确地设置传感器的通信协议。MPU6050使用I2C通信协议,需要正确地配置通信参数,包括通信速率和地址。另外,还可能是因为传感器本身存在故障或损坏,导致数据不连续。如果以上方法都没有解决问题,建议检查传感器的连接和电源供应,确保传感器正常工作。如果问题仍然存在,可能需要更换传感器或进行进一步的故障排除。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [使用IIC驱动MPU6050获取六轴数据](https://blog.csdn.net/m0_51220742/article/details/123804068)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【STM32学习】——I2C通信协议&MPU6050姿态传感器&软件I2CMPU6050](https://blog.csdn.net/weixin_51658186/article/details/129821841)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值