中级会员
 
- 积分
- 352
- 金钱
- 352
- 注册时间
- 2016-11-13
- 在线时间
- 40 小时
|
20金钱
本帖最后由 fantasyfeather 于 2018-1-3 22:03 编辑
手里有STM32F103ZET6,还有MPU9250,想用官方的MPL,觉得应该可以比较准确的获取数据,开始移植原子哥F4的MPL例程
我的移植过程
1、把官方的motion_driver_6.12(简称MD6.12),里面documentation文件夹里面的App Note 1、2、3三个文档通读并且翻译一遍。
2、拿一个战舰的例程,把原子哥阿波罗429里面9250例程的DMP文件夹和HARDWARE文件夹里面的myiic、mpu9250(这个其实和战舰的myiic差不多)复制过去
3、把myiic的 .c和.h 文件里面关于IO口的定义改一下,因为阿波罗里面IO口用的是PH,在这里改成战舰的PB10、PB11。
4、把DMP文件夹里面的libmpllib.lib文件更换成\motion_driver_6.12\mpl libraries\arm\Keil里面的libmpllib_Keil_M3.zip压缩文件里面的libmpllib.lib
5、编译报错,在Options for Target的C/C++选项卡里面添加宏定义MPL_LOG_NDEBUG=1,MPU9250,EMPL,EMPL_TARGET_STM32F4,还有要注意选择C99模式

编译没有问题了
6、主函数里面写一些代码如下:
[mw_shl_code=applescript,true] myjudgement=mpu_dmp_init();
switch(myjudgement){
case 1: printf("初始化MPL 出错 \r\n");
break;
case 2: printf("设置所需要的传感器 出错 \r\n");
break;
case 3: printf("设置FIFO 出错 \r\n");
break;
case 4: printf("设置采样率 出错 \r\n");
break;
case 5: printf("设置磁力计采样率 出错 \r\n");
break;
case 6: printf("加载dmp固件 出错 \r\n");
break;
case 7: printf("设置陀螺仪方向 出错 \r\n");
break;
case 8: printf("设置dmp功能 出错 \r\n");
break;
case 9: printf("设置DMP输出速率 出错 \r\n");
break;
case 10:printf("自检 出错 \r\n");
break;
case 11:printf("使能DMP 出错 \r\n");
break;
default:printf("=^_^= 设备初始化成功 =^_^= \r\n");
break;
}
while(1){
mpu_mpl_get_data(&pitch,&roll,&yaw);
printf("mpl数据 Pit: %07.2f Rol: %07.2f Yaw: %07.2f \r\n",pitch,roll,yaw);
delay_ms(1000);
mpu_dmp_get_data(&pitch,&roll,&yaw);
printf("dmp数据 Pit: %07.2f Rol: %07.2f Yaw: %07.2f \r\n",pitch,roll,yaw);
delay_ms(1000);
}[/mw_shl_code]
7、运行上面的代码,之后发现dmp初始化报错,具体一点是自检报错,我也曾把自检注释掉,但是无论是否注释掉,读取的姿态角都是全0。
8、进入mpu_dmp_init()函数,找到自检位置
res=run_self_test(); //自检
if(res)return 10;
9、进入自检函数进一步确定错误位置
result = mpu_run_6500_self_test(gyro, accel,0);
该函数有一个入口参数是0,不调试,把参数改成1,就会调试
10、改成1以后串口打印出来的信息为
Starting MPU6500 HWST!
Retrieving Biases
Starting Bias Loop Reads
Samples: 200
Accel offset data HWST bit=0: 0.3199 -0.0037 -0.6633
Gyro offset data HWST bit=0: 0.1082 6.6267 -2.0740
Retrieving ST Biases
Starting Bias Loop Reads
Samples: 200
Accel offset data HWST bit=1: 0.6675 0.4776 -0.1270
Gyro offset data HWST bit=1: 91.6127 80.0512 77.8536
Accel OTP:106, 100, 116
ACCEL:CRITERIA A
Bias_Shift=22782.0000, Bias_Reg=20962.0000, Bias_HWST=43744.0000
OTP value: 29792.0000
ratio=-0.2353, threshold= 0.5000
Bias_Shift=31541.0000, Bias_Reg=-241.0000, Bias_HWST=31300.0000
OTP value: 28064.0000
ratio= 0.1239, threshold= 0.5000
Bias_Shift=35144.0000, Bias_Reg=-43467.0000, Bias_HWST=-8323.0000
OTP value: 32908.0000
ratio= 0.0679, threshold= 0.5000
Accel:CRITERIA C: bias less than 32768.0000
FAILED: Accel axis:2 = -43467 > 500mg
Accel Self Test Results: 4
Gyro OTP:198, 219, 229
GYRO:CRITERIA A
Bias_Shift=5996842.0000, Bias_Reg=7091.0000, Bias_HWST=6003933.0000
OTP value: 9307113.0000
ratio= 0.6443, threshold= 0.5000
Bias_Shift=4811948.0000, Bias_Reg=434288.0000, Bias_HWST=5246236.0000
OTP value: 11469801.0000
ratio= 0.4195, threshold= 0.5000
Gyro Fail Axis = 1
Bias_Shift=5238139.0000, Bias_Reg=-135924.0000, Bias_HWST=5102215.0000
OTP value: 12669960.0000
ratio= 0.4134, threshold= 0.5000
Gyro Fail Axis = 2
Gyro Self Test Results: 6
Compass Self Test Results: 0
Exiting HWST
自检 出错
11、其中有几个信息可能比较关键,写在下面,因为没有移植成功所以不清楚本步骤判断是否正确
Accel:CRITERIA C: bias less than 32768.0000
FAILED: Accel axis:2 = -43467 > 500mg
Accel Self Test Results: 4
Gyro Fail Axis = 1
Gyro Fail Axis = 2
Gyro Self Test Results: 6
Compass Self Test Results: 0
12、我也看了这几个信息产生的函数位置
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);
13、进入这些函数里面以后,我已经看不懂了,所以前来论坛求助,希望原子哥以及各位大佬能给予指导,在下不胜感激
|
-
添加宏定义
|