OpenEdv-开源电子网

标题: MPU6050 DMP 上电自检后水平面被重新定义的问题解析 [打印本页]

作者: xyy840948307    时间: 2015-11-22 19:12
标题: MPU6050 DMP 上电自检后水平面被重新定义的问题解析

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

(, 下载次数: 354)

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

(, 下载次数: 284) 大家看到了吗??     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;使其重力校准失效!!!即可!!!

(, 下载次数: 251)

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



作者: jermy_z    时间: 2015-11-22 20:44
呵呵  帮顶  其实论坛里早就有一版DMP  是无视初始位置的,但是原理是不是你这样,当时也没细看
作者: 正点原子    时间: 2015-11-22 21:47
谢谢分享。。。。
楼主的头像有创意
作者: Fliger    时间: 2015-11-24 13:06
LZ这种钻研的精神 我很欣赏,赞一个
作者: 爱吃排骨的蛋炒饭    时间: 2016-4-18 10:31
赞楼主 ,感谢
作者: 15765340834    时间: 2016-8-26 20:39
多谢,lz,帮了我一个大忙,哎总是感觉用dmp有点投机取巧,
作者: 东风不可逆    时间: 2017-2-28 15:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: 于玮    时间: 2017-5-18 14:43
我按照楼主改了后,是显示绝对位置了,但是除了上电初始化温度需要8秒外,在mpu转动改变位置的过程中,位置反映速度也变慢了约滞后几秒钟,有遇到这个情况的吗

作者: BigDiong    时间: 2017-9-14 14:49
楼主,我的模块跑mpu_run_self_test一直失败,是什么原因
作者: 时间货币    时间: 2018-3-14 10:06
jermy_z 发表于 2015-11-22 20:44
呵呵  帮顶  其实论坛里早就有一版DMP  是无视初始位置的,但是原理是不是 ...

大神,那一版,无视初始位置的代码链接是?我正好也有这个问题
作者: valk    时间: 2018-7-13 14:03
谢谢大佬
作者: BUGMAN    时间: 2018-10-10 16:00
那输出的航向角,以什么为基准呢?
作者: 赵康的程序未来    时间: 2019-7-14 16:36
BigDiong 发表于 2017-9-14 14:49
楼主,我的模块跑mpu_run_self_test一直失败,是什么原因

估计result == 0x7这里不通过,改成result == 0x3,0x7是加了磁力计才返回的结果
作者: 妙行    时间: 2019-12-11 23:47
BigDiong 发表于 2017-9-14 14:49
楼主,我的模块跑mpu_run_self_test一直失败,是什么原因

必是ID读错了。检查接线和IO初始化
作者: 红烧猪肘子    时间: 2020-3-5 12:38
楼主厉害啊
作者: mark2020    时间: 2020-6-16 18:54
垂直放置还是无法自检通过
作者: 春风沂水    时间: 2020-9-6 18:04
mark2020 发表于 2020-6-16 18:54
垂直放置还是无法自检通过

我的也是,mpu_run_self_test返回结果是1,然后我把默认等于3改成等于1,再加accel_sens=0; 这句话就可以了。
作者: bb2511    时间: 2022-1-20 09:20
本帖最后由 bb2511 于 2022-1-20 09:21 编辑

能分享下源代码吗
作者: Jackhem    时间: 2022-6-7 16:56
于玮 发表于 2017-5-18 14:43
**** 作者被禁止或删除 内容自动屏蔽 ****

这个问题解决了吗




欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) Powered by Discuz! X3.4