0
点赞
收藏
分享

微信扫一扫

电机控制中空间矢量脉宽调制SVPWM与simulink仿真详解

zmhc 2022-03-30 阅读 96

介绍电机控制中SVPWM的作用、原理以及在Simulink中搭建仿真。通过模型代码分别实现,最后用C语言写一段单片机中可中使用的SVPWM算法,供大家参考。

创作不易,点赞收藏暴富。

1.SVPWM原理

空间矢量脉宽调制(SVPWM:Space Vector Pulse Width Modulation)算法是从电动机的角度出发,目的在于使交流电动机产生圆形磁场。它以三相对称正弦波电源(其电压和频率值均为电动机的额定值)供电时交流电动机产生的理想磁链圆为基准,通过选择逆变器的不同开关模式,使电动机的实际磁链尽可能逼近理想磁链圆,从而产生 SVPWM 波。由于磁链的轨迹是靠电压空 间矢量相加得到的,故也称之为“电压空间矢量 控制”。 SVPWM 技术实际就是在一个设定的采 样周期内,根据参考电压矢量所在的区间位置,选择与之相邻的两个基本电压空间矢量以及零电 压矢量来合成参考电压空间矢量,如图 1所示。

这里说明一下:SVPWM的标准输入一般为相位相差90°的正弦波Ualfa,Ubeta,输出马鞍波,马鞍波和三角载波产生PWM信号控制逆变器6个开关。(三对互补开关)

三相逆变器:

这6个开关在某一时刻(如S1和S2同一时间必有且只有一个通)一共有2*2*2=8种不同的状态,把以上8种开关状态分别称为状态0,1,2,3,4,5,6,7,用这8个基本电压矢量去逼近圆,会在三相逆变桥输出端得到三相正弦电压波形。

把UVW电压看成矢量如下图

当8个开关状态中UWV都是1或者都是0的时候,那么合成的矢量抵消,即为0。其余6个状态可以组成6个不同方向的矢量(如U=W=1,V=0,矢量指向WU的角平分线)。

选择这些基本电压矢量相邻的两个再进行细分,就可以得到更多的电压矢量,矢量的大小就可以用开关通的时间来控制,这样就可以通过对三相电压导通时间的控制转而得到各个方向的电压矢量,如下图:

 2 控制实现

实现过程分为3个阶段

1 扇区判断

2 计算开关电压矢量作用的时间

3 计算空间矢量比较器的切换点

总的系统仿真如下图

 

2.1 判断当前电压所在的扇区

知道的当前的扇区就可以通过相邻的两个电压矢量进行合成

根据如下三相到两相坐标变换矩阵:

把三相电压变成两相电压即前文所说的输入

再通过其逆变换求得Vref1   Vref12   Vref3

 若Vref1 >0,则 A=1,否则 A=0;

若Vref2 >0,则 B=1,否则 B=0;

若Vref3 >0,则 C=1,否则 C=0;

扇区号 N=4×C+2×B+A

仿真搭建如下:

模块说明:

 

 

2.2 计算开关电压矢量作用的时间

首先定义变量 X,Y,Z

 

 则各个扇区里相邻的两个电压矢量作用的时 间比 t1,t2。如表 1 所示

 当出现 T-t1-t2≥0 时,取 t1=t1,t2=t2

 当出现 T-t1-t2﹤0 时,取 t1=t1×T/(t1+t2),t2=t2 ×T/(t1+t2),T 为脉冲周期

仿真搭建如下:

 

 

模块说明

 2.3 计算空间矢量比较器的切换点

开关状态通常情况下是通过这个周期内的脉冲的占空比调节 的,也就是说通过调节时间管理器的定时器的占空比调节开关器件的闭合断开时间,计算占空比的计算方法如下

 这三个ton根据电压矢量所处的扇区来确定,以第一扇区为例:

再根据下表就能得到空间矢量比较器的切换点

仿真搭建如下:

 2.4 逆变器如下图

 

 

 3 仿真结果

需要根据实际情况设置PWM周期和载波频率。

此处观察马鞍波

 

 

点赞收藏不断更谢谢谢谢谢谢!!!!!!!!!

 4 代码实现

用到MATLAB Function模块  双击编辑代码

作用时间计算:

function [S,t1,t2] = fcn(Us_alfa,Us_beta,Udc,T0)
% This block supports an embeddable subset of the MATLAB language.
% See the help menu for details.
%--------------------为了方便推导作用时间做出的设定值------------------------
X=sqrt(3)*T0*Us_beta/Udc;                           
Y=sqrt(3)/2*T0*Us_beta/Udc+3/2*T0*Us_alfa/Udc;     
Z=sqrt(3)/2*T0*Us_beta/Udc-3/2*T0*Us_alfa/Udc;      
%--------------------------------扇区值判断---------------------------------
%Uref1*sqrt(3)
%(Uref1+Uref2)*sqrt(3)
%(Uref1+Uref3)*sqrt(3)
%--------------------------------------------------------------------------
if(Us_beta>0)                                       %Uref1>0
    A=1;
else
    A=0;
end                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
if((sqrt(3)*Us_alfa-Us_beta)>0)                     %Uref2>0
    B=1;
else
    B=0; 
end
if((-sqrt(3)*Us_alfa-Us_beta)>0)                    %%Uref3>0
    C=1;
else
    C=0;
end
N=A+2*B+4*C;                                        %扇区值N,而不是扇区编号!!!!!!!
%--------------------------------------------------------------------------
%-----------------------------------分割线----------------------------------

%-----------------------------矢量作用时间计算-------------------------------
%--------------------------------S为扇区编号-------------------------------
switch(N)
    case 1
        S=2;%----------------------扇区编号S---------------------------
        t1=Z; 
        t2=Y; 
    case 2
        S=6;
        t1=Y; 
        t2=-X;
    case 3
        S=1;
        t1=-Z; 
        t2=X;
    case 4
        S=4;
        t1=-X; 
        t2=Z;
    case 5
        S=3;
        t1=X; 
        t2=-Y;
    case 6
        S=5;
        t1=-Y; 
        t2=-Z;
    otherwise
        S=1;
        t1=0; 
        t2=0;        
end
%--------------------------------------------------------------------------
%-----------------------------是否需要调制判断------------------------------
if((t1+t2)>T0)
    t11=t1*T0/(t1+t2);
    t21=t2*T0/(t1+t2);
    t1=t11;
    t2=t21;
    t0=0;
else
t0=T0-t1-t2;
end
%--------------------------------------------------------------------------

PWM:

function PWM =fcn(S,t1,t2,time,T0)
% This block supports an embeddable subset of the MATLAB language.
% See the help menu for details. 
%------------------------------普通定义电压---------------------------------
%U0=[0 0 0];U1=[1 0 0];U2=[1 1 0];U3=[0 1 0];
%U4=[0 1 1];U5=[0 0 1];U6=[1 0 1];U7=[1 1 1];
%------------------------由上可得八种电压输出信号控制(每种后面取反)---------
U0=[0 1 0 1 0 1];U1=[1 0 0 1 0 1];U2=[1 0 1 0 0 1];U3=[0 1 1 0 0 1];
U4=[0 1 1 0 1 0];U5=[0 1 0 1 1 0];U6=[1 0 0 1 1 0];U7=[1 0 1 0 1 0];
%----------------------------此处采用二进制定义电压--------------------------
%U0=[0 0 0];U1=[0 0 1];U2=[0 1 0];U3=[0 1 1];
%U4=[1 0 0];U5=[1 0 1];U6=[1 1 0];U7=[1 1 1];
%------------------------由上可得八种电压输出信号控制(每种后面取反)---------
%U0=[0 1 0 1 0 1];U1=[0 1 0 1 1 0];U2=[0 1 1 0 0 1];U3=[0 1 1 0 1 0];
%U4=[1 0 0 1 0 1];U5=[1 0 0 1 1 0];U6=[1 0 1 0 0 1];U7=[1 0 1 0 1 0];
%--------------------------------------------------------------------------
%----------------------为了方便确定扇区切换时间设定的Tx、Ty、Tz---------------
t0=T0-t1-t2;
Ta=t0/4;
Tb=Ta+t1/2;
Tc=Tb+t2/2;
t=rem(time,T0);%t=时间time/周期Ts的余数 即在每个周期内作用的时间轴时间t
G=U0;
%------------------------------扇区编号S------------------------------------
%-------------------------------分割线--------------------------------------
switch (S)
    case 1
        G1=U1;
        G2=U2;
    case 2
        G1=U3;
        G2=U2;
    case 3
        G1=U3;
        G2=U4;
    case 4
        G1=U5;
        G2=U4;
    case 5
        G1=U5;
        G2=U6;
    case 6
        G1=U1;
        G2=U6;
    otherwise
        G1=U0;
        G2=U7;
end
%---------------------------七步分量法--------------------------------------
if (t<Ta)
    G=U0;       
elseif((t>=Ta)&&(t<Tb))
    G=G1;
elseif((t>=Tb)&&(t<Tc))
    G=G2;
elseif((t>=Tc)&&(t<(T0-Tc)))
    G=U7;
elseif((t>=(T0-Tc))&&(t<(T0-Tb)))
    G=G2;
elseif((t>=(T0-Tb))&&(t<(T0-Ta)))
    G=G1;
elseif((t>=(T0-Ta))&&(t<T0))
    G=U0;
end
PWM=G;
end

点赞收藏不断更谢谢谢谢谢谢!!!!!!!!!

5 C语言实现

    int A,B,C;
    int cTime1,cTime2,T0;
    int Cos_Teta ,Sin_Teta ;
    int Ua,Ub,Uc,Ualfa,Ubeta;
    int Va,Vb,Vc;
    int sector ;
    int t1,t2;
    INT taon ,tbon ,tcon 


    Ualfa = ((Ud) * Cos_Teta - (Uq) * Sin_Teta) >> 12;
    Ubeta = ((Ud) * Sin_Teta + (Uq) * Cos_Teta) >> 12;

-------------------------------------------

    Ua = Ualfa;
    Ub = -(Ualfa >> 1) + (((Ubeta) * 0x0ddb)>>12);
    Uc = -(Ualfa >> 1) - (((Ubeta) * 0x0ddb)>>12);


    Va = Ubeta;
    Vb = -(Ubeta >> 1) + (((Ualfa) * 0x0ddb)>>12);
    Vc = -(Ubeta >> 1) - (((Ualfa) * 0x0ddb)>>12);

    if ( Va > 0 )  A = 1;
    else A = 0;

    if ( Vb > 0 )  B = 1;
    else B = 0;

    if ( Vc > 0 )  C = 1;
    else C = 0;

    sector = A + ( B << 1) + ( C << 2 );

   
    switch(sector)
    {
    case 1:
        t1 = -Vb;
        t2 = -Vc;
        break;
    case 2:
        t1 = -Vc;
        t2 = -Va;
        break;
    case 3:
        t1 = Vb;
        t2 = Va;
        break;
    case 4:
        t1 = -Va;
        t2 = -Vb;
        break;
    case 5:
        t1 = Va;
        t2 = Vc;
        break;
    case 6:
        t1 = Vc;
        t2 = Vb;
        break;
    default:
        break;
    }

    if ((t1 + t2) > T0)
    {
        cTime1 = ((T0* (t1)) / ( t1 + t2 ));
        cTime2 = ((T0* (t2)) / ( t1 + t2 ));
        t1 = cTime1;
        t2 = cTime2;
    }

    taon = (T0- t1 - t2 ) >> 1;
    tbon = taon + t1;
    tcon = tbon + t2;
   

    
    switch(sector)
    {
    case 1:
        //pwm1A
        break;
    case 2:
        //pwm1B
        break;
    case 3:
        //pwm2A
        break;
    case 4:
        //pwm2B
        break;
    case 5:
        //pwm3A
        break;
    case 6:
        //pwm3B
        break;
    default: break;
    }
 //_________________________________________________

点赞收藏不断更谢谢谢谢谢谢!!!!!!!!!
        
        
        

 

 

 

 

 

 

 

 

 

举报

相关推荐

0 条评论