发现MPU6050驱动里的bug

2019-08-17 06:42发布

做MPU6050实验时,发现无论小车初始位置什么姿态,pitch值都是0,以后pitch值的读数都是实际pitch值(即相对于重力方向)相对于初始pitch的差值。
我在查别的驱动时对比发现,在这个函数里,有问题:
u8 run_self_test(void)
{
        int result;
        //char test_packet[4] = {0};
        long gyro[3], accel[3];
        result = mpu_run_self_test(gyro, accel);
        if (result == 0x3)
        {
                /* Test passed. We can trust the gyro data here, so let's push it down
                * to the DMP.
                */
                float sens;
                unsigned short accel_sens;
                mpu_get_gyro_sens(&sens);
                gyro[0] = (long)(gyro[0] * sens);
                gyro[1] = (long)(gyro[1] * sens);
                gyro[2] = (long)(gyro[2] * sens);
                dmp_set_gyro_bias(gyro);
                mpu_get_accel_sens(&accel_sens);
                accel[0] *= accel_sens;
                accel[1] *= accel_sens;
                accel[2] *= accel_sens;
                dmp_set_accel_bias(accel);
                return 0;
        }else return 1;
}



这个函数内部调用mpu_run_self_test(),并根据返回值result决定要不要进行手动校正,而我查看mpu_run_self_test()的注释,发现,MPU6500才需要这个功能,而MPU6050不需要,他有硬件矫正。但是我又想,硬件校正完,再软件校正一下应该不是什么大问题吧,结果还真是问题,就是出现我之前说的情况,不知道它内部是个什么工作机理,反正结论就是使用MPU6050时,不能在run_self_test()函数里进行手动校正,而使用MPU6050的话, result = mpu_run_self_test(gyro, accel),它的返回值为0x03。使用MPU6500它的返回值是0x07,所以这个函数应该改为:
u8 run_self_test(void)
{
        int result;
        //char test_packet[4] = {0};
        long gyro[3], accel[3];
        result = mpu_run_self_test(gyro, accel);
        if (result == 0x7)      //修改1
        {
                /* Test passed. We can trust the gyro data here, so let's push it down
                * to the DMP.
                */
                float sens;
                unsigned short accel_sens;
                mpu_get_gyro_sens(&sens);
                gyro[0] = (long)(gyro[0] * sens);
                gyro[1] = (long)(gyro[1] * sens);
                gyro[2] = (long)(gyro[2] * sens);
                dmp_set_gyro_bias(gyro);
                mpu_get_accel_sens(&accel_sens);
                accel[0] *= accel_sens;
                accel[1] *= accel_sens;
                accel[2] *= accel_sens;
                dmp_set_accel_bias(accel);
                return 0;
        }else return 0;    //修改2
}
最后还要将 return 1,改为return 0,否则通不过初始化,mpu_dmp_init( )会陷入死循环。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。