最近买了一个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左右的时间稳定,起码不用再担心开机需要去将小车扶正吧!(如果是其他用途,需要开机修正方位的程序,这样就不行了哟!目测比较少)
最后要感谢广大的电子同胞,看了你们的帖子和问题,我颇收益匪浅。感谢你们,因为你们都有一颗有福同享的心。
|