|
楼主 |
发表于 2017-6-18 12:29:13
|
显示全部楼层
总算找到原因了,我对比了平衡之家的驱动和原子的驱动,发现正点驱动里的run_self_test()这个函数里面:
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;
}
这个函数内部调用了result = mpu_run_self_test(gyro, accel);
我看了一下这个内部函数的注释,大概就是如果#define了MPU6050这个宏,这个函数最终会返回0x03,如果是#define MPU6500,那么它返回7,而且好像MPU6500需要手动校正,而MPU6050不需要,所以,应该在这个函数返回0x07的时候,我们才校正,而这个校正是会对dmp里面对那pitch、roll产生影响的。如果使用MPU6050却进行该校正,那么pitch、roll会清0。所以你初始姿态的pitch就成了0值。 |
|