基于STM32F103ZET6的波形型号发生器的设计与制作

(整期优先)网络出版时间:2022-09-05
/ 2

基于STM32F103ZET6的波形型号发生器的设计与制作

冯琳莹,刘聪,孙彭轩,秦鸣霄

云南大学 650500

云南大学 650500

云南大学 650500

云南大学 650500

摘要:信号发生器是一种能提供各种频率、波形和输出电平电信号的设备,其在工业领域拥有广泛的应用。本文设计了一种发生频率为0-50khz,峰值为0-3v的建议信号发生器。通过STM32F103ZET6主控芯片和DAC数模转换器,可实现输出方波、正弦波、三角波和锯齿波四种波形的信号输出。

关键词:嵌入式系统;STM32F103ZET6;函数信号发生器;单片机;

0 引言

同时,在电工电子领域上,信号发生器主要产生特定频率、幅值的信号,用于激励被测电路,从而完成一定的测量任务。本文以STM103FZET6的主控芯片为核心,设计了一款简易低廉的信号发生器。

1 电路设计

软件设计:

本软件设计主要实现对于不同波形、频率、幅值的波形的输出,并且可以结合屏幕与按键对这三种参数的值进行修改。

程序设定可通过PA4端口输出正弦波、三角波、矩形波、锯齿波四种波形,幅值范围为0-3v,频率范围为0-10kHz。屏幕上分行显示当前输出波形的类型、频率以及幅值,并以左方的箭头来标识当前可更改的参数值。通过按钮中的上下键来更改箭头的位置,通过左右键来修改箭头指向参数的值。

其流程图如下:

程序开始后,将对硬件资源进行初始化。初始化完成后,将输出默认的波形。通过在LCD屏幕上打印箭头及其文字,来绘制基本的交互界面。随后进入循环,当用户按下按键时,程序将根据按键以及参数的值对界面进行更新,如果波形参数有修改,将通过一系列操作输出修改后的波形。以下为程序各部分的详细介绍

1.1、程序初始化

程序初始化的过程中主要对按键、LCD、PA4波形输出端口、定时器、DAM以及DAC进行初始化,并生成各种波形的数据数组。本设计通过DMA来向DAC传输数据,并使用定时器的上升沿来作为DMA传输数据的信号。因此本小节主要讲解波形输出相关的初始化。

1.2、生成波形数据

定义SAMPLING来设置每个数组的大小。SAMPLING的值越大,数组中的数据越多,产生的波形就越精细,同时输出波形的最大频率会变小。通过编写数据生成函数来生成不同波形的数据,比如生成正弦波波形数据的函数为:

 

其中变量cycle表示数组的长度,D为装载数据的数组,Um表示波形的幅度。长度为cycle的数组,就表示需要在一个周期的正弦波上均匀取cycle次样。那么第i次取样的弧度制为,此次取样的正弦值为。由于输入DAC的数据必须为正数,因此需要对波形进行偏移,那么就有:。本题中DAC为12位,那么它可输出的最小电压为,可知要想输出大小为aV的的电压,需要向DAC传入的数据为:。则可得上述正弦波波形数据生成代码。

此外,我自己做了一部分的拓展内容,除了正弦波、方波、矩形波外我还做了一个锯齿波,其代码如下:

 

其原理与正弦波类似,故不再赘述。

1.3、GPIO、定时器、DAC、DMA的初始化

波形输出端口PA4需要初始化为推挽输出模式。定时器则选择TIM2,并将其输出触发设置为更新模式。DAC的触发方式设置为TIM2触发,当TIM2的时钟信号来临时,DAC将通过DMA读取一次数据,并将其转化为特定大小的电压。

DMA的数据传输方向设置为DMADIRPeripheralDST,即外设从内存中读取数据。外设地址DMAPeripheralBaseAddr应设置为DACDHR12R1,即DAC通道1的地址,而内存地址则为数据数组的地址。

为了保证其能一直输出波形,将DMAMode设置为DMAModeCircular,以设置为循环发送模式。外设的地址保持不变,而我们希望将数组中所有的数据都传输出去,因此DMAPeripheralInc设置为DMAPeripheralIncDisable,即为外设地址不递增,而DMAMemoryInc设置为DMAMemoryInc_Enable,即内存地址递增。

以上各部分依次初始化完成后,使能定时器,波形即可开始产生。

3.3、绘制交互页面与刷新页面

 

通过函数LCDShowString()以及LCDShowNum()即可在屏幕上打印字符串或数字。改变POINT_COLOR的值,则可以修改程序打印文字的颜色。通过以上语句,即可将界面中所需要的字符与数字打印在屏幕上。

当箭头的位置改变或者某个数字需要变化时,需要先抹除旧字迹,再打印新的上去。LCDFill()可以在屏幕上的某个区域中填充指定的颜色。本设计中指定为白色,就可以用来擦除屏幕上的文字,以为新的文字留出空间。若不使用LCDFIll()来抹除旧字迹的话,会导致文字的相互叠加。

1.4、响应按键

通过变量LocationFlag来记录箭头当前所在的位置,按下上/下键,可以改变LocationFlag的值,进而改变箭头的位置。而当左/右键被按下时,将根据Location_Flag的值执行相对应的操作。这些操作包括:改变输出波形、调整输出波形的频率、调整输出波形的幅度。

1.5、改变输出波形

通过定义变量WaveFlag来记录当前输出波形的类型,当需要对波形进行修改时,先改变WaveFlag的值,并将其传入Wave_Switch()函数中。此函数会重启DMA,根据接收的变量重新指定数据数组的位置,以达到改变波形类型的目的。

1.6、调整输出波形的频率

通过定义变量freq来记录当前输出波形的频率。当需要修改波形频率时,先改变freq的值,并将其传入Freq_Switch()函数中。此函数会重启TIM2,根据接收到的变量重新设置定时器的频率,以达到改变波形频率的目的。

1.7、调整输出波形的幅值

通过定义变量Am来记录当前输出波形的幅值。当需要修改波形幅度时,先改变Am的值,并将其传入SineWave_Init()函数中。此函数会根据输入的数据更新所有的波形数据数组,并重启TIM、DMA以及DAC,以达到改变波形幅值的目的。

1.8、操作步骤

(1)将两条杜邦线分别连接单片机的PA4以及GND,再将示波器的探头连接到杜邦线上,并启动战舰版。

(2)按下示波器的AUTO按钮,可以看到示波器上的正弦波形。

(3)此时屏幕上的箭头指向第一行,按下右键,可以看到示波器上的正弦波形切换为方波。

(4)按下下键,让箭头指向第二行,再按下左键,可以看到示波器上的波形变得稀疏,频率变低。

(5)再次按下下键,让箭头指向第三行,再按下右键,可以看到示波器上的波形变高,幅值变大。

以上分别问矩形波、三角波、正弦波和锯齿波的信号产生结果。

2 结论

信号发生器一个比较困难的地方在于我们需要生成波形信号,而怎么计算、控制波形的频率和幅值成为了一个比较主要的部分。改变波形的频率需要改变定时器的频率,因此在主函数中只需设定按键对当前频率值进行修改,并传入相应函数中改变定时器频率。改变波形的幅值,需要及时根据我们输入的数值对波形重新计算,然后更新数组,来达到更新波形图的目的。此外,在图像精细度方面,一个周期内波形的采样次数越多,我们所得到的图像也就越精细。在绘制用户操作界面的时候,我分别使用了KEY_UP和KEY_Down,来控制菜单的选择【选择输出波形、频率、和幅值】。并通过左右键选择需要修改的具体内容。

2 参考文献

[1]苏铜剑. 高速分段式电流舵数模转换器设计[D].电子科技大学,2021.DOI:10.27005/d.cnki.gdzku.2021.004775.

[2]杜丁丁,马坤茹.数字信号发生器的设计[J].河北农业大学学报,2009,32(1):117-121.

[3]冯志荣,王红梅.基于STM32F103ZET6的程控单相AC-DC变换电路设计[J].通信电源技术,2014,31(04):101-104.DOI:10.19399/j.cnki.tpt.2014.04.033.

1