记录STM32F429 调试MPU9250 DMP自检不通过的问题

软件版本:MDK :v5.29

                  STM32cubeMX:5.6.1

                  STM32Cube MCU Package for STM32F4 Series   1.25

硬件:正点原子阿波罗F429开发板

问题描述:项目上要用mpu9250,起初自己用stm32cubemx建立的工程,循环读取mpu9250的欧拉角输出,移植官方的DMP姿态融合算法。本来用的是st官方的HAL库硬件读取I2C,在读写数据时都没有问题,但是在DMP自检时怎么都不能通过,如果屏蔽掉run_self_test()也可以正常使用,但是自检不通过总是不放心,也让人对其测量数据的准确性存疑。

在仔细对比了正点原子的官方例程后(模拟读取I2C)发现两种方式读取I2C的差别体现在DMP inv_mpu.c文件的函数mpu_run_6500_self_test 函数当中,在这个函数中加速度计和陀螺仪的自检不通过

 

 

   for (ii = 0; ii < tries; ii++)
        if (!get_st_6500_biases(gyro, accel, 0, debug))
            break;

 

for (ii = 0; ii < tries; ii++)
        if (!get_st_6500_biases(gyro_st, accel_st, 1, debug))
            break;

 以上两个函数分别循环2次读取 gyro,accel 和 gyro_st,accel_st四个值,两种I2C读取方式在保持硬件不动的情况下测量结果差距比较大,导致在下面的自检结果计算时 accel_result 和 gyro_result 的值不能通过自检。

记录STM32F429 调试MPU9250 DMP自检不通过的问题_第1张图片

记录STM32F429 调试MPU9250 DMP自检不通过的问题_第2张图片


    accel_result = accel_6500_self_test(accel, accel_st, debug);
    if(debug)
    	log_i("Accel Self Test Results: %d\n", accel_result);

    gyro_result = gyro_6500_self_test(gyro, gyro_st, debug);
    if(debug)
    	log_i("Gyro Self Test Results: %d\n", gyro_result);

 解决办法:使用模拟I2C(参考正点原子)

你可能感兴趣的:(STM32)