大家好,我是张巧龙,之前有给实验室学生出了一道关于STM32的题:基于手势控制的波形产生题,题目简单,但综合性较强。
有些学生完成的还不错,个人觉得此题用来 入门 STM32再合适不过了。
展示视频:
【入门STM32】基于手势控制的波形发生器设计
特此放上,设计报告中的部分段落。
01
题目要求
基于手势控制的波形产生器
1.1 题目说明
以 C / C++ 为基础,采用正点原子STM32单片机为开发平台,编写一个波 形发生器程序,通过手势可以控制波形相应参数(频率、幅值、相位)。
1.2 要求
1.2.1 基本部分
(1) 进入一级菜单后,在屏幕上至少显示 3 栏以上信息:手势识别结果、按键产 生波形、手势产生波形,对功能进行选择时,左侧需要有明显的光标(可用 符号*代替光标);
进入二级菜单时,至少显示 3 栏以上的信息,分别命名 为相应功能(可参考框图名字也可自行命名);子菜单可以返回上级菜单(二级返回一级、一级返回初始界面)。
(2) 完成一级菜单下的手势识别功能;在二级菜单下,结合手势识别模块,完成 九种手势识别:上、下、左、右、前、后、顺时针、逆时针,识别结果显示在屏幕上以及串口上位机,通过手势可以控制开发板载LED亮灭。
(3) 完成一级菜单下的按键控制波形产生功能;在二级菜单下,结合 STM32 内 置 DAC,完成波形产生功能(三角波、正弦波、方波),并通过按键可以 调整波形参数(频率、幅值、相位)
1.2.2 发挥部分
(1) 完成一级菜单下的手势控制波形产生功能;在二级菜单下,结合 STM32 内 置 DAC,完成波形产生功能(三角波、正弦波、方波),并通过手势可以 调整波形参数(频率、幅值、相位)
(2) 系统代码简短,注释较多,可读性强,界面美观。
(3) 自行发挥(此部分必须要体现出参赛人员多做了工作)
02
系统设计
2.1 系统简介
系统包括LCD显示屏模块、ATK-PAJ7620手势识别模块、放大模块、电源模块、交互模块、控制模块。通过上述六大模块实现正弦波、三角波、方波的产生与控制。
各模块之间联系如下图所示,LCD显示模块、电源模块、控制模块、手势识别模块、交互模块同时作用于整个系统。保证系统进行正确的界面显示、系统控制和系统的正常运行。
放大模块连接在STM32波形输出端,用于放大输出波形,提高波形输出的调节范围,增加系统实用价值。
系统简介
系统实物图
2.2 系统总体设计思路
系统包括LCD显示屏模块、ATK-PAJ7620手势识别模块、放大模块、电源模块、交互模块、控制模块。通过上述六大模块实现正弦波、三角波、方波的产生与控制。
各模块之间联系如下图所示,LCD显示模块、电源模块、控制模块、手势识别模块、交互模块同时作用于整个系统,保证系统进行正确的界面显示、系统控制和系统的正常运行。
放大模块连接在STM32波形输出端,用于放大输出波形,提高波形输出的调节范围,增加系统实用价值。
系统总体设计思路
2.3 波形产生关键模块
用DAC来产生波形,系统使用的是STM32F103自带的DAC。为了提高DAC转换的速度,使用DMA传输波形数据,DMA的触发传输使用的是定时器的中断。
系统使用的正弦波波形数据是通过math.h函数计算得到的数组,三角波通过自定义函数计算波形数据,这两个波形一个周期内采样了250个数据点;
而方波的则不同,方波每个周期只改变两次DAC的值。
当用户通过交互界面改变幅值参数时,会重新计算波形数据数组。当用户改变频率参数时,会重新计算DMA定时器的周期。波形的输出和关闭则是通过改变DMA定时器中断使能和DMA传输使能实现。
DAC模块运行过程
波形函数为void Wave_Form_Init(u16 v,float flo,int s,int xf)。
参数为v:频率、flo:幅值、s:相位、xf:波形。
波形函数的作用是根据传入的参数计算各波形的两个周期的数据,通过DMA传输给DAC进行数模转换。
传输的数字信号范围为0~4095,对应输出的电压为0~3.25V。系统将根据参数计算出250个数据作为一个周期的数据,计算公式为:
其中wave为储存数据的数组,A为幅值参数、t为时间。
调用此函数时需要传递相应参数,函数会计算出两个周期的数据点,然后经过DMA将数据快速传入DAC,从而可输出不间断的波形。
波形函数的执行流程图如下2-3所示:
波形函数运行流程图
2.4 手势识别模块
采用ATK-PAJ7620手势识别模块,用于识别手势指令进行手势控制。
03
系统功能演示
3.1 菜单显示演示
系统设计了多级菜单和初始化界面,界面美观、合理,显示内容多样。提升控制便捷性,显示过程不闪屏。
菜单包括初始界面、一级菜单、二级菜单、三级功能界面。
展示如下:
3.2 波形产生演示
系统波形产生稳定,且可以在屏幕上显示,但是由于波形频率,峰值等参数调节范围大,屏幕显示需要不断放大缩小。
3.3 相位移动演示
相位移动功能是通过与零相位波形比较才能在示波器中识别出,为此单片机将输出两个波形,其中标准波形相位恒为零,输出波形相位随参数调节而变化。
04
遇见的问题与解决方案
4.1 相位调节问题
第一是相位调节后的波形与原波形相似,无法判断波形相位改变是否与调节位置一致。
第二是相位调节的实质是将波形左右平移,相对于DAC来说就是将一个周期中波形数字信号起始位置改变。但操作起来较为麻烦、
未解决上述问题,系统打开两个DAC通道,同时输出波形,两波形参数一直,但相位不同。对比波形相位不会改变,另一波形相位跟随参数的变换而变化从而解决了相位改变无法观测问题。
在计算波形数据时,250个数字信号为一个周期,系统定义的传递数字信号的数组为500个数字信号。前后250个数据是一样的。
再使用DMC传递数组数据。但只传输250个,根据相位的变化改变传输的起始位置从而实现了相位移动。
4.2 波形函数与LCD显示函数内存冲突
在调试系统过程中发现波形产生函数,与LCD显示函数存在内存冲突问题,导致波形产生函数通过DMA传递的数据会被影响,改变,从而导致了输出波形失真或不输出波形。另外还存在一些其他函数会影响开发的波形产生函数。
为解决波形产生问题,系统将波形函数中传输数字信号的数字定义为静态变量,在系统运行之前分配静态储存空间给该数组,使数值储存空间不会受其他函数影响。
调整了波形函数调用位置,使该函数的调用皆在LCD显示函数之后。采用上述解决方法后,波形产生正常。
05
最后
由于篇幅有限,过多的细节在此不放了,有需要详细设计报告以及代码的,请加微信:great_xiaolong,加好友记得备注。
精彩推荐:点击图片即可跳转阅读
大快人心,盗版串口芯片CH340的被判刑了,公司被罚400万!
-END-
我是张巧龙,一名教电子的大学老师,欢迎关注!