代码是拷贝原子的,进行部分修改
while(1)
{
delay_ms(1000);
if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{
printf("******************");
temp=MPU_Read_Temp(); //得到温度值
MPU_Read_Accel(&ax,&ay,&az); //得到加速度传感器数据
MPU_Read_Gyro(&gx,&gy,&gz); //得到陀螺仪数据
mpu6050_send_data(ax,ay,az,gx,gy,gz);//用自定义帧发送加速度和陀螺仪原始数据
usart1_report_imu(ax,ay,az,gx,gy,gz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
}
}
通过打印信息分析是没有进入if语句,进入mpu_dmp_get_data发现是卡在dmp_read_fifo函数
if(dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more))
return 1;
再进入dmp_read_fifo函数是卡在mpu_read_fifo_stream函数,最终定位为如下函数的return语句:
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; // printf("0x%02x, ",tmp[0]); if (tmp[0] & BIT_FIFO_OVERFLOW) { mpu_reset_fifo(); return -2; } }
打印读到的int_status的值为0x13,即为FIFO溢出产生中断。从语句中看出当FIFO的数量大于50%就会进入中断Check状态,计数寄存器的数据过多,所以溢出可能是因为读取速度过慢导致,回看MPU6050采样率设置为50Hz,即为20ms采样一次,while语句中设置了1s的延时,1s的延时期间导致采样数据过多而溢出,所以把延时改为100ms,问题解决。