MPU6050 DMP调试出现FIFO溢出问题

在移植MPU6050_EMPL库时,使用 freerots 任务(5HZ频率) 进行数据采集,代码如下:

void Task_5HZ(void)
{
	
	//使用定义的结构体对象 OutMpu 直接从inv_mpu_user.c文件中获取数据
 	mpu_dmp_get_data();
	printf("x轴方向加速度为%d\r\n",OutMpu.acc_x);
	printf("y轴方向加速度为%d\r\n",OutMpu.acc_y);
	printf("z轴方向加速度为%d\r\n",OutMpu.acc_z);
	printf("x轴方向角速度为%d\r\n",OutMpu.gyro_x);
	printf("y轴方向角速度为%d\r\n",OutMpu.gyro_y);
	printf("z轴方向角速度为%d\r\n",OutMpu.gyro_z);
	printf("小车的俯仰角为%f\r\n",OutMpu.pitch);
	printf("小车的翻滚角为%f\r\n",OutMpu.roll);
	printf("小车的偏航角为%f\r\n",OutMpu.yaw);
	
}

mpu_dmp_get_data函数如下:

/***************************************************************************************************************
*函数名:mpu_dmp_get_data()
*功能:得到dmp处理后的数据(注意,本函数需要比较多堆栈,局部变量有点多)
*形参:(struct _out_angle *angle):DMP解算得到的姿态
*返回值:0:成功/1:DMP_FIFO读取失败/2:数据读取失败
***************************************************************************************************************/

float pitch,roll,yaw;
u8 mpu_dmp_get_data(void)
{
	float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;
	//short res=0;
	short gyro_dmp[3], accel_dmp[3], sensors_dmp;
	unsigned long sensor_timestamp;
	unsigned char more;
	long quat[4]; 

	if((dmp_read_fifo(gyro_dmp, accel_dmp, quat, &sensor_timestamp, &sensors_dmp,&more)))
		return 1;	
	if(sensors_dmp&INV_WXYZ_QUAT) 
	{
		q0 = quat[0] / q30;	//q30格式转换为浮点数
		q1 = quat[1] / q30;
		q2 = quat[2] / q30;
		q3 = quat[3] / q30; 
		//计算得到俯仰角/横滚角/航向角
		roll = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;																	// pitch
		pitch  = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;	// roll
		yaw   = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;	//yaw
	
	}else return 2;
	
	OutMpu.acc_x = accel_dmp[0];
	OutMpu.acc_y = accel_dmp[1];
	OutMpu.acc_z = accel_dmp[2];
	
	OutMpu.gyro_x = gyro_dmp[0];
	OutMpu.gyro_y = gyro_dmp[1];
	OutMpu.gyro_z = gyro_dmp[2];
	
	OutMpu.pitch = pitch;
	OutMpu.roll  = roll;
	OutMpu.yaw   = yaw;
	
	return 0;
}

通过 mpu_dmp_get_data 函数采集到的数据都为0
在这里插入图片描述
通过debug发现代码卡在dmp_read_fifo函数

	if((dmp_read_fifo(gyro_dmp, accel_dmp, quat, &sensor_timestamp, &sensors_dmp,&more)))
		return 1;	

再进入 dmp_read_fifo 函数中代码卡在mpu_read_fifo_stream函数

/**
 *  @brief      Get one unparsed packet from the FIFO.
 *  This function should be used if the packet is to be parsed elsewhere.
 *  @param[in]  length  Length of one FIFO packet.
 *  @param[in]  data    FIFO packet.
 *  @param[in]  more    Number of remaining packets.
 */
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;
}

最终停止在了

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;
        }

在这里插入图片描述
需要调节MPU6050以及FREERTOS任务的频率,MPU6050最大速率为200HZ

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
mpu6050是一种常用的加速度计和陀螺仪传感器,用于测量物体的加速度和角速度。它可以通过I2C接口与微控制器或单片机进行通信,并提供精确的运动跟踪和姿态估计功能。 mpu_dmp是指MPU6050的数字运动处理器(Digital Motion Processor,DMP)。DMP是一个内置在MPU6050芯片中的处理器,它可以通过一系列的算法和滤波器来处理原始的加速度和陀螺仪数据,从而提供更高级别的运动跟踪和姿态估计功能。 使用mpu_dmp可以方便地获取物体的姿态信息,例如欧拉角(俯仰角、横滚角和偏航角)和四元数。这些信息对于许多应用来说非常有用,例如无人机、机器人、虚拟现实等。 以下是一个使用mpu_dmp获取姿态信息的示例代码: ```python import smbus from mpu6050 import MPU6050 # 初始化MPU6050 bus = smbus.SMBus(1) address = 0x68 mpu = MPU6050(bus, address) # 启用DMP mpu.dmp_initialize() # 获取姿态信息 while True: # 读取原始的加速度和陀螺仪数据 accel_data = mpu.get_accel_data() gyro_data = mpu.get_gyro_data() # 获取姿态信息 quaternion = mpu.dmp_get_quaternion(accel_data, gyro_data) euler = mpu.dmp_get_euler(quaternion) # 打印姿态信息 print("Roll: %.2f, Pitch: %.2f, Yaw: %.2f" % (euler['roll'], euler['pitch'], euler['yaw'])) ``` 这段代码使用了mpu6050库来与MPU6050传感器进行通信,并通过mpu.dmp_get_euler()函数获取姿态信息。你可以根据自己的需求对代码进行修改和扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值