MEMS陀螺仪_MEMS陀螺仪「建议收藏」

MEMS陀螺仪_MEMS陀螺仪「建议收藏」MPU6050集成了3轴陀螺仪和3轴加速度计,可以获取物体的姿态和运动信息

在制作平衡车或者飞行器时,不可避免地需要知道设备本身的姿态,一般我们使用陀螺仪和加速度计来获取这些信息。

陀螺仪用来测量物体的角度。传统的机械式陀螺的原理,和我们小时候玩的陀螺一样,是利用了高速旋转的物体能保持轴线稳定的特性;机械式陀螺需要的加工精度非常高,但是测角精度一般。后来发展出来的光纤陀螺和激光陀螺虽然原理上已经有了很大不同,但还是沿用了陀螺仪这个叫法,它们的精度要比机械式的陀螺高很多,价格也较贵。MEMS陀螺是基于微机电技术,它的突出特点是体积小、成本低,但是初始精度低,一般需要校准后才能获得较理想的数据;目前市面上常见的小型飞行器、平衡车,都是用的MEMS陀螺,正是由于低成本MEMS器件的出现,近年来小型无人机得到了飞速发展。

加速度计用来测量物体的加速度,进而可以积分后得到物体的速度和位移。

在一般的姿态测量的应用中,加速度计还可以用于校准陀螺仪的数据。这是因为加速度计可以实时测量重力加速度,根据重力加速度的方向,可以知道物体本身的一些姿态信息。陀螺仪的数据在较短时间内是比较准确的,但是长时间会有误差累积;所以,陀螺仪长时间的数据需要通过加速度计测得的重力角度来修正。

MPU6050集成了3轴陀螺仪和3轴加速度计,可以获取物体的姿态和运动信息。陀螺仪可测范围为±250,±500,±1000,±2000°/秒,加速度计可测范围为±2,±4,±8,±16g,使用16bitAD采样。使用I2C接口通信。

本节我们就来使用STM32获取MPU6050的加速度和角速度数据,并介绍一种简单的初始校准方法,最后使用匿名四轴地面站来显示加速度和角速度的波形图。

1)MPU6050硬件介绍

本文使用的是下图这种MPU6050模块(GY521):

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

模块的电路板上,已经标明了X轴、Y轴的方向,而Z轴的方向由X轴、Y轴通过右手定则确定。

至于各角速度的方向,也是通过右手定则确定,如下图:

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

如果想把MPU6050集成到自己的电路板上,可以参考如下原理图设计:

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

使用LDO降压成3.3V作为MPU6050的供电;对外的接口最少需要连接VCC_5V、GND供电线,SCL、SDA I2C通信线。

本文把I2C的两根线连接到STM32的I2C1对应的引脚上。

2)配置cubemx工程

设置I2C1接口,速率为400KHz:

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

设置好后,生成keil工程。

3)MPU6050原始数据的获取

STM32的HAL库生成的硬件I2C代码有个bug,这里我们先修正一下:

就是I2C初始化的如下函数,需要添加一句,把时钟初始化的内容提到GPIO初始化之前,如果不修改,硬件I2C有时不能用。

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

编写代码时,将HAL库的I2C读写代码封装一下,以便于后面使用:

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

初始化MPU6050,如果我们只用最基本的功能,只要芯片唤醒,设置采样率、滤波器、量程等操作就可以了:(具体的寄存器含义,可以查看芯片数据手册)

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

初始化完成后,就可以读取MPU6050的数据了,我们需要获取的加速度和角速度数据,在寄存器ACCEL_XOUT_H(0x3B)为起始地址的14个字节中,其中前6个字节是三个方向的加速度,最后6个字节是三个方向的角速度。

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

主函数中,整个使用过程如下:

先调用MPU6050_Init()初始化、再使用MPU6050_Get()函数循环读取数据,打印输出。

依据前面设置的量程和采样bit位数,将加速度的原始数据还原成了g的倍数,角速度值还原成了°/s:

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

上述代码运行后,结果如图:

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

这是把传感器水平放置、静止时的测量原始值打印输出;可以看到,Z轴的加速度初始误差很大,达到了0.3个g左右;同样,X轴的角速度误差也很大。这样大的初始误差是不方便使用的。

4)简单的初始校准方法

一种简单的初始值校准方法,可以依据下面的方法实现:将MPU6050传感器固定好一个角度(如Z轴竖直向上),并且保持静止;这样它测量到的加速度值就只有单一的重力加速度,而角速度应为0,我们只要记录一定数据的数据取平均,就能得知初始的加速度、角速度偏移。

具体实现的代码实现如下:

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

执行完后,ax_cl、ay_cl…等几个变量中,就保存好了各方向的加速度、角速度的零位偏移值,以后使用时,获取原始数据后,再减去这些零位偏移,就能获得校准后的值。

将MPU6050_Get()函数作如下改写,就能实现获取校准后的值:

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

主函数中,while(1)之前增加一次校准函数MPU6050_calibrate()的调用,再次测试结果如下:

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

可以看到,三个方向的加速度的偏差已经非常小,X轴和Y轴的角速度的偏差也比未校准前小了几个数量级。对于MPU6050这种精度较低的MEMS器件,依靠这样一个方向的校准数据也可以获取不错的效果。

5)波形显示

为了跟直观地显示各方向的加速度和角速度值,我们可以通过一些工具来显示波形图,这里我们使用匿名四轴的上位机软件来显示。

只需要按照它的格式将数据发到上位机,就能显示出波形,匿名四轴上位机的通信协议(V7版)如下:

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

我们按此格式将加速度、角速度的值填入,通过串口发送到上位机,就能显示了,实际测试图形如下:(显示的是Z轴的加速度和角速度)

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

在实际的应用中,加速度计和陀螺仪的数据需要融合,比如通过互补滤波或者卡尔曼滤波,才能获取更准确的姿态信息;传感器数据的初始校准,也不仅仅是测试一个方向、剔除零位这么简单。有兴趣的可以找更专业的书籍深入学习。

好了,本节关于MPU6050的一些基本应用就讲到这里了。

欢迎关注我的微信公众号:小白白学电子,可留言“资料”获取所有源码和参考资料:

MEMS陀螺仪_MEMS陀螺仪「建议收藏」

 

今天的文章MEMS陀螺仪_MEMS陀螺仪「建议收藏」分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/88860.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注