一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 5422|回复: 0
收起左侧

基于FPGA的自治型SPWM波形发生器的设计

[复制链接]
发表于 2008-12-5 16:43 | 显示全部楼层 |阅读模式
摘  要:本文针对静止补偿器(STATCOM)对触发脉冲信号的要求,设计了一种基于FPGA的正弦脉宽调制(SPWM)波形发生器。通过正弦调制波与三角载波的比较,产生了六路PWM脉冲信号。正弦调制波的产生采用查表法,但仅将1/4周期的正弦波数据存入FPGA内部硬件所构造的ROM中,减少了系统的硬件开销,仿真结果证明了本设计的正确性。
/ t' z) Y; k; N, K7 D2 }% z, S0 d* s& i/ q, e
引言2 g* T5 L# l0 l9 X. j
    正弦脉宽调制(SPWM)技术在以电压源逆变电路为核心的电力电子装置中有着广泛的应用,如何产生SPWM脉冲序列及其实现手段是PWM技术的关键。利用模拟比较法,对三角载波与正弦调制波进行比较,即可产生SPWM脉冲;利用数字算法和定时逻辑,也可产生SPWM脉冲[5]。目前已有多种微处理器芯片(如 80C196MC、TMS320F240等)本身集成有数字化PWM发生电路[3]。模拟方法简单直观,但与数字控制器接口不便,难以满足复杂要求;数字方法结构灵活,尤其是微处理器内置了PWM发生器的,使用更加方便。通常状况下,微处理器通过定时中断服务程序产生SPWM脉冲,在每个载波周期必须进行中断处理,对处理速度要求较高,从而也限制了载波频率进一步的提高,同时微处理器的处理任务也更加繁重。文献[1]指出,微处理器中不确定的中断响应会导致PWM脉冲的相位抖动。5 i1 k% l3 X; y* X6 P
    FPGA以其可*性高、功耗低、保密性强等特点,在电子产品设计中得到广泛的应用。文献[1]~[5]也论述了FPGA或CPLD在PWM脉冲产生时刻的计算仍由微处理器来完成,实际上微处理器的任务仍然繁重。作者针对静止补偿器(STATCOM)对SPWM脉冲发生器的特定要求,采用Altera公司的 FLEX10K10芯片开发了一种专用SPWM波形发生器,微处理器只需在必要时改变逆变器PWM调制深度即可,其余工作全由FPGA完成,从而大大减轻了CPU的负担。
$ b  L6 x4 ?" ~; h  X( ESPWM发生原理
8 d* h$ r" X; l; ^+ Q    针对静止补偿器的电路结构,要求SPWM发生器可以发出三相六路PWM脉冲信号,脉冲宽度应根据微处理器输出的调制深度来调节。SPWM脉冲产生方法采用三角载波与正弦调制波比较的传统方法,但是三角载波、正弦调制波和比较逻辑等均采用基于FPGA的数字化方法来实现。该SPWM发生器的内部逻辑结构。总线接口逻辑单元首先接收来自微处理器的调制深度信号并锁存,正弦调制波产生电路在同步信号作用下从正弦函数表读取标准正弦信号幅值,与调制深度相乘,得出正弦调制信号幅值。三角载波发生电路在同步信号作用下,通过可逆计数器,发出三角载波幅值。正弦调制波幅值与三角载波幅值进行比较,就可以产生出SPWM脉冲信号。3 F* `9 @! i+ J8 o2 {
逻辑设计% n' P1 \# v3 I+ Z7 E5 ]3 u; Y
    SPWM脉冲发生器由微处理器总线接口电路、三角载波产生电路、正弦调制波产生电路、正弦函数表和比较控制电路等逻辑功能模块组成。
# t) S. M3 A: X总线接口单元8 u# Y* R4 X0 @% ^
    总线接口电路如图2所示的微处理器接口电路部分。其中D0~D7为数据总线,芯片选择信号为CS,写信号为WR,总线地址选择信号为A0~A2。微处理器接口电路主要用于FPGA芯片接收来自微处理器的调制深度信号 。
# i( ~* s6 \8 C: T: {三角载波发生器
+ X$ R2 b8 z' A& F1 E    利用可逆计数器对系统时钟进行计数。计数器先执行加法,从0计数到255,再执行减法计数从255到0,从而实现三角载波。三角载波的峰峰值为255。7 r& Y, M" I+ b
正弦调制波发生器
7 c5 g2 J1 G# n    FPGA芯片只能综合一些简单的加、减、乘、除等算术逻辑,要其实现正弦函数的计算非常不经济,正弦调制波的产生通过查正弦函数表来完成。在FPGA芯片内部开辟一块ROM区域,将离散时间正弦波幅值存入其中。在需要时,按照相位与地址一一对应的关系从表中依次读出即可。
" R7 c2 t4 o* z. k" V% M& x3 Y8 [    由于FPGA芯片的硬件资源有限,如何有效的利用资源成为非常关键的一点。考虑到正弦的周期性与对称性,因此在ROM表中只需存正弦函数\frac{ }{2}周期的波形数据即可。在本设计中,一个正弦波周期内共采样2048个点,相位分辩率为0.176 ,而实际在ROM表中只需存512个采样点,这样大大减少了芯片硬件资源的消耗。3 U# _, k! L0 {
正弦调制波幅值的调节4 d* c, D2 E6 I, A
    PWM脉冲发生器必须根据正弦调制波幅值的大小来调整PWM脉冲的宽度。在本设计中,由于三角载波峰值固定,正弦调制波幅值仅由调制深度决定。FPGA芯片通过总线接口从微处理器接收到调制深度信号,再利用乘法器对从正弦函数表中取出的正弦幅值进行调制深度加权调整。设调制深度为,当前时刻正弦幅值为Sin_Data,利用下式得出正弦调制波幅值Data为:; r* }, Z1 c, z0 |
    Data=( *Sin_Data)/255 取值范围[0~1]0 A- b# a# E- k  `. R* D7 T
    本设计采用双极性调制方式,而三角载波的取值范围为0~255,其中位线值为127,故实际产生的正弦调制波幅值按照下列公式进行调整,其中Adjust为调整后的正弦调制波数据。
4 ^$ U8 `9 R' Y0 l    Adjust =127+Data { 2 k < Data<(2k+1) } k=0.1.2......N. `* K  x  t9 l
    Adjust =127-Data {(2k+1) <Data<(2k+2) } k=0.1.2......N0 t3 [6 G8 b2 n8 ]! Q7 G' E$ p
三相正弦信号的产生* f2 x$ i* n$ c; M2 w
    针对静止补偿器主电路,需要产生出三个相位彼此互差120 的SPWM脉冲信号。而通过一个正弦函数表来发出三相正弦信号,不仅需要考虑三个正弦信号的起始相位,而且需要三个可逆计数器分别来控制查找正弦函数表。例如,在本设计中产生三个初相位为零,相位互差120 的三相正弦信号。如图3所示,A相首先从正弦函数表的地址0 开始累加读起,当读到地址90 处,再从地址90 处累减读到地址0 处,这样在A相可逆计数器的控制下,就可以得到周期为的单向半波正弦信号;C相首先从正弦函数表的地址60 开始递减读起,当读到地址0 处,再从地址0 处递增读到地址90 处,然后从地址90 处递减读到地址0 处,这样在C相可逆计数器的控制下,就可以得到周期为、初相位滞后A相60 的单向半波正弦信号;同理,B相从正弦函数表的地址60 开始累加读起,在B相可逆计数器的控制下,就可以得到周期为 、初相位滞后C相60 的单向半波正弦信号。这样,通过一个\frac{ }{2}周期的正弦函数表,就可以发出三个相位互差60 、周期为的单向半波正弦信号。然后,查出的数据经过正弦调制波幅值调节,使输出的三个单向半波正弦幅值满足设计的幅值调节要求后,再与三角载波进行比较,就可以得出三个相位互差120 的SPWM脉冲信号。
2 _" ~6 ~/ \- W% t% w$ g3 M    由于三相正弦信号的产生在整个系统设计中非常关键,下面给出VHDL设计的主要程序。
2 \4 m$ P; ]9 `' `; v  q0 Z0 }' y2 U2 j    process(clk)/ |% y% S+ L$ o1 x, K
    variable m :integer range 511 downto 0
$ k, X7 j) ?; |: ?, y& k    begin
$ v+ |% }: x! [7 c" |8 C    if clk'event and clk='1'then ;产生A相地址- a' ]1 g) r7 t4 i
    if SAdir='1' then ;SAdir为A相可逆计数器的标志位,当为"1"计数器递增
/ G7 w, U# A2 K+ n! L    m:=1+m, s: A& j9 E: ^
    else m:=m-1; 当SAdir="0",计数器递减
6 C5 }4 x* @- W% S1 c" x    end if
  Q8 W9 I# p; z4 T& s. z7 Q    A_Address<=m; A_Address为A相对应查找内部ROM表的地址值% j8 y! r/ T. X5 w" y
    end if5 \% a6 |4 [, k: [9 A
    end process
) f  l# `" E- Z    process(clk)# _( m# {5 F& Z+ Z- G' Y
    variable m, n :integer range 511 downto 0
& w' B8 h  u3 B( B" s$ F    begin
1 i7 W4 L* |7 d# ?: J' v' N' {    if clk'event and clk='1'then; 产生C相地址8 y2 x8 E" @+ f  n
    if SCdir='0' then5 X9 H4 x1 @* c0 G; A3 @: R! E, _
    m:=m+1;0 ^6 n) W! G' V
    else n:=n-1;m:=341+n; C相首先从60 处开始递减产生查表地址* q; Y* \' m+ z- g& P
    end if;( j* [: W( E0 U. C6 E
    C_ Address<=m;9 w% A. I8 d4 b" A0 x, H1 m# p3 ^( o
    end process;$ U8 y) j2 i2 c, Y
    process(clk)5 p$ b- m- @5 N1 W
    variable m, n :integer range 511 downto 0 ;
" t1 D1 S2 v; t' w6 V  h4 k    begin
; \0 \1 w& o5 t0 V+ V    if clk'event and clk='1'then ;产生B相地址
  Z) K9 M, [+ ^/ V+ R+ N    if SBCdir='1' then, Y* `4 h0 Y+ d- O  a
    n:=n+1;m:=341+n;保证B相首先从60 处开始递增产生查表地址% k6 I0 }6 i+ q: v! `6 T' r! t
    else m:=m-1;
% B  [  Z+ [. X/ E: `  a/ W    end if;( t1 b) \& n7 o. }" q: n
    B_ Address <=m;* W3 t' W- [" i/ I3 F! t
    end if;1 Q! Q' g; q7 M
    end process;
7 T# ~/ d0 E7 l- t8 R" }    process(Div_clk,AA,BB,CC,input)
0 {3 a! I: h8 a    begin  F. [- t) G& ?1 g( l
    if Div_clk'event and Div_clk='1' then ;Div_clk为clk的分频时钟
! X. `. s4 K2 u. h( x    if AA='1' then ;AA为A相查表控制位,当为"1" 时,从ROM中取正弦值,. M6 P) G# F/ x0 _5 ~# P
    q<= A_ Address ; q为ROM表对应正弦值的地址入口! N/ `7 }$ e- W7 D/ j8 P
    A_Data <= *ROM_Data; 为输入的调制深度,ROM_Data为ROM正弦表的正弦值* R+ V6 t  e: R" c  g! H
    PA<=A_Data(14 downto 8); 除法运算,舍取最低8位实现7 U% x# X, r2 d" M6 Z/ I
    elsif BB='1' then;AA为A相查表控制位,当为"1" 时,从ROM中取正弦值,
; ?" ^/ ?& x8 |8 t    q<= B_ Address; PB<=B_Data(14 downto 8); B_Data <= *ROM_Data;
, k. j) R8 \+ E" [% `! ^    elsif CC='1' then/ f7 l! n, \  S, {. E3 b' D
    q<= C_ Address ; PC<=C_Data(14 downto 8); C_Data <= *ROM_Data;
  Z4 O1 y6 U5 y    end if; end if;
% D! u( @- k6 i4 Q$ u8 Y* g! z    end process;/ H  A- r7 B/ k( l+ o! M
    process(clk,flagA)
9 T+ h) m& W' X+ l  `  `- V& W# h    begin  @  b5 v; C0 b0 E0 s2 G
    if clk'event and clk='1' then
$ l# H/ W1 H4 M& ]  Q' c    if flagA='1' then ;flagA为 A相同步信号控制位,flagA='1' 表示当前A相正弦--波处于正半周期
+ o: S4 n% g7 k# }    A_Adjust <=PA+"1111111" ; 正半周期正弦调制波幅值调整0 ]9 W7 c$ o* L. ^
    elsif flagA='0' then ;flagA='1' 表示当前A相正弦波处于处于负半周期
2 }, x' _% A; X8 A    A_Adjust <="1111111"- PA; 负半周期调幅
7 T* k- m, L2 Q" k) t' p7 C    end if;
, ?) D; f+ [$ I) z  C" B$ A  d    end if;. M. O( D* x: E; A$ R1 z' o; U( G
    End process;
$ U0 J0 g4 y. W& K系统逻辑与时序功能仿真
6 j3 K+ a9 F/ K7 f( l( V- v    利用MAX+PlusII的波形仿真功能可以得到芯片输入输出仿真图。Atlera公司的这种软件非常方便的提供了验证方式。不但提供逻辑输出的验证,而且提供了时序的验证,包括芯片内部的各点之间的延时,以及竞争冒险现象的出现。
5 l6 X+ ~* Y: m: |) m    输入调制频率为50Hz、调制深度为0.75时的三相六路SPWM波形,三相彼此相位互差120 。其中AH与AL为A相没有加死区的上桥信号与下桥信号,后面以此类推。flagA、flagB和flagC为三相正弦同步信号,以保证三相六路数据严格按相互滞后120 的相位输出。
$ h' g% S( o1 f0 ^; u% ^* M    输入调制频率为50Hz、调制深度为0.25时的三相六路SPWM波形。可以看到,输出的六路PWM信号脉冲宽度有了明显的改变。7 n9 P) |: B/ k! d' d( r% O* [
结束语
  ?; F7 c% T9 \# e# b" u1 s" C     本文提出了一种利用FPGA产生PWM波的方案,并给出了具体的实现方法以及相应的PWM波发生框图。该电路通过系统可编程芯片实现,用硬件描述语言以及图形输入完成了整个功能模块的全部设计工作,使得触发电路更加可*和稳定,为高载波SPWM波形生成提供了一条快速实现的途径。如果改变输入时钟的频率以及相应的载波频率,以此电路为核心,配合相应的外部保护电路与其它逻辑控制电路,完全可以应用于逆变系统中

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-5 16:28 , Processed in 0.044315 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表