打印

基于system generator的电机控制SVPWM算法的实现

[复制链接]
3656|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
星星之火红|  楼主 | 2012-10-25 17:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上次讲了使用system generator开发FPGA控制算法的基本原理以及一些心得;接下来把电机控制里面较为核心的SVPWM算法使用system generator做了实现,在此把开发过程、遇到的问题及解决方法分享一下;最后用示波器将管脚上测得的SVPWM脉冲采集了上来。
1.        为什么要使用FPGA实现
在全控型电力电子开关器件出现以后,为了改善交流电动机变压变频调速系统的性能,科技工作者在20世纪80年代开发出了应用脉宽调制(PWM)技术的变压变频器,由于它的优良的技术性能,当今国内外生成的变压变频器几乎都已采用这项技术。目前在逆变器控制领域广泛使用DSP来实现SVPWM的调制算法,具有硬件简单、灵活性好等特点。但是PWM波的产生需要定时的采样与计算,从而使得控制系统的实时性低,CPU的利用率不高。由于DSP采用串行的数据处理机制,在对数据量大、速度要求高,高实时性和高可靠性的底层信号进行处理时并无优势可言,而这恰恰是FPGA的强相。由于FPGA采用数据并发执行的处理方式,使得其在高速大规模的数据处理方面有着无可替代的优势,随着FPGA工艺和设计水平的不断提高,其在数字系统中扮演的角色也从逻辑胶合者提升到处理器的核心。FPGA在工业控制中的应用早在十年前就已经出现,随着FPGA芯片价格的不断降低,其在工业领域的应用正在飞速发展,采用FPGA来实现SVPWM调制算法也将层出不穷

相关帖子

沙发
星星之火红|  楼主 | 2012-10-25 17:38 | 只看该作者
2.        系统任务分析及实现
SVPWM调制算法相对比较复杂,在完成系统控制任务时,要根据需要对任务进行模块划分,从而逐个实现,最终完成一个完整的控制系统。首先分析了系统的主要任务,然后给出各项任务的具体实现策略,具体包括扇区判别、基本矢量作用时间计算、波形产生、死区产生四个模块。其基本原理如图1所示。

使用特权

评论回复
板凳
星星之火红|  楼主 | 2012-10-25 17:39 | 只看该作者
通常在矢量控制的系统中,根据控制策略进行适当的坐标变换,可以给出两相静止坐标系即αβ坐标系电压空间矢量的分量uα、uβ,同时还要给定调制周期Ts以及直流侧电压值Ud,这时就可以进行SVPWM的控制。具体的流程为:
        根据uα、uβ判断参考电压矢量所在的扇区,从而选择合适的矢量
        确定基本电压矢量的作用时间
        理想PWM波的产生
        死区时间的添加
2.1        扇区判别模块的设计
参考矢量uα、uβ为幅值相同,相位差90度的两个正弦波形。在system generator的实现中,直接给定了一个从0到1变换的角度(归一化的弧度),然后调用Xilinx Blocket里面的Cordic算法模块来完成正、余弦的计算。
2.2        扇区判别模块的设计
具体的扇区分配如图2所示。这里通过判断uα、uβ的角度即可得到。

使用特权

评论回复
地板
星星之火红|  楼主 | 2012-10-25 17:39 | 只看该作者
2.3        触发时间计算模块及PWM波产生模块的设计
在参考电压矢量的合成过程中,一个调制周期内除了基本矢量作用时间t1、t2外,其余时间应由零矢量进行补充,不同的零矢量添加方式将产生不同的效果。七段式SVPWM的通常以零矢量u0开始,并以其结束,以u7作为中间矢量,由于每段PWM波形被分为七段,零矢量的动作时间为 T0=T7=(Ts-t1-t2)/2。
使用HDL语言实现时,采用FPGA内部的逻辑资源做三个两输入端的比较器CMP1、CMP1、CMP3,做一个增减计数器counter。 Ta、Tb 和Tc分别作为三个比较器的一个输入,计数器的值作为比较器的另一个输入,从而比较的结果决定了PWM1、PWM3、PWM5的输出值。六个扇区中由于作用的矢量不同所以输出PWM的翻转时刻也不同。而在system generator的实现中,只需要将3个比较值同时与一个连续增、减计数的定时器进行比较即可。(连续增、减计数的定时器的system generator实现框图已经放在我的上一篇博文中。)
2.4        死区产生模块的设计
由于功率器件的关断具有延时,所以同一个桥臂的上下两个开关器件切换时要留有一定的死区时间,即在功率开关器件导通前要保证同一桥臂上的另一个开关管已经截止。开关死区的添加模式有很多种,这里采用单边不对称死区模式。
死区产生模块主要通过一个比较器和一个增减计数器来实现,在参考波形的上升沿使PWM_L的值为0,同时计数器开始往上计算,当计数器的当前值与死区时间Dtime相等时,置PWM_H的值为1,同时保持计数器的当前值;在参考波形的下降沿使PWM_H的值为0,同时计数器开始减计数,当计数器的当前值为零时,置PWM_L的值为1,同时保持计数器的值。这样只要输入一路参考波形,就可以输出同一桥臂上的两路PWM信号,在本论文的设计中参考波形为PWM产生模块输出的三路波形,即PWM1、PWM3和PWM5,而输出波形为功率器件的六路驱动脉冲,即PWM[6:1]。基于System Generator的实现中,没找到沿的模块,只好使用当前状态与前一状态比较来完成判断(不知道下一版本System Generator会不会给出?)
完成2.1-2.4的步骤后,给出整体实现框图,如图3所示。

在Simulink中仿真验证,然后在system generator中生产ISE工程文件;在ISE中打开工程,并综合、映射、布线,生产下载文件,整个界面如图4所示(含资源占用情况)。

使用特权

评论回复
5
星星之火红|  楼主 | 2012-10-25 17:39 | 只看该作者
3.        测试结果及分析
为了更好的观察波形和进行谐波分析,采用RC低通滤波器滤除五次以上谐波, 选定基波为27Hz,则RC滤波器的截止频率应小于27×5=135Hz。这里选择R=300Ω,C=4.7μF,那么截止频率fH=112.9Hz。直接用示波器对FPGA管脚的输出脉冲波形进行观察,观察结果如图5所示。

4.        总结一下开发过程中的几个小问题:
[1].        在乘、除以2的运算中,为了节省资源,使用了shift操作,一开始发现连1<<2(即1*4)这样的简单操作结果都不对;后来才发现是操作数1的位宽只设置了两位有符号数,结果运行结果也是两位,自然无法显示了。所以在使用system generator自动生产代码时,一定要注意位宽,它是没有任何提示的;不放心的地方可以用gateway out接到示波器上看一下波形。
[2].        每一个gateway out在生成的代码中都是一个port,所以不必要的port尽量删除,以节省资源,同时加快生产代码的时间。
[3].        要小心设计时序,并尽量将结构化为并行处理的方式,以满足时序要求,并提高硬件处理速度。
[4].        遇到两个模块位宽不一致报警的情况时,可以加一个convert模块。
[5].        一个关键的问题就是,system generator生产的代码比手动HDL写的,其资源占用规模要大!资源敏感的设计中要注意了。
[6].        system generator中好多常用模块,如if---else,switch---case、上升沿检测等都没有,所以有的开发还不是非常方便。期待改进中!
先写到这儿,祝大家顺利!

使用特权

评论回复
6
wmsk| | 2012-10-25 17:40 | 只看该作者
谢谢分享啊。

使用特权

评论回复
7
星星之火红|  楼主 | 2012-10-26 22:42 | 只看该作者
谢谢分享啊。

使用特权

评论回复
8
星星之火红|  楼主 | 2012-10-26 22:42 | 只看该作者
;P

使用特权

评论回复
9
xuehua230| | 2012-10-26 22:44 | 只看该作者
:L自我夸奖

使用特权

评论回复
10
xjsxjtu| | 2012-10-27 22:37 | 只看该作者
:L

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

1782

帖子

22

粉丝