采用空间矢量脉宽调制(SVPWM )的开环VVVF 调速系统的综合实训一、实验目的1、理解电压空间矢量脉宽调制(SVPWM )控制的基本原理。
2、熟悉MCKV 电机控制系统的CPU 模块、IPM 模块和机组各部分硬件模块,并确认工作正常。
3、了解SVPWM 变频器运行参数和特性。
二、实验内容:1、熟悉CCS 编程环境,并在CCS 下编译、下载、运行DSP 软件工程。
2、观察并记录定子磁链周期和频率,并分析他们之间的关系。
3、观测并记录启动时电机定子电流和电机速度波形)(t f i v =与)(t f n =;三、实验预习要求1、阅读并掌握三相交流异步电机VVVF 调速系统工作原理。
2、了解电压空间矢量脉宽调制(SVPWM )控制的基本原理。
3、阅读本次实验指导书和实验程序,写好实验预习报告。
4、在MATLAB/Simulinlk 环境中搭好仿真模型,结合本程序LEVEL1功能框图,完成电流速度双闭环系统交流异步电机矢量控制仿真。
四、实验原理当用三相平衡的正弦电压向交流电动机供电时,电动机的定子磁链空间矢量幅值恒定,并以恒速旋转,磁链矢量的运动轨迹形成圆形的空间旋转矢量(磁链圆)。
SVPWM 就是着眼于使形成的磁链轨迹跟踪由理想三相平衡正弦波电压源供电时所形成的基准磁链圆,使逆变电路能向交流电动机提供可变频电源,实现交流电动机的变频调速。
现在以实验系统中用的电压源型逆变器为例说明SVPWM 的工作原理。
三相逆变器由直流电源和6个开关元件( MOSFET) 组成。
图1是电压源型逆变器的示意图。
图1 电压源型逆变器示意图对于每个桥臂而言,它的上下开关元件不能同时打开,否则会因短路而烧毁元器件。
其中A 、B 、C 代表3 个桥臂的开关状态,当上桥臂开关元件为开而下桥臂开关元件为关时定义其状态为1 ,当下桥臂开关元件为开而上桥臂开关元件为关时定义其状态为0。
这样A 、B 、C 有000 、001 、010 、011 、100 、101 、110 、111共 8种状态。
逆变器每种开关状态对应不同的电压矢量,根据相位角不同分别命名为U 0(000)、U 1(100)、U 2(110)、U 3(010)、U 4(011)、U 5(001)、U 6(101)、U 7(111)如图2所示。
图2 基本电压空间矢量其中U 0(000)和U 7(111)称为零矢量,位于坐标的原点,其他的称为非零矢量,它们幅值相等,相邻的矢量之间相隔60°。
如果按照一定顺序选择这六个非零矢量的电压空间矢量进行输出,会形成正六边形的定子磁链,距离要求的圆形磁链还有很大差距,只有选择更多的非零矢量才会使磁链更接近圆形。
SVPWM 的关键在于用8个基本电压空间矢量的不同时间组合来逼近所给定的参考空间电压矢量。
在图3中对于给定的输出电压U ,用它所在扇区的一对相邻基本电压x U 和60 x U 来等效。
此外当逆变器单独输出零矢量时,电动机的定子磁链矢量是不动的。
根据这个特点,可以在载波周期内插入零矢量,调整角频率,从而达到变频目的。
图3 电压空间的线性组合根据正弦定理可以得到:⎪⎪⎩⎪⎪⎨⎧==-+0602001120sin 120sin )60sin(U U T T U U T T x PWMx PWM θθ又有U U T T U T T x PWM x PWM =++6021 得到⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧--==-=+21060201sin 3)60sin(3t t T T T U U T T U U T PWM PWM x PWM x θθ 式中PWM T 为载波周期;UU 的幅值可以由f U 曲线确定;x U 和60+x U 的幅值相同且恒为直流母线电压32V ;θ可以由输出正弦电压角频率w 和PWM nT 的乘积确定。
因此,当已知两相邻的基本电压空间矢量x U 和60+x U 后,就可以根据上式确定1T 、2T 、0T 。
五、实验流程图图1-1-1给出了实验程序功能框图:图1-1-1 实验一功能框图以下给出实验一中的控制参数及其调节范围EnableFlag : 0、1 启动控制位SpeedRef : -0.9~0.9 速度给定值六、实验设备1、DSPCPU组合板:Techv-28335+MCKV-INF2+MCKV-INF32、DSP仿真器及usb线3、MCKV DSP电机控制器4、三相交流异步电机机组5、PC机及电源电缆七、实验步骤在做该实验之前,请确保已经按照系统测试步骤和方法进行各步骤的运行,该实验具体调试操作步骤如下:1.将头文件“build.h”中的编译指令BUILDLEVEL设为“LEVEL1”,然后用“Project--Build”命令重新编译连接程序。
在“build.h”文件中第29行:#define BUILDLEVEL LEVEL1-------修改此处。
2.用“File--Load Program”菜单命令加载“ACI_2833X.out”文件到目标板,此时注意观察加载的文件“ACI_2833X.out”是否您刚才编译链接生成的文件,看一下文件的生成时间就知道了,如果所有源文件都没有修改,此时“ACI_2833X.out”的生成时间不会变化;如果想证实源文件编译是否执行,可以在主程序中随便修改一点注释内容,那么编译的时候就肯定会生成新时间的输出文件。
3.点击“Debug--Real time Mode”选择实时模式,此时出现一个对话框,选择“是(Y)”,再点击“Debug--Run”或者点击左侧运行图标运行程序,此时程序在实时运行模式下运行。
4.在“Watch window”窗口中左键点击“Build1”标签并在空白处点击右键,选择连续刷新模式“Continuous Refresh”,此时应能观察到“BackTicker”变量在不断变化,说明主程序已经运行,5.在控制器面板上进行电机选择,选择三相交流异步电机显示“正确”后,在主菜单下按两次向下键并确认后进入状态页面,打开主电源(按钮:电源)。
因为主电路中有3300uf的大电容,所以需要较长的充电时间,为了避免过大的充电电流,主电路中有NTC负温度系数的热敏电阻,所以一定要等控制器的液晶上显示“电源:开启”,才能进行下一步的操作,并且每次打开主电源距离上次关闭主电源需要有5分钟以上的间隔时间。
6.在“Watch window”窗口中双击变量“EnableFlag”右侧的“Value“值并修改为1后回车,此时应能观察到变量“IsrTicker”也在不断变化,说明主中断服务程序已经正常运行。
而此时电机应该转动,并稳定在740转/分左右的速度上,说明控制系统PWM输出部分和IPM逆变部分硬件以及机组和连线都是正确的,如果电机不转,请检查INF2电路板上的LED2指示灯是否熄灭,如果熄灭说明产生了功率保护中断,可以更换DSPCPU板测试,也可更换机组测试,如果现象依旧则需要返修。
如果电机运转了,但是控制器上没有速度显示,请检查DSPCPU电路板下面那块INF2电路板上的JP1拨码开关是否拨向左边。
7.分别右键点击图形显示窗口“Channel1&2”、“Channel3&4”,选择连续刷新模式“Continuous Refresh”,观察rg1.Out、Ta、Tb以及Tc 的波形,如图1-1-3和图1-1-4所示。
rg1.Out是给定磁链斜坡函数的输出,它是以360度为PU基值的Q15格式数据表示的,将竖线光标移至第一个图形的零点处,注意观察图形窗口“Channel1&2”左下角的第一个坐标值的第一个值是时间,单位为ms,我们可以看到给定的磁链周期为40ms,这样可以计算出给定磁链的频率为25Hz,这和我们设定的SpeedRef=0.5是对应的,设定为1时,对应频率为50Hz,周期应为20ms。
Ta、Tb、Tc表示的是三组PWM控制信号在每个调制周期中的占空比,也是Q15格式的数据。
将光标移至Channel2的第一个马鞍波的波峰中点,读出时间坐标为14.8ms,将光标移至Channel3的第一个马鞍波的波峰中点,读出时间坐标为28.2ms,那么得出结论:Ta相位超前Tb=(28.2-14.8)/40*360=120度。
如图1-1-5和图1-1-6所示。
设定speedref为不同值,完成表1-1-1。
8.改变SpeedRef的值,观察波形的周期值是否和设定值对应。
同时VdTesting、VqTesting的值也跟着变化,此时可以观测图形显示窗口波形幅值的变化。
变量VdTesting、VqTesting相当于IPARK逆变换的输入值,在程序中做了一个函数,随着SpeedRef的值变化而变化,所以不能修改。
根据speedref的值完成表1-1-2。
9.分别右键点击图形显示窗口“Channel1&2”、“Channel3&4”,取消连续刷新模式“Continuous Refresh”,点击“Debug--Halt”,再点击“Debug--Real time Mode”,最后点击“Debug--Reset CPU”,“Debug—Restart ”,退出实时运行模式,并停止程序运行。
10.如果继续实验,请转实验二。
否则请关闭控制器的功率部分主电源(按下电源键),然后关闭CCS软件退出程序,关闭控制电源。
图1-1-3 rg1.out和Ta波形图1-1-4 Tb和Tc波形图1-1-5 rg1.out和Ta波形图1-1-6 Tb和Tc波形实验报告:1、分析实验结果,并根据表1-1-1的测试结果,解释电机速度设定参考值和电机实际运行速度之间的差异是怎么产生的。
2、阅读实验程序,理解IPARK和SVPWM软件模块的工作原理。
绘制出IPARK和SVPWM模块的详细软件流程图。
3、读懂LEVEL1实验程序,并给出LEVEL1程序流程图。
4、总结实验经验,回答本实验中提出的问题,并整理实验报告。
附录:/*============================================================================= ========File name: IPARK.C (IQ version)Originator: Digital Control Systems GroupTexas InstrumentsDsscription: Inverse Park Transformation=====================================================================================History:-------------------------------------------------------------------------------------04-15-2005 Version 3.20-------------------------------------------------------------------------------------*/#include "IQmathLib.h" // Include header for IQmath library// Don't forget to set a proper GLOBAL_Q in "IQmathLib.h" file#include "dmctype.h"#include "ipark.h"void ipark_calc(IPARK *v){_iq Cosine,Sine;// Using look-up IQ sine tableSine = _IQsinPU(v->Angle);Cosine = _IQcosPU(v->Angle);v->Alpha = _IQmpy(v->Ds,Cosine) - _IQmpy(v->Qs,Sine);v->Beta = _IQmpy(v->Qs,Cosine) + _IQmpy(v->Ds,Sine);}/*=====================================================================================File name: SVGEN_DQ.C (IQ version)Originator: Digital Control Systems GroupTexas InstrumentsDescription: Space-vector PWM generation based on d-q components=====================================================================================History:-------------------------------------------------------------------------------------04-15-2005 Version 3.20-------------------------------------------------------------------------------------*/#include "IQmathLib.h" // Include header for IQmath library// Don't forget to set a proper GLOBAL_Q in "IQmathLib.h" file#include "dmctype.h"#include "svgen_dq.h"float f_t1,f_t2;void svgendq_calc(SVGENDQ *v){_iq Va,Vb,Vc,t1,t2;Uint32 Sector = 0; // Sector is treated as Q0 - independently with global Q// Inverse clarke transformationVa = v->Ubeta;Vb = _IQmpy(_IQ(-0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualpha); // 0.8660254 = sqrt(3)/2Vc = _IQmpy(_IQ(-0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualpha); // 0.8660254 = sqrt(3)/2// 60 degree Sector determinationif (Va>_IQ(0))Sector = 1;if (Vb>_IQ(0))Sector = Sector + 2;if (Vc>_IQ(0))Sector = Sector + 4;// X,Y,Z (Va,Vb,Vc) calculationsVa = v->Ubeta; // X = Va Vb = _IQmpy(_IQ(0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualpha); // Y = Vb Vc = _IQmpy(_IQ(0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualpha); // Z = Vcif (Sector==0) // Sector 0: this is special case for (Ualpha,Ubeta) = (0,0) {v->Ta = _IQ(0.5);v->Tb = _IQ(0.5);v->Tc = _IQ(0.5);}if (Sector==1) // Sector 1: t1=Z and t2=Y (abc ---> Tb,Ta,Tc){t1 = Vc;t2 = Vb;v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tbon = (1-t1-t2)/2 v->Ta = v->Tb+t1; // taon = tbon+t1v->Tc = v->Ta+t2; // tcon = taon+t2}else if (Sector==2) // Sector 2: t1=Y and t2=-X (abc ---> Ta,Tc,Tb) {t1 = Vb;t2 = -Va;v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // taon = (1-t1-t2)/2 v->Tc = v->Ta+t1; // tcon = taon+t1v->Tb = v->Tc+t2; // tbon = tcon+t2}else if (Sector==3) // Sector 3: t1=-Z and t2=X (abc ---> Ta,Tb,Tc) {t1 = -Vc;t2 = Va;v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // taon = (1-t1-t2)/2 v->Tb = v->Ta+t1; // tbon = taon+t1v->Tc = v->Tb+t2; // tcon = tbon+t2}else if (Sector==4) // Sector 4: t1=-X and t2=Z (abc ---> Tc,Tb,Ta) {t1 = -Va;t2 = Vc;v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tcon = (1-t1-t2)/2 v->Tb = v->Tc+t1; // tbon = tcon+t1v->Ta = v->Tb+t2; // taon = tbon+t2}else if (Sector==5) // Sector 5: t1=X and t2=-Y (abc ---> Tb,Tc,Ta) {t1 = Va;t2 = -Vb;v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tbon = (1-t1-t2)/2 v->Tc = v->Tb+t1; // tcon = tbon+t1v->Ta = v->Tc+t2; // taon = tcon+t2}else if (Sector==6) // Sector 6: t1=-Y and t2=-Z (abc ---> Tc,Ta,Tb) {t1 = -Vb;t2 = -Vc;v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tcon = (1-t1-t2)/2v->Ta = v->Tc+t1; // taon = tcon+t1v->Tb = v->Ta+t2; // tbon = taon+t2}// Convert the unsigned GLOBAL_Q format (ranged (0,1)) -> signed GLOBAL_Q format (ranged (-1,1))// v->Ta = _IQmpy(_IQ(2.0),(v->Ta-_IQ(0.5)));// v->Tb = _IQmpy(_IQ(2.0),(v->Tb-_IQ(0.5)));// v->Tc = _IQmpy(_IQ(2.0),(v->Tc-_IQ(0.5)));}。