m基于矩阵式变换器的PMSM直接转矩控制simulink仿真

发布时间 2023-05-20 12:43:22作者: 我爱C编程

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

 

2.算法涉及理论知识概要

        传统的交-直-交变换器由于存在中间储能 环节,因而动态响应较慢,输入电流中含有大量的 谐波,容易造成对电网的污染,同时也难以实现能 量的双向流动等缺点。交-交矩阵式变换器(Ma trix ConverterMC)体积小、自身结构简单,具有能 量双向流通、输出电流正弦性良好、输入功率因数 可控等特点。永磁同步电机(Permanent Magnet Synchronous MotorPMSM)以其高效率、高转矩惯 量比、高功率密度和低维护费用等特点,使其在现 代交流调速系统中成为了异步电机强有力的竞争 对手 。国内外许多学者提出了很多关于矩阵式变换器供电的IM的直接转矩控制(Direct Torque ControlDTC)的控制策略,但把MC与永磁同 步电动机DTC相结合的应用研究则相对较少。

        矩阵式变换器的换流控制必须严格遵循两个 基本原则:一是三相输入侧任意两相电路没有短 路;二是输出侧任意一相电路没有断路。因为这 两个基本原则的限制,所以在矩阵式变换器一共 允许的27种可能的开关组合中,DTC只可以使用 其中的21(见表1)。其中|u0|和α 0 分别为对 应开关组合的输出电压矢量在定子静止坐标系中 幅值和辐角;1中前18种开关组合(分别命名 为+1,-1+2,-2,…,+9,-9)均为有两输出 相同时连接到同一输入相上,称为运动矢量。表1 中后3种开关组合均实现了输出三相的短路,输 出电压和输入电流均为零,称为零矢量。

 

矩阵式变换器的调制策略可以主要分为以下三种:

 

    (1) 直接变换法:直接变换法是通过对输入电压的连续斩波来合成“输出电压”的,它可以分为坐标变换法、谐波注入法、等效电导法及标量法,所有这些方法虽各有一定的优越性,但也存在一定的问题,限制了它们的应用范围。如标量法的输入相电流波形较好,但输出谐波较大。

 

   (2) 电流跟踪法。这种方法将三相输出电流信号与实测的输出电流信号相比较,根据比较结果和当前的开关电源状态决定开关动作,它具有容易理解、实现简单、响应快、鲁棒性好等特点,但也有滞环电流共有的缺点:开关频率不够稳定、谐波随机分布,且输入电流波形不够理想、存在较大的谐波等。

 

     (3) 空间矢量调制技术,又称为间接变换法、交—直—交等效变换法,是基于空间矢量变换的一种方法,它将交—交变换虚拟为交直和直交变换,这样便可采用流行的高频整流和高频PWM波形合成技术,变换器的性能可以得到较大的改善。当然具体实现时是将整流和逆变一步完成的,低次谐波得到了较好的抑制,但控制方案较为复杂,缺少有效的动态理论分析支持。它是在矩阵式变换器中研究较多也是较为成熟的一种控制策略,比较有发展前途。这种调制策略既能控制输出波形,又能控制输入电流波形,可改变输入功率因数,是最具有前途的一种调制策略。

 

 

 

3.MATLAB核心程序

 

 

 

 

 

x0  = [];
str = [];
ts  = [0 0];
function sys=mdlDerivatives(t,x,u)
sys = [];
function sys=mdlUpdate(t,x,u)
sys = [];
function sys=mdlOutputs(t,x,u)
if u==+1
    S_Aa=1;
    S_Ab=0;
    S_Ac=0;
    S_Ba=0;
    S_Bb=1;
    S_Bc=0;
    S_Ca=0;
    S_Cb=1;
    S_Cc=0;
elseif u==-1
    S_Aa=0;
    S_Ab=1;
    S_Ac=0;
    S_Ba=1;
    S_Bb=0;
    S_Bc=0;
    S_Ca=1;
    S_Cb=0;
    S_Cc=0;
elseif u==+2
    S_Aa=0;
    S_Ab=1;
    S_Ac=0;
    S_Ba=0;
    S_Bb=0;
    S_Bc=1;
    S_Ca=0;
    S_Cb=0;
    S_Cc=1;
elseif u==-2
    S_Aa=0;
    S_Ab=0;
    S_Ac=1;
    S_Ba=0;
    S_Bb=1;
    S_Bc=0;
    S_Ca=0;
    S_Cb=1;
    S_Cc=0;
elseif u==+3
    S_Aa=0;
    S_Ab=0;
    S_Ac=1;
    S_Ba=1;
    S_Bb=0;
    S_Bc=0;
    S_Ca=1;
    S_Cb=0;
    S_Cc=0;
elseif u==-3
    S_Aa=1;
    S_Ab=0;
    S_Ac=0;
    S_Ba=0;
    S_Bb=0;
    S_Bc=1;
    S_Ca=0;
    S_Cb=0;
    S_Cc=1;
elseif u==+4
    S_Aa=0;
    S_Ab=1;
    S_Ac=0;
    S_Ba=1;
    S_Bb=0;
    S_Bc=0;
    S_Ca=0;
    S_Cb=1;
    S_Cc=0;    
elseif u==-4
    S_Aa=1;
    S_Ab=0;
    S_Ac=0;
    S_Ba=0;
    S_Bb=1;
    S_Bc=0;
    S_Ca=1;
    S_Cb=0;
    S_Cc=0;    
elseif u==+5
    S_Aa=0;
    S_Ab=0;
    S_Ac=1;
    S_Ba=0;
    S_Bb=1;
    S_Bc=0;
    S_Ca=0;
    S_Cb=0;
    S_Cc=1; 
elseif u==-5
    S_Aa=0;
    S_Ab=1;
    S_Ac=0;
    S_Ba=0;
    S_Bb=0;
    S_Bc=1;
    S_Ca=0;
    S_Cb=1;
    S_Cc=0;    
elseif u==+6
    S_Aa=1;
    S_Ab=0;
    S_Ac=0;
    S_Ba=0;
    S_Bb=0;
    S_Bc=1;
    S_Ca=1;
    S_Cb=0;
    S_Cc=0;    
elseif u==-6
    S_Aa=0;
    S_Ab=0;
    S_Ac=1;
    S_Ba=1;
    S_Bb=0;
    S_Bc=0;
    S_Ca=0;
    S_Cb=0;
    S_Cc=1;    
elseif u==+7
    S_Aa=0;
    S_Ab=1;
    S_Ac=0;
    S_Ba=0;
    S_Bb=1;
    S_Bc=0;
    S_Ca=1;
    S_Cb=0;
    S_Cc=0;
elseif u==-7
    S_Aa=1;
    S_Ab=0;
    S_Ac=0;
    S_Ba=1;
    S_Bb=0;
    S_Bc=0;
    S_Ca=0;
    S_Cb=1;
    S_Cc=0;    
 elseif u==+8
    S_Aa=0;
    S_Ab=0;
    S_Ac=1;
    S_Ba=0;
    S_Bb=0;
    S_Bc=1;
    S_Ca=0;
    S_Cb=1;
    S_Cc=0;   
elseif u==-8
    S_Aa=0;
    S_Ab=1;
    S_Ac=0;
    S_Ba=0;
    S_Bb=1;
    S_Bc=0;
    S_Ca=0;
    S_Cb=0;
    S_Cc=1;    
elseif u==+9
    S_Aa=1;
    S_Ab=0;
    S_Ac=0;
    S_Ba=1;
    S_Bb=0;
    S_Bc=0;
    S_Ca=0;
    S_Cb=0;
    S_Cc=1;    
elseif u==-9
    S_Aa=0;
    S_Ab=0;
    S_Ac=1;
    S_Ba=0;
    S_Bb=0;
    S_Bc=1;
    S_Ca=1;
    S_Cb=0;
    S_Cc=0;
elseif u==0
    S_Aa=1;
    S_Ab=0;
    S_Ac=0;
    S_Ba=1;
    S_Bb=0;
    S_Bc=0;
    S_Ca=1;
    S_Cb=0;
    S_Cc=0;    
end
sys = [S_Aa;S_Ab;S_Ac;S_Ba;S_Bb;S_Bc;S_Ca;S_Cb;S_Cc];
 
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1;    
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u)
sys = [];