OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10275|回复: 22

原子哥阿波罗例程里面MPU9250的MPL从F4移植到F1的问题,自检出错

[复制链接]

3

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2016-11-13
在线时间
40 小时
发表于 2018-1-3 21:55:53 | 显示全部楼层 |阅读模式
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、进入这些函数里面以后,我已经看不懂了,所以前来论坛求助,希望原子哥以及各位大佬能给予指导,在下不胜感激






添加宏定义

添加宏定义

最佳答案

查看完整内容[请看2#楼]

不清楚是不是F1缺少一些F4的那个浮点运算,总是弄不出来
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2017-5-11
在线时间
100 小时
发表于 2018-1-3 21:55:54 | 显示全部楼层
fantasyfeather 发表于 2018-4-24 14:59
并没有解决,几天没弄好就丢那了

不清楚是不是F1缺少一些F4的那个浮点运算,总是弄不出来
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-1-4 00:31:39 | 显示全部楼层
帮顶
回复

使用道具 举报

16

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2017-5-11
在线时间
100 小时
发表于 2018-4-13 17:07:24 | 显示全部楼层
请问楼主现在解决这个没有呢,我和你碰到了一样的问题了!!
自检失败LOG
Starting MPU6500 HWST!

Retrieving Biases

Starting Bias Loop Reads
Samples: 200
Accel offset data HWST bit=0:  0.3805  0.0205 -0.6246

Gyro offset data HWST bit=0:  2.4823 31.0605  4.1178

Retrieving ST Biases
Starting Bias Loop Reads
Samples: 200
Accel offset data HWST bit=1:  0.7289  0.5182 -0.0899

Gyro offset data HWST bit=1: 96.4575 94.5925 85.3078

Accel OTP:91, 89, 119
ACCEL:CRITERIA A
Bias_Shift=22830.0000, Bias_Reg=24937.0000, Bias_HWST=47767.0000

OTP value: 25660.0000

ratio=-0.1103, threshold= 0.5000

Bias_Shift=32618.0000, Bias_Reg=1346.0000, Bias_HWST=33964.0000

OTP value: 25156.0000

ratio= 0.2966, threshold= 0.5000

Bias_Shift=35040.0000, Bias_Reg=-40933.0000, Bias_HWST=-5893.0000

OTP value: 33904.0000

ratio= 0.0335, threshold= 0.5000

Accel:CRITERIA C: bias less than 32768.0000
FAILED: Accel axis:2 = -40933 > 500mg
Accel Self Test Results: 4
Gyro OTP:193, 205, 224

GYRO:CRITERIA A
Bias_Shift=6158756.0000, Bias_Reg=162681.0000, Bias_HWST=6321437.0000

OTP value: 8855364.0000

ratio= 0.6955, threshold= 0.5000

Bias_Shift=4163632.0000, Bias_Reg=2035583.0000, Bias_HWST=6199215.0000

OTP value: 9978481.0000

ratio= 0.4173, threshold= 0.5000

Gyro Fail Axis = 1
Bias_Shift=5320866.0000, Bias_Reg=269865.0000, Bias_HWST=5590731.0000

OTP value: 12055122.0000

ratio= 0.4414, threshold= 0.5000

Gyro Fail Axis = 2
Gyro Self Test Results: 6
Compass Self Test Results: 0
Exiting HWST

我去查了一下说是磁力计没有启动,但是在初始化的时候都能设置,并且能读取磁力计ID啊,但是后面我自己读取就不行,读0x0c读出来是ff
回复

使用道具 举报

3

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2016-11-13
在线时间
40 小时
 楼主| 发表于 2018-4-24 14:59:55 | 显示全部楼层
way7539512 发表于 2018-4-13 17:07
请问楼主现在解决这个没有呢,我和你碰到了一样的问题了!!
自检失败LOG
Starting MPU6500 HWST!

并没有解决,几天没弄好就丢那了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-27 02:07:25 | 显示全部楼层
帮顶
回复

使用道具 举报

3

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2016-11-13
在线时间
40 小时
 楼主| 发表于 2018-6-15 16:21:03 | 显示全部楼层
way7539512 发表于 2018-1-3 21:55
不清楚是不是F1缺少一些F4的那个浮点运算,总是弄不出来

现在搞了软件解算,不用硬解了
回复

使用道具 举报

16

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2017-5-11
在线时间
100 小时
发表于 2018-6-19 08:25:07 | 显示全部楼层
fantasyfeather 发表于 2018-6-15 16:21
现在搞了软件解算,不用硬解了

老哥,你弄出来了嘛,怎么用软件进行MPL解算啊
回复

使用道具 举报

3

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2016-11-13
在线时间
40 小时
 楼主| 发表于 2018-6-19 09:46:45 | 显示全部楼层
way7539512 发表于 2018-6-19 08:25
老哥,你弄出来了嘛,怎么用软件进行MPL解算啊

弄出来了德国开源四轴的互补滤波算法,卡尔曼滤波还需要简化,传感器也还需要校准,不校准得到的数据并不好
回复

使用道具 举报

16

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2017-5-11
在线时间
100 小时
发表于 2018-6-19 09:48:15 | 显示全部楼层
用的也是官方MPL库?
回复

使用道具 举报

3

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2016-11-13
在线时间
40 小时
 楼主| 发表于 2018-6-19 09:58:12 | 显示全部楼层
way7539512 发表于 2018-6-19 09:48
用的也是官方MPL库?

软件解算,当然不用MPL了,直接拿着传感器原始数据处理
回复

使用道具 举报

16

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2017-5-11
在线时间
100 小时
发表于 2018-6-19 10:37:45 | 显示全部楼层
fantasyfeather 发表于 2018-6-19 09:58
软件解算,当然不用MPL了,直接拿着传感器原始数据处理

那不就相当于不用官方的融合算法,直接读取模块的原始数据进行融合了,,还是对官方的mpl库融合念念不忘,毕竟官方给出的融合是有一定的好处的,准备买一块f429的来试试是否是因为缺少FPU而导致无法解算
回复

使用道具 举报

3

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2016-11-13
在线时间
40 小时
 楼主| 发表于 2018-6-19 16:57:38 | 显示全部楼层
way7539512 发表于 2018-6-19 10:37
那不就相当于不用官方的融合算法,直接读取模块的原始数据进行融合了,,还是对官方的mpl库融合念念不忘 ...

应该不是FPU的问题,我在移植的时候第四步已经把libmpllib.lib库换成M3的了
回复

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-6-28
在线时间
44 小时
发表于 2018-7-22 17:20:31 | 显示全部楼层
我也是这个问题,自检出错,一直都报错。磁力计是单次测量模式的,得每次都去开启并且设置。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-25
在线时间
20 小时
发表于 2019-8-8 15:36:02 | 显示全部楼层
本帖最后由 rm电佬 于 2019-8-23 19:34 编辑

必须要保证MPU9250在静置和平行的状态下才能自检通过哦
回复

使用道具 举报

3

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2019-7-27
在线时间
38 小时
发表于 2019-10-19 15:43:34 | 显示全部楼层
刚好用到f103zet6搭载9250,大佬可以分享下9250源码吗
回复

使用道具 举报

15

主题

93

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1767
金钱
1767
注册时间
2013-8-22
在线时间
128 小时
发表于 2019-10-24 13:47:30 | 显示全部楼层
本帖最后由 lhf_1230 于 2019-10-24 13:50 编辑

我遇到的情况是运行在
res=MPU_Read_Byte(AK8963_ADDR,MAG_WIA);时,读出的不是有效ID,而是0XFF,获取不到数据;
全速运行时不间断的输出 Compass not found.

我不理财,财就不理我。
回复

使用道具 举报

15

主题

93

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1767
金钱
1767
注册时间
2013-8-22
在线时间
128 小时
发表于 2019-10-25 16:20:38 | 显示全部楼层
lhf_1230 发表于 2019-10-24 13:47
我遇到的情况是运行在
res=MPU_Read_Byte(AK8963_ADDR,MAG_WIA);时,读出的不是有效ID,而是0XFF,获取不 ...

Compass not found.  
这个问题已经解决,是103里面的IIC配置错了,改成
//IO方向设置
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
就好了,
但是也遇到了楼主所说的自检错误了,用F7的板子实验完全没问题
我不理财,财就不理我。
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-9-16
在线时间
4 小时
发表于 2019-11-22 15:32:12 | 显示全部楼层
CROLEY 发表于 2019-10-19 15:43
刚好用到f103zet6搭载9250,大佬可以分享下9250源码吗

搭载成功了吗?
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-8-2
在线时间
8 小时
发表于 2019-12-3 21:06:07 | 显示全部楼层

搭载成功了吗?我也刚好需要
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-4-20
在线时间
8 小时
发表于 2020-8-4 09:14:58 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-4-20
在线时间
8 小时
发表于 2020-8-5 14:38:15 | 显示全部楼层
mpl_key,这个变量有什么用

unsigned char *mpl_key = (unsigned char*)"eMPL 5.1";  // MPL库版本,这句话有什么用
回复

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2020-9-29 17:56:49 | 显示全部楼层
fantasyfeather 发表于 2018-6-19 09:58
软件解算,当然不用MPL了,直接拿着传感器原始数据处理

我移植了AHRS,Yaw不稳定,磁力计校准方法能分享下吗?
签名必须手写!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 02:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表