基于Verilog HDL的SPWM全数字算法的FPGA实现
扫描二维码
随时随地手机看文章
随着信号处理技术及集成电路制造工艺的不断发展,全数字化SPWM(正弦脉宽调制)算法在调速领域越来越受到青睐。实现SPWM控制算法的方法很多,其中模拟比较法因电路复杂、且不易与数字系统连接而很少采用;传统的微处理器因不能满足电机控制所要求的较高采样频率(≥1 kHz)而逐渐被高性能的DSP硬件系统所取代,但该系统成本高、设计复杂。与传统方法相比,在现场可编程逻辑器件FPGA上产生一种新的SPWM控制算法,具有成本低、研发周期短、执行速度高、可扩展能力强等优点。该技术进一步推动了变频调速技术的发展。
本文结合SPWM算法及FPGA的特点,以Actel FPGA作为控制核心,用Verilog HDL语言实现了可编程死区延时的三相六路SPWM全数字波形,并在Fushion StartKit开发板上实现了各功能模块,通过逻辑分析仪和数字存储示波器上验证了SPWM波形及死区时间,为该技术进一步应用和推广提供了一个平台。
1 Actel Fushion器件介绍[1-2]
Actel Fushion系列器件是一款具有模拟功能的Flash架构FPGA,结合先进的Flash FPGA数字技术和模拟技术,融合了FPGA数字内核、ADC、Flash存储器、模拟的I/O、RTC等部分。Fushion器件内部具有2 Mbit到8 Mbit不等的用户可用的Flash存储器;30个通道、最高12位精度、最高600 kS/s采样率的ADC;片内100 MHz的RC振荡器与PLL(锁相环)共同为FPGA提供时钟;Fushion内部40 bit的RTC除支持典型的RTC应用外,还可以控制片内1.5 V的电压调整器以实现低功耗的睡眠和唤醒模式。这些特点极大地提高了单芯片的功能,简化了整个系统设计,大幅度减少了电路板面积和系统的总成本。
Fushion系列AFS600内部含有用户使用的容量为4 Mbit的Flash存储器,内部存储器模块以Flash memory Block(FB)形式划分,每个FB限制为2 Mbit的空间,用户可以单独使用每个FB块,也可以自行用逻辑来级联所有的FB块以构建大容量的Flash存储器。Flash 存储器读操作可以从FB阵列、页面缓冲区或状态寄存器中读取数据。
2 数字系统电路总体设计方案
2.1 SPWM算法原理[3]
正弦脉宽调制技术(SPWM)是调制波为正弦波、载波为三角波或锯齿波的一种脉宽调制法,是现代变频调速系统中应用最为广泛的脉宽调制方式,目前有自然采样法、规则采样法、等面积法等。其中规则采样法计算简单,但谐波含量较大;一种改进的等面积法谐波含量低,但计算复杂,不利于系统实现;自然采样法是在正弦波和三角波的自然交点时刻控制功率开关器件的通断,是最理想的采样方法。
本文采用等腰三角波和三路相差120°的正弦波比较生成SPWM波,在Fushion StartKit开发板上采用自然采样法,结合数字频率合成技术DDS,生成死区延时可调的SPWM全数字波形。
2.2 数字系统电路总体方案设计[4-7]
Verilog HDL硬件描述语言具有很好的易读性和可重用性,结合Verilog HDL硬件描述语言设计规范及SPWM工作机理,用自顶向下的分割方法对整个系统进行总体方案设计。首先从系统设计入手,在顶层进行功能方框图的划分和结构设计。系统顶层功能方框图如图1所示。
根据顶层设计的思想,采用Verilog HDL语言分别实现各个模块的设计,最后把各个模块嵌入到顶层模块中,使各个模块有机地组成一个完整的整体。
3 系统模块的设计与实现
3.1 直接数字频率合成模块[8]
直接数字频率合成DDS是采用数字化技术,通过控制频率控制字直接产生所需的各种不同频率信号,突破了模拟频率合成法的原理,从“相位”的概念出发进行频率合成。这种合成方法不仅可以给出不同频率的正弦波,而且还可以给出不同初始相位的正弦波,甚至可以给出各种任意波形。电路一般包括基准时钟、频率累加器、相位累加器、幅度/相位转换电路、D/A 转换器。在设计中,将要输出的波形数据(如正弦函数表)预先存在ROM(或RAM)单元中,然后在系统标准时钟频率下,按照一定的顺序从ROM(或RAM)单元中读出数据,再进行D/A转换,就可以得到一定频率的输出波形。本设计直接利用从Flash存储器的存储单元中读出的离散正弦函数值与生成的三角波进行比较,实现系统的全数字化要求。
3.2 三角波产生模块
本模块采用同步三角波调制方法,利用可逆计数器对输入时钟进行计数。计数器先执行加法,从0计数到255,再执行减法计数从255到0,从而形成三角载波。如此反复就可以得到峰峰值255连续的三角波形。输入时钟是系统时钟通过锁相环输出的1 MHz的时钟。
3.3 建立正弦函数表
三角波的幅值范围在0~255,而正弦波的幅值在-1~+1之间,为了实现等幅值比较,将正弦波上移一个单位后,再将所有值同乘以128,使正弦波的幅值也在0~255之间。即:
m=128×(sin(x)+1) (1)
式(1)用C语言对此函数在一个周期(0~2π)内完成768个量化并且直接生成Flash存储器的初始化文件(.ahx)格式,再用SmartGen输入将Flash 存储器配置成常用的数据存储器,将预先生成的.ahx文件导入生成data Storage宏模块,就建立了正弦函数表。生成正弦函数表的流程图如图2所示。
3.4 三相正弦波产生和输出模块[9,10]
FPGA的Fushion芯片理论上可以实现任何方式的数学运算逻辑,但由于芯片的容量限制,并不是任何计算都能实现的。因此需事先将正弦函数离散并加载到FPGA的Flash存储器中,在正弦调制波的离散过程中即可将一个周期完整地离散。因此,只对其中A相进行离散化处理,数据存储在Flash存储器中,每个数据分配1个地址。即可以利用计数器来产生取正弦波数据的地址,通过数字频率合成技术改变计数器的计数频率就可以改变正弦波的频率。这样即可先输出一路的正弦波,另外两路正弦波产生的方法与此类似,只是起始取数据的地址相差120°,即分别从第256和第512个数据开始取数。
为了在每个调制波周期查找正弦函数表以及分别与载波进行比较,在设计中采用时分复用技术。即依据三相关系,由一个地址计数器,通过基本量加1转移到另一地址计数器中,并且在跳转过程中,这一地址计数器加1指向下一单元,从而分时取出三相地址单元的内容。利用对正弦表寻址的高速度,使一个正弦表在不同时间段查询不同相的正弦波的幅值,以达到减少正弦表所占用的FPGA资源的目的。这样就大大减少了逻辑数目,仅增加了地址选择器和三个同步存储器,实现了正弦函数表的复用,在很大程度上节省了芯片的资源。
电路的具体实现:相位互差120°的三路地址数据并行输入,通过一个三选一的选择器进行选择,选择器的控制端接三进制的计数器。如计数器为0时,输出A相地址,取出A相正弦值;为1时,输出B相地址,取出B相正弦值;为2时,输出C相地址,取出C相正弦值。因此只要使输入的三相地址周期性变化,就可实现并行输入的三相地址数据在时间上的连续,也就实现了三相地址数据的合成。这样就可以利用一个正弦表来得到三相的正弦值,达到减少正弦表占用FPGA资源的目的。
查表时每次只能输出一相的数据,所以每次产生的数据需利用寄存器先暂存一下。首先输出A相,通过暂存器l存入到A相存储器;接着输出B相,利用暂存器2存入到B相存储器;最后输出C相,利用暂存器3存入到C相存储器中。这样,三相正弦波数据都存储在各自的存储器中,这三个寄存器采用同步控制信号,当控制信号触发时,同时输出三相的正弦波数据用于后面的比较。该部分用状态机实现,其状态转换图如图3所示。
其部分程序代码如下:
case(state1)
A: //初始化状态
begin
ADDRES1out2)
outdata4=1;
else outdata4=0;
if(outdata1>out2)
outdata5=1;
else outdata5=0;
if(outdata2>out2)
outdata6=1;
else outdata6=0;
end
3.6 时延控制死区输出模块
对于SPWM三相桥式逆变器,由于开关管固有开关时间Ts的影响,开通时间Ton往往小于关断时间Tof,因此容易发生同臂两只开关管同时导通的短路故障。为了避免这种故障的发生,通常要设置开关死区ΔT,以保证同桥臂上的一只开关管可靠关断后,另一只开关管才能开通。死区的设置方式有两种:一种是提前关断、延时开通的双边对称设置;另一种是按时关断、延滞Δt开通的单边不对称设置。根据FPGA的编程特点,选择了按时关断、延滞Δt开通的单边不对称设置,并且时延死区的调节与控制与时延控制死区模块的输入时钟clk有关。
根据延时模块中延时信息:Δt=2×Tclk
clk是锁相环输出时钟CLK 1 MHz(本文采用的是1 MHz)的2次分频得到的时钟,只要改变顶层模块中对CLK 1 MHz的分频系数,就可以精确控制延滞Δt的大小,本文计算值Δt=4μs。
另外,死区调节单元还能消除由于FPGA器件本身时延造成的毛刺。其部分死区控制程序代码如下:
always@(posedge clk or posedge rst)
begin
if(rst) //异步复位
begin //初始化寄存器
q