OpenEdv-开源电子网

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

MPU6050 DMP 上电自检后水平面被重新定义的问题解析

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-11-22
在线时间
0 小时
发表于 2015-11-22 19:12:06 | 显示全部楼层 |阅读模式

   最近买了一个MPU6050 六轴陀螺仪模块,参考原子哥的例程轻松使用DMP驱动并在匿名上位机上成功显示其方位,温度,加速度,欧拉角等参数。
       正在兴致勃勃时刻,我随意放置陀螺仪模块后,复位了单片机,发现在陀螺仪并不水平的情况下,经过开机初始化之后,其输出状态居然是水平的。于是乎在思考,如果我要做一款平衡车,岂不是每一次上电都需要手动将小车放平然后再开机?????这也太不可学了,遍历了原子哥的论坛和度娘,发现也有人有和我一样的疑问,但是都没有找到问题的根本所在。没办法只能一步一步的去看DMP的开机初始化程序。当我看到这样一步的时候突然好像有所发现:(图中框框)

              这里是一个自检程序,当然,细心的人如果将它打开后会发现这里面实际也是一个校零程序,矫正三个方向的陀螺仪的零点漂移,第二个就是纠正重力方向,也就是开机时刻的加速度方向(通俗一点就是我们认为的水平方向),废话不多说,让我们打开run_self_test();看看里面是什么东西??:

大家看到了吗??     result = mpu_run_self_test(gyro, accel);  用于获得当前各轴的角速度和加速度,并且反馈芯片的状态。
                                 mpu_get_gyro_sens(&sens);                  这个就不用说了,用于获得角速度的计算比例;好戏在下头。
                                dmp_set_gyro_bias(gyro);                      这个把开机当前的角速度计算完成后送走了,送到哪里去了呢??当然是DMP                                                                                                   寄存器去了,为什么呐??它开机保存这个开机时刻的角速度干嘛呢??

         我们知道,对于运动,我们都要为其设立一个参考系,因为运动都是相对的,陀螺仪输出了值,这个值是相对与谁呢??我们在地球上,相对参考系当然是地面。假如我们在动车上做实验,陀螺仪输出的值是相对与谁呢??当然是动车!!!!   那为什么是动车呢?那我就告诉你,因为开机陀螺仪初始化的时候陀螺仪是相对火车静止的,故开机对谁静止,陀螺仪输出的值就是相对于谁的运动速率。
         回到主题,DMP自检时刻保存了开机时的陀螺仪速率,其实就是让陀螺仪检测到的速率去除开机时刻的速率,自然得到了陀螺仪与开机时刻参考系的相对速率,也就是我们需要的有效值。这也就是抑制温漂的原理。
         再来看看加速度重心的校准程序,与陀螺仪一样,均是修正相对参考系的速率和位置。但是加速度传感器不一样,只要传感器不动,其重力加速度方向是不变的,默认的是-Y是重力加速的的正方向。如果在模块非水平情况下进行了重力校准,那么-Y就不是重力方向了,为了得到无论模块处于什么状态是都需要—y是重力的正方向,我们就有这样的一个高大上的办法。那就是“不要对重力进行校准”
        改掉源代码就是在使用accel_sens前加一行:  accel_sens=0;使其重力校准失效!!!即可!!!



          经修改后,模块的初始方位不再收开机时刻模块位置的影响,使用DMP一样需要8S左右的时间稳定,起码不用再担心开机需要去将小车扶正吧!(如果是其他用途,需要开机修正方位的程序,这样就不行了哟!目测比较少)
         最后要感谢广大的电子同胞,看了你们的帖子和问题,我颇收益匪浅。感谢你们,因为你们都有一颗有福同享的心。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2015-11-22 20:44:17 | 显示全部楼层
呵呵  帮顶  其实论坛里早就有一版DMP  是无视初始位置的,但是原理是不是你这样,当时也没细看
学无止境
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-22 21:47:02 | 显示全部楼层
谢谢分享。。。。
楼主的头像有创意
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
635
金钱
635
注册时间
2014-6-20
在线时间
168 小时
发表于 2015-11-24 13:06:48 | 显示全部楼层
LZ这种钻研的精神 我很欣赏,赞一个
回复 支持 反对

使用道具 举报

7

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2015-12-11
在线时间
42 小时
发表于 2016-4-18 10:31:16 | 显示全部楼层
赞楼主 ,感谢
回复 支持 反对

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-5-20
在线时间
4 小时
发表于 2016-8-26 20:39:56 | 显示全部楼层
多谢,lz,帮了我一个大忙,哎总是感觉用dmp有点投机取巧,
回复 支持 反对

使用道具 举报

东风不可逆 该用户已被删除
发表于 2017-2-28 15:06:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2017-5-18
在线时间
0 小时
发表于 2017-5-18 14:43:14 | 显示全部楼层
我按照楼主改了后,是显示绝对位置了,但是除了上电初始化温度需要8秒外,在mpu转动改变位置的过程中,位置反映速度也变慢了约滞后几秒钟,有遇到这个情况的吗
回复 支持 反对

使用道具 举报

18

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-8-11
在线时间
64 小时
发表于 2017-9-14 14:49:09 | 显示全部楼层
楼主,我的模块跑mpu_run_self_test一直失败,是什么原因
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2017-4-15
在线时间
6 小时
发表于 2018-3-14 10:06:25 | 显示全部楼层
jermy_z 发表于 2015-11-22 20:44
呵呵  帮顶  其实论坛里早就有一版DMP  是无视初始位置的,但是原理是不是 ...

大神,那一版,无视初始位置的代码链接是?我正好也有这个问题
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-3-19
在线时间
6 小时
发表于 2018-7-13 14:03:47 | 显示全部楼层
谢谢大佬
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
发表于 2018-10-10 16:00:28 | 显示全部楼层
那输出的航向角,以什么为基准呢?
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-12-4
在线时间
18 小时
发表于 2019-7-14 16:36:24 | 显示全部楼层
BigDiong 发表于 2017-9-14 14:49
楼主,我的模块跑mpu_run_self_test一直失败,是什么原因

估计result == 0x7这里不通过,改成result == 0x3,0x7是加了磁力计才返回的结果
回复 支持 反对

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2019-1-30
在线时间
74 小时
发表于 2019-12-11 23:47:31 | 显示全部楼层
BigDiong 发表于 2017-9-14 14:49
楼主,我的模块跑mpu_run_self_test一直失败,是什么原因

必是ID读错了。检查接线和IO初始化
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-12-3
在线时间
4 小时
发表于 2020-3-5 12:38:34 | 显示全部楼层
楼主厉害啊
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-6-3
在线时间
3 小时
发表于 2020-6-16 18:54:35 | 显示全部楼层
垂直放置还是无法自检通过
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-11-23
在线时间
7 小时
发表于 2020-9-6 18:04:39 | 显示全部楼层
mark2020 发表于 2020-6-16 18:54
垂直放置还是无法自检通过

我的也是,mpu_run_self_test返回结果是1,然后我把默认等于3改成等于1,再加accel_sens=0; 这句话就可以了。
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-7-9
在线时间
15 小时
发表于 2022-1-20 09:20:25 | 显示全部楼层
本帖最后由 bb2511 于 2022-1-20 09:21 编辑

能分享下源代码吗
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2022-1-13
在线时间
14 小时
发表于 2022-6-7 16:56:47 | 显示全部楼层
于玮 发表于 2017-5-18 14:43
**** 作者被禁止或删除 内容自动屏蔽 ****

这个问题解决了吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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