在制作平衡车或者飞行器时,不可避免地需要知道设备本身的姿态,一般我们使用陀螺仪和加速度计来获取这些信息。
陀螺仪用来测量物体的角度。传统的机械式陀螺的原理,和我们小时候玩的陀螺一样,是利用了高速旋转的物体能保持轴线稳定的特性;机械式陀螺需要的加工精度非常高,但是测角精度一般。后来发展出来的光纤陀螺和激光陀螺虽然原理上已经有了很大不同,但还是沿用了陀螺仪这个叫法,它们的精度要比机械式的陀螺高很多,价格也较贵。MEMS陀螺是基于微机电技术,它的突出特点是体积小、成本低,但是初始精度低,一般需要校准后才能获得较理想的数据;目前市面上常见的小型飞行器、平衡车,都是用的MEMS陀螺,正是由于低成本MEMS器件的出现,近年来小型无人机得到了飞速发展。
加速度计用来测量物体的加速度,进而可以积分后得到物体的速度和位移。
在一般的姿态测量的应用中,加速度计还可以用于校准陀螺仪的数据。这是因为加速度计可以实时测量重力加速度,根据重力加速度的方向,可以知道物体本身的一些姿态信息。陀螺仪的数据在较短时间内是比较准确的,但是长时间会有误差累积;所以,陀螺仪长时间的数据需要通过加速度计测得的重力角度来修正。
MPU6050集成了3轴陀螺仪和3轴加速度计,可以获取物体的姿态和运动信息。陀螺仪可测范围为±250,±500,±1000,±2000°/秒,加速度计可测范围为±2,±4,±8,±16g,使用16bitAD采样。使用I2C接口通信。
本节我们就来使用STM32获取MPU6050的加速度和角速度数据,并介绍一种简单的初始校准方法,最后使用匿名四轴地面站来显示加速度和角速度的波形图。
1)MPU6050硬件介绍
本文使用的是下图这种MPU6050模块(GY521):
模块的电路板上,已经标明了X轴、Y轴的方向,而Z轴的方向由X轴、Y轴通过右手定则确定。
至于各角速度的方向,也是通过右手定则确定,如下图:
如果想把MPU6050集成到自己的电路板上,可以参考如下原理图设计:
使用LDO降压成3.3V作为MPU6050的供电;对外的接口最少需要连接VCC_5V、GND供电线,SCL、SDA I2C通信线。
本文把I2C的两根线连接到STM32的I2C1对应的引脚上。
2)配置cubemx工程
设置I2C1接口,速率为400KHz:
设置好后,生成keil工程。
3)MPU6050原始数据的获取
STM32的HAL库生成的硬件I2C代码有个bug,这里我们先修正一下:
就是I2C初始化的如下函数,需要添加一句,把时钟初始化的内容提到GPIO初始化之前,如果不修改,硬件I2C有时不能用。
编写代码时,将HAL库的I2C读写代码封装一下,以便于后面使用:
初始化MPU6050,如果我们只用最基本的功能,只要芯片唤醒,设置采样率、滤波器、量程等操作就可以了:(具体的寄存器含义,可以查看芯片数据手册)
初始化完成后,就可以读取MPU6050的数据了,我们需要获取的加速度和角速度数据,在寄存器ACCEL_XOUT_H(0x3B)为起始地址的14个字节中,其中前6个字节是三个方向的加速度,最后6个字节是三个方向的角速度。
主函数中,整个使用过程如下:
先调用MPU6050_Init()初始化、再使用MPU6050_Get()函数循环读取数据,打印输出。
依据前面设置的量程和采样bit位数,将加速度的原始数据还原成了g的倍数,角速度值还原成了°/s:
上述代码运行后,结果如图:
这是把传感器水平放置、静止时的测量原始值打印输出;可以看到,Z轴的加速度初始误差很大,达到了0.3个g左右;同样,X轴的角速度误差也很大。这样大的初始误差是不方便使用的。
4)简单的初始校准方法
一种简单的初始值校准方法,可以依据下面的方法实现:将MPU6050传感器固定好一个角度(如Z轴竖直向上),并且保持静止;这样它测量到的加速度值就只有单一的重力加速度,而角速度应为0,我们只要记录一定数据的数据取平均,就能得知初始的加速度、角速度偏移。
具体实现的代码实现如下:
执行完后,ax_cl、ay_cl…等几个变量中,就保存好了各方向的加速度、角速度的零位偏移值,以后使用时,获取原始数据后,再减去这些零位偏移,就能获得校准后的值。
将MPU6050_Get()函数作如下改写,就能实现获取校准后的值:
主函数中,while(1)之前增加一次校准函数MPU6050_calibrate()的调用,再次测试结果如下:
可以看到,三个方向的加速度的偏差已经非常小,X轴和Y轴的角速度的偏差也比未校准前小了几个数量级。对于MPU6050这种精度较低的MEMS器件,依靠这样一个方向的校准数据也可以获取不错的效果。
5)波形显示
为了跟直观地显示各方向的加速度和角速度值,我们可以通过一些工具来显示波形图,这里我们使用匿名四轴的上位机软件来显示。
只需要按照它的格式将数据发到上位机,就能显示出波形,匿名四轴上位机的通信协议(V7版)如下:
我们按此格式将加速度、角速度的值填入,通过串口发送到上位机,就能显示了,实际测试图形如下:(显示的是Z轴的加速度和角速度)
在实际的应用中,加速度计和陀螺仪的数据需要融合,比如通过互补滤波或者卡尔曼滤波,才能获取更准确的姿态信息;传感器数据的初始校准,也不仅仅是测试一个方向、剔除零位这么简单。有兴趣的可以找更专业的书籍深入学习。
好了,本节关于MPU6050的一些基本应用就讲到这里了。
欢迎关注我的微信公众号:小白白学电子,可留言“资料”获取所有源码和参考资料: