学习记录5——SVPWM算法——利用MATLAB内s-function函数编程进行实现

目录

1.MATLAB Function模块实现svpwm算法

(1)确定函数输入输出量

(2)编程实现算法

(3)仿真结果图

(4)结论

2.Interpreted MATLAB Function模块实现svpwm算法

(1)确定函数输入输出量

(2)补充理论知识

(3)编程实现算法

(4)仿真结果图

(5)结论

总结

学习过程中,参考有:
[1]《现代永磁同步电机控制原理及Matlab仿真》 袁雷 胡冰新 魏克银 陈姝 编著

通过昨天的模型搭建,可以看出建立模型很繁琐,要进行很多器件的搭建,而利用MATLAB中S函数来简化模型搭建过程,我们可以将一些计算过程用编程语言的形式表达出来,会发现比进行纯模型搭建要方便得多,今日学习记录的是基于MATLAB Function模块以及Interpreted MATLAB Function模块来实现svpwm算法的仿真。

1.MATLAB Function模块实现svpwm算法

(1)确定函数输入输出量

写入函数的模块,电压转换在α、β轴上的电压、PWM开关周期以及直流侧电压是函数输入,而函数需要输出扇区切换时间点,因为需要用其与三角载波信号进行比较,然后输出pwm信号,进而控制电压输出(其余量,看自己安排,如果想输出,直接在s函数内定义便好)具体如图1-1所示,

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L2V55qE,size_13,color_FFFFFF,t_70,g_se,x_16

图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)仿真结果图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L2V55qE,size_20,color_FFFFFF,t_70,g_se,x_16

图1-2 输出开关信号

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L2V55qE,size_20,color_FFFFFF,t_70,g_se,x_16

图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所示,

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L2V55qE,size_20,color_FFFFFF,t_70,g_se,x_16

图2-1 interpreted MATLABFcn函数模块 

(2)补充理论知识

(因为此函数的编写需要根据SVPWM算法的合成原理来进行的)

根据平均值等效原理,假设Uout落在扇区1,则其可由相邻两电压矢量与零矢量与其作用时间来表示,如图所示,

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L2V55qE,size_20,color_FFFFFF,t_70,g_se,x_16

 由图可得等式:

bded338b6a13439fa6b4803cf16e3a61.png

 并且根据昨日记录中逆变桥开关与输出电压组合表,可知

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L2V55qE,size_13,color_FFFFFF,t_70,g_se,x_16

(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)仿真结果图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L2V55qE,size_20,color_FFFFFF,t_70,g_se,x_16

图2-2 输出开关信号

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L2V55qE,size_20,color_FFFFFF,t_70,g_se,x_16

图2-3 控制相电压输出的FFT分析图 

(5)结论

将图2-2与图1-2对比,可知其输出信号的控制规律保持一致,并在开关信号交换时具有一定的缓冲时间;将图2-3与图1-2对比,可明显发现两者分析图一致。所以此形式下的svpwm算法实现,与第1种形式表达的效果基本一致,完成了svpwm模型准确性的验证。

总结

通过今天的学习,可知在svpwm算法的实现上,利用MATLAB中s函数的编写,对比于纯用器件进行搭建要简便快捷的多,而且输出的仿真图基本一致,都验证了在自己形式下svpwm算法模型的准确性与可行性。

【以前可恐惧编程了,现在也恐惧,但有了一丝丝兴趣啦,感觉变成好神奇,搭建svpwm模型,加上运行的调试,之前可能会花两天,但今天花了一天看了并尝试写了两个程序(当然参考了很多[1]中的内容),现在的感受就是对编程感到神奇,它可以把繁琐的过程用语言简化出来,就像是有了思想与表达工具的结合。

————对MATLAB函数的初想法

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值