在龙芯1c单片机上获取MPU6050的原始数据

MPU6050简介

MPU6050和其它传感器有类似的地方,也有不同的地方。
类似的地方是输出一个物理量,比如加速度值,角速度值,温度值等。
不同的地方是MPU6050输出的数据可以通过一些算法处理后,得到一些更“高级”、更“人性化”的一些概念和数据。比如,可以将MPU6050输出的数据处理后,得到当前的运动状态,甚至通过分析一些小动作(运动状态)来获取当时的感情等。

计步器

手环、智能手表、现在很多手机都可以记步了,即记录走了多少步。

只需要一个3轴加速度计就可以了,即只需要MPU6050中的加速度计就可以了,也就是说如果只是为了做计步器的话,MPU6050有点浪费了(浪费了其中的陀螺仪功能),网上有用3轴加速度计ADXL345做计步器的文章,感兴趣的可以搜一下。简单来说就是在走路的时候,加速度计的数据会呈现一个正弦波的波形,只需要检测波峰波谷的个数,即可实现计步。当然如果要提高精度什么的,还需要应用一些算法等。

运动感测(加速、震动、冲击、倾斜、旋转等)

通过检测加速度计的值来判断是否有震动。比如,用指关节敲两下手机屏幕,就可以截图。我猜用的原理大概就这个吧。还有,当手机的闹钟或者电话响起时,只需要把手机翻转一下,即把屏幕朝下,手机就会自动静音。翻转这个动作已经表达了手机使用者的态度或者情感,所以手机会自动静音,这种交互方式更自然,更人性化。这里翻转手机可能需要用到陀螺仪,检测角速度。

平衡车和无人机

平衡车和无人机类似,都是通过将加速度计和陀螺仪的值融合后,得到倾角,即姿态(角)。然后根据当前姿态,用pid算法调整电机的转速和方向。本文重点以平衡车为例来讨论。


MPU6050的原始数据

什么是原始数据

原始数据是指直接从MPU6050读出来的值,即加速度值和角速度值。

一些应用场景中只需要这个原始数据即可,可是有一些应用场景需要对原始数据进一步转化。比如,平衡车和无人机需要的是倾角,即xyz每个轴的倾角,又称姿态。后面会讲解怎么进行姿态解算,即怎样从原始数据一步一步转化为倾角的。

只需要按照MPU6050芯片手册上的说明,就能获取到原始数据。
这里结合我的测试视频,重点讲解一下每个轴的加速度值和陀螺仪值是怎么测的。测试视频在http://new-play.tudou.com/v/905195549.html,下面详细讲解视频中是怎样测量每个轴的加速度值和角速度值的。

先来张实物图吧,如下


图中,是将MPU6050模块接在白菜板v2.1上测试的。测试过程中需要不断改变MPU6050模块的姿态,为了便于调整姿态,将MPU6050模块用胶布粘在了一个棍棒上。

测量加速度

来看下MPU6050的各个轴的方向,如下图所示

当加速度的方向与每个轴的方向相同时为正,相反时为负。
当MPU6050模块静止时,会收到重力加速度,并且方向始终向下。通过调整MPU6050的姿态,将重力加速度的方向分别与X,Y和Z轴重合,此时获取到的加速度值(原始数据)应该是重力加速度。

MPU6050水平放置时,Z轴的加速度值约等于重力加速度1g,如下

MPU6050垂直放置时,X轴的加速度值,如下图

MPU6050垂直放置时,Y轴的加速度值,如下图


注意,X轴加速度值为1g时,和Y轴加速度值为1g时,两个的垂直方向是不一样的。即姿态不一样。再去看看两个截图中MPU6050模块的姿态是不是一样的。

测量角速度

角速度和加速度不一样,角速度是旋转的方向,即旋转的方向和MPU6050芯片手册中每个轴的方向一致,则为正,相反,则为负。再来看下芯片手册中的有关方向的图,如下


图中围绕每个轴都画了一个旋转的箭头,即角速度即的方向与此相同则为正,相反则为负。
由于角速度是在旋转过程中测量的到的,所以静态的图片不能够很好的展示,最好结合我的测试视频好好体会一下。
旋转过程中,会不停打印当前角速度的值,通过观察串口打印的角速度值来初步判断认识。为了大家能更好的理解测试视频,这里将MPU6050围绕每个轴旋转时的,串口打印的角速度值截图。

围绕X轴旋转时,测量的加速度值如下

加速度值呈现正负交替的现象,那是因为再围绕X轴来回转动,测试视频体现得更直观。

围绕Y轴旋转时,测量的加速度值如下

围绕Z轴旋转时,测量的加速度值如下


MPU6050姿态解算

对于平衡车来说,只需要获取一个轴上的倾角即可,常称为俯仰角。对于四轴无人机来说,需要获取三个轴的倾角,根据每个轴上的倾角的作用不同,将这三个倾角分别命名为俯仰角,滚转角和偏航角。
姿态解算方法有多种,比如四元数法,一阶互补滤波法,卡尔曼滤波。我个人认为一阶互补滤波法比较适合入门,这里以平衡车上采用一阶互补滤波算法为例来讲解。

原始数据是如何转化为姿态角的

前面已经获取到了MPU6050的原始数据,即XYZ轴的加速度值和XYZ轴的角速度值,可是怎样才能得到倾角值呢?
方法有很多,比如把加速度值用三角函数算出重力加速度与Z轴的夹角(假设MPU6050水平放置),这个夹角就是俯仰角。又比如,把角速度积分可以得到角度,即俯仰角。
俯仰角这个名词很形象,自己慢慢体会吧。
理论上,用加速度值和角速度值都可以算出俯仰角,实际上两者各有缺点。比如,积分会使误差累积,很快误差就会达到不可接受的程度。而用三角函数这种方法看似很好,即三角函数本身不会引入误差,但由于平衡车运动时会产生加速度,电机的震动也会产生加速度等,这些干扰因素影响了加速度值的准确性,所以由加速度值转换得到的俯仰角也是有误差的。即不能单独使用加速度值和角速度值来获取准确的俯仰角。
一阶互补滤波法就是给两种方法算出来的俯仰角加上不同的权值,然后再结合起来,得到一个更准确的俯仰角。
得到了俯仰角就用pid算法控制电机转速和方向,最终实现俯仰角为0,即小车直立。


我的小店

我小店(https://shop333183734.taobao.com)有MPU6050模块。买模块,送源码,提供技术支持。

感谢阅读!


猜你喜欢

转载自blog.csdn.net/caogos/article/details/80519601