做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( )会陷入死循环。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>