1、6050初始化失败
如果是6050初始化失败,首先看下是否是读出的地址不对
res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
printf("mpu addr=%x\r\n",res);
if(res==MPU_ADDR)//器件ID正确
{
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //设置CLKSEL,PLL X轴为参考
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都工作
MPU_Set_Rate(50); //设置采样率为50Hz
}
else return 1;
我这里读出来是0x68,不同的接法也会导致ID不同,如果地址正确,那就是return 0,这里对于6050的初始化就初始化通过了。
2、mpu初始化失败
Mpu初始化失败常见的是返回错误代码8,可一步一步进入源码去分析,
解决办法一、
mpu_dmp_init() -> run_self_test() 这里是进行自检,跳进函数里面可以看到,意思是需要水平放置才能自检成功,所以只有将模块水平放置即可,如果不行直接将这部分代码屏蔽掉即可。
解决办法二、
追踪源码:mpu_dmp_init() -> run_self_test() -> mpu_run_self_test(gyro, accel) -> accel_self_test(accel, accel_st)
既只有当st_shift_var的绝对值<test.max_accel_var的值时,才能初始化成功。而且不同位置摆放MPU6050模块,st_shift_var的绝对值都不同,只有当水平放置模块时,st_shift_var的绝对值最接近test.max_accel_var的值,如果不修改这个参数,则需要按照方法一将模块水平放置进行测试
这里调试时可以将st_shift_var的绝对值和test.max_accel_var的值打印出来对比下,我这里的解决方法是将test.max_accel_var的初始化值从0.14改为0.16。这时水平放置模块时模块就能初始化成功。如下图所示:
3、初始化通过但数据为0
还有种情况就是初始化所有的都通过,但是欧拉角登数据全为0,这种情况是因为代码里面存在硬延时或者其他模块的处理影响到了6050,所以数据全为0,亲测是经过测试把某一个模块数据处理屏蔽掉就ok了。