目录

基于FPGA的可变频率SPWM波形发生器

在许多场合中,正弦波的发生都需要DAC(数字-模拟转换器)。但对于精度要求不高的场合,使用FPGA直接生成按照正弦变化的PWM波,经过低通滤波器即可获得正弦波。通过Verilog HDL语言,还可以设计出具有频率可调等复杂功能的正弦波发生器。

引言

SPWM是电路中较为成熟的一种PWM方法,在采样控制理论中有一个重要的结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上,其效果基本相同。冲量指窄脉冲的面积。效果基本相同指环节的输出响应波形基本相同。如把各输出波形用傅氏变换分析,则其低频特性非常接近,仅在高频段略有差异。这一结论是PWM控制的重要理论基础。将正弦半波看成由N个彼此相联的脉冲组成的波形。这些脉冲宽度相等,但幅度不等,且脉冲的顶部为曲线,各脉冲的幅值按正弦规律变化。如果将上述脉冲序列用同样数量的等幅不等宽的矩形脉冲序列代替,使矩形脉冲的中点和相应正弦波部分的中点重合,且使矩形脉冲和相应的正弦波部分面积相等,就得到了脉冲信号占空比按正弦规律变化的PWM波,像这种脉冲宽度按正弦规律变化而和正弦波等效的波形即为SPWM波形。 得到SPWM的具体实现方法可以是用一个正弦波发生器和一个锯齿波发生器,发出正弦波和锯齿波,由它们的交点确定逆变器的开关模式。正弦波大于锯齿波时,使相应的开关器件导通;当正弦波小于锯齿波时,使相应的开关器件截止。

系统设计

系统硬件设计框图如下图所示。

外部时钟源由FPGA开发板上的有源晶振提供,为精确度高于0.1%的50MHz方波。这一信号输入到FPGA,充当所有程序模块运行的时基。FPGA内部有一系列由Verilog编写的逻辑,可以读取外部8位开关的输入,通过内部的数字逻辑生成频率可变的SPWM波,并将频率数值显示在数码管上。 FPGA所输出的SPWM波为符合FPGA电平(2.5V)的方波,该方波通过外部RC低通滤波电路转化成正弦波输出。 系统软件设计框图如下图所示。

系统整体的架构为两个波形的发生器与一个比较器。两个波形发生器分别为正弦波发生器和锯齿波发生器。正弦波计算对于纯数字电路过于复杂,因此采用计算机提前生成正弦波的数据,并通过一ROM的IP核进行存储,通过一个计数器充当地址生成器,以一定的频率源源不断地从ROM中取出数据,送入比较器中。锯齿波发生器则为一计数器,对一个变量不断地做加一的操作,当该变量大于其位宽时溢出归零,达到锯齿波的效果。 锯齿波生成器的时钟源为外部50MHz的时钟直接输入,而地址产生器的时钟源则为外部时钟通过可调分频器得来。该分频器根据外部按键的输入,将外部时钟分频为合适的计数时钟,供正弦波发生器使用,以调整SPWM波输出的频率。 除此之外,还额外增加了一个数码管扫描模块,以便驱动数码管显示当前频率值。

模块设计

可变频率分频模块

由外部直接输入的高频时钟信号显然不能直接输入到正弦波发生器中,因此需要在输入之前进行分频;又因为题目要求输出正弦波的频率可调,在控制正弦波输出时钟处进行频率调整是最简单的做法。由于我们的正弦波存储深度为256个字,也就是一个周期有256个正弦波的数据,输出信号的频率又等于正弦波形的一个周期,因此最终输出频率等于

f=50Mhz/256/f0

其中f为分频模块输出到地址产生器的频率,为输出正弦波频率的256倍,f0为输出正弦波的频率。

地址产生模块

地址产生模块的本质为一计数器。在可变频率分频模块之后,每一个脉冲计数值加1,并将此计数值送到ROM,这样即可按照输出正弦波的频率将ROM内的每一个数据输出。

ROM

ROM为Quartus提供的IP核,可以生成一个预置数据的ROM。实际生成的ROM具有8位字宽,256byte容量,ROM与外部的连接包括一个时钟信号,一个8位的地址输入和8位的数据输出,其中地址输入连接到地址产生模块,数据输出即为正弦波的数据,连接到后续的比较器。

https://img.yuanze.wang/posts/spwm-generator/wave-geneartor.png
mif文件生成工具

该工具可以设定波形种类、波形位宽与长度,可以很好地进行本ROM数据的生成。生成完毕mif数据文件以后,通过Quartus自带的MegaWizard Plugin Manager添加一个1-Port ROM的IP核,参数选择与mif文件一致,如图3-2所示,并选择mif文件为预置数据文件,这样就生成了一个具有正弦数据的ROM。

https://img.yuanze.wang/posts/spwm-generator/ip-core.png
配置IP核

值得注意的是,ROM中的正弦数据均为加上一半位宽后的值,这样可以避免处理负数,减小电路复杂程度。

锯齿波生成器与比较器

锯齿波生成器的本质是一个8位计数器,当计数器加满以后会自动溢出归零,即可生成锯齿波。Verilog语言可以方便的进行大小比较。在锯齿波数值发生变化之后,将锯齿波数值与正弦波数值进行比较,若大于1则输出1,小于1则输出0,这样就可以实现SPWM波的输出。 需要注意的是调制波锯齿波频率与被调制波正弦波频率之比。为了实现更好的波形输出,调制波的频率应该远大于被调制波的频率。对于锯齿波发生器的时钟,我们未进行分频,因此载波的频率为50MHz/256=195KHz,而调制波的最高频率仅为256Hz,两者相差数百倍,可以很好地还原正弦波信号。

实物展示

https://img.yuanze.wang/posts/spwm-generator/hardware.jpg
FPGA及外部硬件

https://img.yuanze.wang/posts/spwm-generator/wave-32hz.jpg
32Hz波形

https://img.yuanze.wang/posts/spwm-generator/wave-256hz.jpg
256Hz波形

 Quartus工程