目录
2.Interpreted MATLAB Function模块实现svpwm算法
学习过程中,参考有:
[1]《现代永磁同步电机控制原理及Matlab仿真》 袁雷 胡冰新 魏克银 陈姝 编著
通过昨天的模型搭建,可以看出建立模型很繁琐,要进行很多器件的搭建,而利用MATLAB中S函数来简化模型搭建过程,我们可以将一些计算过程用编程语言的形式表达出来,会发现比进行纯模型搭建要方便得多,今日学习记录的是基于MATLAB Function模块以及Interpreted MATLAB Function模块来实现svpwm算法的仿真。
1.MATLAB Function模块实现svpwm算法
(1)确定函数输入输出量
写入函数的模块,电压转换在α、β轴上的电压、PWM开关周期以及直流侧电压是函数输入,而函数需要输出扇区切换时间点,因为需要用其与三角载波信号进行比较,然后输出pwm信号,进而控制电压输出(其余量,看自己安排,如果想输出,直接在s函数内定义便好)具体如图1-1所示,
图1-1 svpwm函数模块
(2)编程实现算法
如(1)中所叙述,s函数左右两侧相连与昨日所学svpwm搭建模型一致,接下来是对s函数的编写,明确s函数内部需要含有给定电压矢量所落扇区判断模块、电压矢量作用时间计算模块以及扇区切换时间确定模块:
function [Tcm1,Tcm2,Tcm3,N]=svpwm(u_a,u_b,Udc,Ts)
%% 变量初始化
Tcm1=0;Tcm2=0;Tcm3=0;N=0;
%% 判断扇区
%定义三个参考电压取值来向
Uref1=u_b;
Uref2=(sqrt(3)/2)*u_a-(1/2)*u_b;
Uref3=-(sqrt(3)/2)*u_a-(1/2)*u_b;
if Uref1>0
A=1;
else
A=0;
end
if Uref2>0
B=1;
else
B=0;
end
if Uref3>0
C=1;
else
C=0;
end
N=4*C+2*B+A;
%% 计算矢量作用时间
X=sqrt(3)*(Ts/Udc)*u_b;
Y=sqrt(3)*(Ts/Udc)*((sqrt(3)/2)*u_a+(1/2)*u_b);
Z=sqrt(3)*(Ts/Udc)*(-(sqrt(3)/2)*u_a+(1/2)*u_b);
switch (N)
case 1
T1=Z;T2=Y;
case 2
T1=Y;T2=-X;
case 3
T1=-Z;T2=X;
case 4
T1=-X;T2=Z;
case 5
T1=X;T2=-Y;
otherwise
T1=-Y;T2=-Z;
end
%如果T1T2过大,则需要进行调制操作。
if T1+T2>Ts
T1_=T1*Ts/(T1+T2);
T2_=T2*Ts/(T1+T2);
else
T1_=T1;
T2_=T2;
end
%% 扇区切换时间确定
T_a=(Ts-T1_-T2_)/4;
T_b=(Ts+T1_-T2_)/4;
T_c=(Ts+T1_+T2_)/4;
switch(N)
case 1
Tcm1=T_c;Tcm2=T_a;Tcm3=T_b;
case 2
Tcm1=T_b;Tcm2=T_c;Tcm3=T_a;
case 3
Tcm1=T_c;Tcm2=T_b;Tcm3=T_a;
case 4
Tcm1=T_a;Tcm2=T_b;Tcm3=T_c;
case 5
Tcm1=T_b;Tcm2=T_a;Tcm3=T_c;
otherwise
Tcm1=T_a;Tcm2=T_c;Tcm3=T_b;
end
end
(3)仿真结果图
图1-2 输出开关信号
图1-3 控制相电压输出的FFT分析
(4)结论
将图1-2与昨日记录中的开关信号输出图对比,可知其输出信号的控制规律保持一致;将图1-3与昨日记录中的相电压FFT分析对比,可知在利用此种形式完成算法使相电压会有0.5%的偏差,昨日的搭建下是有0.05%的偏差,但都与实际值几乎一致,所以经过此次验证,s-function函数可以使svpwm算法模型搭建计算过程简化,虽然输出相电压与实际理论值比标准搭建下的模型输出偏差较大,但与实际理论值也相差无几,其具有较强便捷性与算法模型的正确可行性。
2.Interpreted MATLAB Function模块实现svpwm算法
利用此函数形式进行编写程序,于我而言,相对于利用(1)中s函数形式进行编写稍微复杂一些,在这个形式下,函数可以直接输出PWM信号,这是最突出的特点。
(1)确定函数输入输出量
写入函数,我们需要明确输入输出是哪些量,输入电压的幅值与相位是需要的,因为定义其所落扇区,相位是必不可少,而计算电压矢量作用时间,幅值是必不可缺的;接下来是输入应该包含三角载波信号,因为会将此信号与我们输出的开关信号状态进行比较,进而输出我们所需要的pwm信号而进行电压控制。输出的便是比较后的PWM信号,具体如图2-1所示,
图2-1 interpreted MATLABFcn函数模块
(2)补充理论知识
(因为此函数的编写需要根据SVPWM算法的合成原理来进行的)
根据平均值等效原理,假设Uout落在扇区1,则其可由相邻两电压矢量与零矢量与其作用时间来表示,如图所示,
由图可得等式:
并且根据昨日记录中逆变桥开关与输出电压组合表,可知
(3)编程实现算法
function [sf]=SVPWM_h(u)
%% 初始化
sa=0;sb=0;sc=0;
Ts=0.0002;
Udc=700;
peak_phase_max=Udc/sqrt(3);
x=u(2);
y=u(3);
mag=(u(1)/peak_phase_max)*Ts;
%% 扇区1
if (x>=0)&&(x<pi/3)
Ta=mag*(sin(pi/3-x));
Tb=mag*sin(x);
T0=(Ts-Ta-Tb);
t1=[T0/4 Ta/2 Tb/2 T0/2 Tb/2 Ta/2 T0/4];
t1=cumsum(t1);
v1=[0 0 0 1 0 0 0];
v2=[0 0 1 1 1 0 0];
v3=[0 1 1 1 1 1 0];
for j=1:7
if (y<t1(j))
break
end
end
sa=v1(j);
sb=v2(j);
sc=v3(j);
end
%% 扇区2
if (x>=pi/3)&&(x<(2*pi)/3)
x1=x-pi/3;
Ta=mag*(sin(pi/3-x1));
Tb=mag*sin(x1);
T0=(Ts-Ta-Tb);
t1=[T0/4 Ta/2 Tb/2 T0/2 Tb/2 Ta/2 T0/4];
t1=cumsum(t1);
v1=[0 0 0 1 0 0 0];
v2=[0 1 1 1 1 1 0];
v3=[0 0 1 1 1 0 0];
for j=1:7
if (y<t1(j))
break
end
end
sa=v1(j);
sb=v2(j);
sc=v3(j);
end
%% 扇区3
if (x>=(2*pi/3))&&(x<pi)
x2=x-2*pi/3;
Ta=mag*(sin(pi/3-x2));
Tb=mag*sin(x2);
T0=(Ts-Ta-Tb);
t1=[T0/4 Ta/2 Tb/2 T0/2 Tb/2 Ta/2 T0/4];
t1=cumsum(t1);
v1=[0 0 1 1 1 0 0];
v2=[0 1 1 1 1 1 0];
v3=[0 0 0 1 0 0 0];
for j=1:7
if (y<t1(j))
break
end
end
sa=v1(j);
sb=v2(j);
sc=v3(j);
end
%% 扇区4
if (x>=-pi)&&(x<(-2*pi/3))
x3=x+pi;
Ta=mag*(sin(pi/3-x3));
Tb=mag*sin(x3);
T0=(Ts-Ta-Tb);
t1=[T0/4 Ta/2 Tb/2 T0/2 Tb/2 Ta/2 T0/4];
t1=cumsum(t1);
v1=[0 1 1 1 1 1 0];
v2=[0 0 1 1 1 0 0];
v3=[0 0 0 1 0 0 0];
for j=1:7
if (y<t1(j))
break
end
end
sa=v1(j);
sb=v2(j);
sc=v3(j);
end
%% 扇区5
if (x>=(-2*pi/3))&&(x<(-pi/3))
x4=x+2*pi/3;
Ta=mag*(sin(pi/3-x4));
Tb=mag*sin(x4);
T0=(Ts-Ta-Tb);
t1=[T0/4 Ta/2 Tb/2 T0/2 Tb/2 Ta/2 T0/4];
t1=cumsum(t1);
v1=[0 1 1 1 1 1 0];
v2=[0 0 0 1 0 0 0];
v3=[0 0 1 1 1 0 0];
for j=1:7
if (y<t1(j))
break
end
end
sa=v1(j);
sb=v2(j);
sc=v3(j);
end
%% 扇区6
if (x>=(-pi/3))&&(x<0)
x5=x+(pi/3);
Ta=mag*(sin(pi/3-x5));
Tb=mag*sin(x5);
T0=(Ts-Ta-Tb);
t1=[T0/4 Ta/2 Tb/2 T0/2 Tb/2 Ta/2 T0/4];
t1=cumsum(t1);
v1=[0 0 1 1 1 0 0];
v2=[0 0 0 1 0 0 0];
v3=[0 1 1 1 1 1 0];
for j=1:7
if (y<t1(j))
break
end
end
sa=v1(j);
sb=v2(j);
sc=v3(j);
end
sf=[sa,sb,sc];
end
(4)仿真结果图
图2-2 输出开关信号
图2-3 控制相电压输出的FFT分析图
(5)结论
将图2-2与图1-2对比,可知其输出信号的控制规律保持一致,并在开关信号交换时具有一定的缓冲时间;将图2-3与图1-2对比,可明显发现两者分析图一致。所以此形式下的svpwm算法实现,与第1种形式表达的效果基本一致,完成了svpwm模型准确性的验证。
总结
通过今天的学习,可知在svpwm算法的实现上,利用MATLAB中s函数的编写,对比于纯用器件进行搭建要简便快捷的多,而且输出的仿真图基本一致,都验证了在自己形式下svpwm算法模型的准确性与可行性。
【以前可恐惧编程了,现在也恐惧,但有了一丝丝兴趣啦,感觉变成好神奇,搭建svpwm模型,加上运行的调试,之前可能会花两天,但今天花了一天看了并尝试写了两个程序(当然参考了很多[1]中的内容),现在的感受就是对编程感到神奇,它可以把繁琐的过程用语言简化出来,就像是有了思想与表达工具的结合。
————对MATLAB函数的初想法
】