空间矢量脉宽调制SVPWM的开环讲解.docx
《空间矢量脉宽调制SVPWM的开环讲解.docx》由会员分享,可在线阅读,更多相关《空间矢量脉宽调制SVPWM的开环讲解.docx(11页珍藏版)》请在冰豆网上搜索。
空间矢量脉宽调制SVPWM的开环讲解
采用空间矢量脉宽调制(SVPWM)的开环
VVVF调速系统的综合实训
一、实验目的
1、理解电压空间矢量脉宽调制(SVPWM)控制的基本原理。
2、熟悉MCKV电机控制系统的CPU模块、IPM模块和机组各部分硬件模块,并确认工作正常。
3、了解SVPWM变频器运行参数和特性。
二、实验内容:
1、熟悉CCS编程环境,并在CCS下编译、下载、运行DSP软件工程。
2、观察并记录定子磁链周期和频率,并分析他们之间的关系。
3、观测并记录启动时电机定子电流和电机速度波形
与
;
三、实验预习要求
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种状态。
逆变器每种开关状态对应不同的电压矢量,根据相位角不同分别命名为U0(000)、U1(100)、U2(110)、U3(010)、U4(011)、U5(001)、U6(101)、U7(111)如图2所示。
图2基本电压空间矢量
其中U0(000)和U7(111)称为零矢量,位于坐标的原点,其他的称为非零矢量,它们幅值相等,相邻的矢量之间相隔60°。
如果按照一定顺序选择这六个非零矢量的电压空间矢量进行输出,会形成正六边形的定子磁链,距离要求的圆形磁链还有很大差距,只有选择更多的非零矢量才会使磁链更接近圆形。
SVPWM的关键在于用8个基本电压空间矢量的不同时间组合来逼近所给定的参考空间电压矢量。
在图3中对于给定的输出电压U,用它所在扇区的一对相邻基本电压
和
来等效。
此外当逆变器单独输出零矢量时,电动机的定子磁链矢量是不动的。
根据这个特点,可以在载波周期内插入零矢量,调整角频率,从而达到变频目的。
图3电压空间的线性组合
根据正弦定理可以得到:
又有
得到
式中
为载波周期;
的幅值可以由
曲线确定;
和
的幅值相同且恒为直流母线电压
;
可以由输出正弦电压角频率
和
的乘积确定。
因此,当已知两相邻的基本电压空间矢量
和
后,就可以根据上式确定
、
、
。
5、实验流程图
图1-1-1给出了实验程序功能框图:
图1-1-1实验一功能框图
以下给出实验一中的控制参数及其调节范围
EnableFlag:
0、1启动控制位
SpeedRef:
-0.9~0.9速度给定值
六、实验设备
1、DSPCPU组合板:
Techv-28335+MCKV-INF2+MCKV-INF3
2、DSP仿真器及usb线
3、MCKVDSP电机控制器
4、三相交流异步电机机组
5、PC机及电源电缆
七、实验步骤
在做该实验之前,请确保已经按照系统测试步骤和方法进行各步骤的运行,该实验具体调试操作步骤如下:
1.将头文件“build.h”中的编译指令BUILDLEVEL设为“LEVEL1”,然后用“Project--Build”命令重新编译连接程序。
在“build.h”文件中第29行:
#defineBUILDLEVELLEVEL1-------修改此处。
2.用“File--LoadProgram”菜单命令加载“ACI_2833X.out”文件到目标板,此时注意观察加载的文件“ACI_2833X.out”是否您刚才编译链接生成的文件,看一下文件的生成时间就知道了,如果所有源文件都没有修改,此时“ACI_2833X.out”的生成时间不会变化;如果想证实源文件编译是否执行,可以在主程序中随便修改一点注释内容,那么编译的时候就肯定会生成新时间的输出文件。
3.点击“Debug--RealtimeMode”选择实时模式,此时出现一个对话框,选择“是(Y)”,再点击“Debug--Run”或者点击左侧运行图标运行程序,此时程序在实时运行模式下运行。
4.在“Watchwindow”窗口中左键点击“Build1”标签并在空白处点击右键,选择连续刷新模式“ContinuousRefresh”,此时应能观察到“BackTicker”变量在不断变化,说明主程序已经运行,
5.在控制器面板上进行电机选择,选择三相交流异步电机显示“正确”后,在主菜单下按两次向下键并确认后进入状态页面,打开主电源(按钮:
电源)。
因为主电路中有3300uf的大电容,所以需要较长的充电时间,为了避免过大的充电电流,主电路中有NTC负温度系数的热敏电阻,所以一定要等控制器的液晶上显示“电源:
开启”,才能进行下一步的操作,并且每次打开主电源距离上次关闭主电源需要有5分钟以上的间隔时间。
6.在“Watchwindow”窗口中双击变量“EnableFlag”右侧的“Value“值并修改为1后回车,此时应能观察到变量“IsrTicker”也在不断变化,说明主中断服务程序已经正常运行。
而此时电机应该转动,并稳定在740转/分左右的速度上,说明控制系统PWM输出部分和IPM逆变部分硬件以及机组和连线都是正确的,如果电机不转,请检查INF2电路板上的LED2指示灯是否熄灭,如果熄灭说明产生了功率保护中断,可以更换DSPCPU板测试,也可更换机组测试,如果现象依旧则需要返修。
如果电机运转了,但是控制器上没有速度显示,请检查DSPCPU电路板下面那块INF2电路板上的JP1拨码开关是否拨向左边。
7.分别右键点击图形显示窗口“Channel1&2”、“Channel3&4”,选择连续刷新模式“ContinuousRefresh”,观察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。
表1-1-1:
Speedref
0.1
0.3
0.5
-0.5
Ta峰值时间ms
Tb峰值时间ms
Ta超前Tb相位度
8.改变SpeedRef的值,观察波形的周期值是否和设定值对应。
同时VdTesting、VqTesting的值也跟着变化,此时可以观测图形显示窗口波形幅值的变化。
变量VdTesting、VqTesting相当于IPARK逆变换的输入值,在程序中做了一个函数,随着SpeedRef的值变化而变化,所以不能修改。
根据speedref的值完成表1-1-2。
表1-1-2:
Speedref
0.1
0.3
0.5
-0.5
给定磁链周期
给定磁链频率
电机转速
9.分别右键点击图形显示窗口“Channel1&2”、“Channel3&4”,取消连续刷新模式“ContinuousRefresh”,点击“Debug--Halt”,再点击“Debug--RealtimeMode”,最后点击“Debug--ResetCPU”,“Debug—Restart”,退出实时运行模式,并停止程序运行。
10.如果继续实验,请转实验二。
否则请关闭控制器的功率部分主电源(按下电源键),然后关闭CCS软件退出程序,关闭控制电源。
图1-1-3rg1.out和Ta波形图1-1-4Tb和Tc波形
图1-1-5rg1.out和Ta波形图1-1-6Tb和Tc波形
实验报告:
1、分析实验结果,并根据表1-1-1的测试结果,解释电机速度设定参考值和电机实际运行速度之间的差异是怎么产生的。
2、阅读实验程序,理解IPARK和SVPWM软件模块的工作原理。
绘制出IPARK和SVPWM模块的详细软件流程图。
3、读懂LEVEL1实验程序,并给出LEVEL1程序流程图。
4、总结实验经验,回答本实验中提出的问题,并整理实验报告。
附录:
/*=====================================================================================
Filename:
IPARK.C(IQversion)
Originator:
DigitalControlSystemsGroup
TexasInstruments
Dsscription:
InverseParkTransformation
=====================================================================================
History:
-------------------------------------------------------------------------------------
04-15-2005Version3.20
-------------------------------------------------------------------------------------*/
#include"IQmathLib.h"//IncludeheaderforIQmathlibrary
//Don'tforgettosetaproperGLOBAL_Qin"IQmathLib.h"file
#include"dmctype.h"
#include"ipark.h"
voidipark_calc(IPARK*v)
{
_iqCosine,Sine;
//Usinglook-upIQsinetable
Sine=_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);
}
/*=====================================================================================
Filename:
SVGEN_DQ.C(IQversion)
Originator:
DigitalControlSystemsGroup
TexasInstruments
Description:
Space-vectorPWMgenerationbasedond-qcomponents
=====================================================================================
History:
-------------------------------------------------------------------------------------
04-15-2005Version3.20
-------------------------------------------------------------------------------------*/
#include"IQmathLib.h"//IncludeheaderforIQmathlibrary
//Don'tforgettosetaproperGLOBAL_Qin"IQmathLib.h"file
#include"dmctype.h"
#include"svgen_dq.h"
floatf_t1,f_t2;
voidsvgendq_calc(SVGENDQ*v)
{
_iqVa,Vb,Vc,t1,t2;
Uint32Sector=0;//SectoristreatedasQ0-independentlywithglobalQ
//Inverseclarketransformation
Va=v->Ubeta;
Vb=_IQmpy(_IQ(-0.5),v->Ubeta)+_IQmpy(_IQ(0.8660254),v->Ualpha);//0.8660254=sqrt(3)/2
Vc=_IQmpy(_IQ(-0.5),v->Ubeta)-_IQmpy(_IQ(0.8660254),v->Ualpha);//0.8660254=sqrt(3)/2
//60degreeSectordetermination
if(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)calculations
Va=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=Vc
if(Sector==0)//Sector0:
thisisspecialcasefor(Ualpha,Ubeta)=(0,0)
{
v->Ta=_IQ(0.5);
v->Tb=_IQ(0.5);
v->Tc=_IQ(0.5);
}
if(Sector==1)//Sector1:
t1=Zandt2=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+t1
v->Tc=v->Ta+t2;//tcon=taon+t2
}
elseif(Sector==2)//Sector2:
t1=Yandt2=-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+t1
v->Tb=v->Tc+t2;//tbon=tcon+t2
}
elseif(Sector==3)//Sector3:
t1=-Zandt2=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+t1
v->Tc=v->Tb+t2;//tcon=tbon+t2
}
elseif(Sector==4)//Sector4:
t1=-Xandt2=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+t1
v->Ta=v->Tb+t2;//taon=tbon+t2
}
elseif(Sector==5)//Sector5:
t1=Xandt2=-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+t1
v->Ta=v->Tc+t2;//taon=tcon+t2
}
elseif(Sector==6)//Sector6:
t1=-Yandt2=-Z(abc--->Tc,Ta,Tb)
{
t1=-Vb;
t2=-Vc;
v->Tc=_IQmpy(_IQ(0.5),(_IQ
(1)-t1-t2));//tcon=(1-t1-t2)/2
v->Ta=v->Tc+t1;//taon=tcon+t1
v->Tb=v->Ta+t2;//tbon=taon+t2
}
//ConverttheunsignedGLOBAL_Qformat(ranged(0,1))->signedGLOBAL_Qformat(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)));
}