基于STM32F103的“口袋”开发板的平衡尺
利用STM32F103的“口袋”嵌入式学习/控制平台制作的平衡尺
标签
嵌入式系统
显示
aramy
更新2021-03-03
893

实现目标: 制作一个能够测量角度的水平仪,通过“水银柱”的方式在屏幕上显示,并显示板子倾斜的角度

程序说明

实现原理:板子上集成了MPU6050芯片,通过该芯片在x,y,z 轴上测量加速度值,感知开发板的当前状态。开发板在任意时间都是受到重力加速度,通过x,y,z 轴的加速度分量,利用三角函数计算出当前的倾角angle = atan2(ay1,ax1)。受硬件影响,加速度值的读取总是会有少许扰动,在长期来看是准确的,在短时间内总是波动的。所以引入角速度来平抑硬件带来的波动。角速度与时间的积分,可以获得单位时间内变化的角度。将加速度与角速度的测量值用一阶互补滤波得到在水平面x,y两个分量的角度值。

绘图部分,开发板带了个240*240的SPI接口驱动的彩色屏幕。在屏幕中心绘制交叉的一个十字架,分别代表横向和纵向的水平分量。当开发板水平后,则在中心部位用不同的色块进行标记。当不水平时显示不水平的程度。图标使用40*40个像素的方块,当图标移动时,使用与背景色相同的色块对历史色块进行擦除,以提高绘制速度。

代码说明:项目代码利用以前制作平衡车的代码进行重构。项目是依赖于keil5编写。使用的是C++进行编写。按功能模块分三个大类。

MPU6050用来读取mpu6050传感器的类。配置mpu6050加速度量程为正负2G,角速度量程为正负2000°/秒。由于mpu6050芯片装在板子的背面,使用矩阵[1,-1,-1]对传感器数据进行翻转。使用固定值对角速度进行校零处理。读取传感器使用IIC接口,这里使用gpio模拟IIC。调用模拟IIC协议类Wire,控制IIC的读写。

LCDSimSpi用来控制彩色屏幕。由于硬件并没有接到stm32的spi管脚上。所以SPI也是使用gpio模拟spi操作。参考网上的例程,实现图片的绘制。屏幕背景色使用黑色,x,y轴使用40像素宽度的两个互相垂直蓝色的矩形。动态角度图片使用一个40*40的小鸭子图片。在x,y轴上移动时,鸭头的方向指向需要恢复的方向。移动过程中使用同一张图片,对图片进行矩阵旋转控制鸭头指向。

BlanceRule实现最终的平衡尺的类。利用stm32的SysTick_Handler控制时间。每秒读取200次mpu6050传感器,每秒绘制50次图片。一阶滤波加速度权重取值为0.2。事先做好测量,将开发板水平方向的角度值校正。当开发板水平角度变化时,在屏幕用数值上输出x,y轴偏角,保留1位小数。在x,y轴上绘制小鸭图片指示偏转角度。当图片位置发生变化时,在历史位置上绘制与背景色颜色相同、与图片大小相同的矩形用来消除历史图片。当板子水平面x,y轴上的偏角小于正负0.5度时,就认为板子水平了,在坐标轴中间用40*40的紫色图片标识平衡。当角度超过正负10.5°时,小鸭已经移动到屏幕边缘,将待在屏幕边缘不再移动。

 

 

后记:

非常感谢电子森林举办的这次活动。程序使用C++完成。校之C语言,C++在模块逻辑上更加清晰,代码的复用性有所增强。但是局限于我个人的水平,代码还是感觉凌乱。屏幕显示抖动还是很厉害,有待优化。等待活动结束后能够通过学习活动中优秀的作品提升自己。

附件下载
stm32平衡尺.zip
团队介绍
个人电子爱好者
团队成员
魏雷
中国邮政集团公司下属的东莞市一名员工。现从事计算机软件开发与维护工作。玩单片机业属于自己的业余爱好,利用业余时间了解电子世界,对新科技充满了好奇与兴趣。
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号