700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 永磁同步电机simulink仿真——PMSM直接转矩控制DTC

永磁同步电机simulink仿真——PMSM直接转矩控制DTC

时间:2021-05-12 14:52:04

相关推荐

永磁同步电机simulink仿真——PMSM直接转矩控制DTC

用最快的方法在simulink里搭建一个基础的直接转矩控制模型,不熟悉的话可以参考下,有空更新每个步骤细节和其他实现方法,创作不宜,记得点赞收藏。

说明:1.仿真搭建参考袁雷的仿真书籍(s-function代码实现)和学长提供的模型(纯模块实现)

2. 有的仿真起步时会出现反转的情况,后面给出了说明

1 直接转矩控制框图

话不多说,先看框图

2 直接转矩控制控制simulink仿真模型

直接转矩的原理这里不详细概述了,涉及到的东西太多,只做简单说明,有空专门针对每个模块进行说明,根据框图中的模块,直接转矩控制在Simulink模型和model里需要的模型如下:

下面对每个模块的参数进行说明,也可以根据实际需要自行设置修改

2.1 Powergui和仿真设置

选择模块列表:

找到对应模块:(后面都是通过模型名找到对应的模型图双击或者拖到仿真界面上)

习惯了用定步长,这里设置可选

2.2 功能模块

永磁同步电机模块(Permanent MagnetSynchronous Machine):

逆变器桥(Universal Bridge)和直流电源(DC Voltage Source):

电流电压测量(Three-Phase V-I Measurement):

PID模块(PID Controller):

两个Relay模块(滞环):

bus selector模块(这里需要分离出电机中转速、转矩信号):

连接到电机选择转速,转矩

速度需要转化为转速/分(60/(2pi))

其他模块

sum模块:

mux和demux模块:

2.3 算法模块

坐标变换模块 (3->2)

模块为(fcn)

磁链计算模块:

磁链和转矩计算模块中要注意的是电机初始状态为0,其磁链在alpha上的分量须加上转子磁链,不加会导致扇区判断错误,也就是没加的情况下电机开始出现反转的原因。

扇区判断:(代码实现或者模块实现2选1)

1)(S-Function)代码实现

function[sys,x0,str,ts]=sector(t,x,u,flag)switch flag,%%%%%%%%%%%%%%%%%%% Initialization %%%%%%%%%%%%%%%%%%%case 0,[sys,x0,str,ts]=mdlInitializeSizes;%%%%%%%%%%%%%%%% Derivatives %%%%%%%%%%%%%%%%%%%%%%%%%%%% Outputs %%%%%%%%%%%%case 3,sys=mdlOutputs(t,x,u);%%%%%%%%%%%%%%%%%%%%%%%% GetTimeOfNextVarHit %%%%%%%%%%%%%%%%%%%%%%%%case {2,4,9}sys=[];otherwiseerror(['Unhandled flag =',num2str(flag)]);endfunction [sys,x0,str,ts]=mdlInitializeSizessizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs= 1;sizes.NumInputs= 2;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1; % at least one sample time is neededsys = simsizes(sizes);x0 = [];str = [];ts = [-1 0];u(1) = 0.175;function sys=mdlOutputs(t,x,u)if(u(1)==0)N=1;elsea1=u(1);b1=u(1)*(-0.5)+(sqrt(3)/2)*u(2);c1=u(1)*(-0.5)-(sqrt(3)/2)*u(2);if a1>0a=0;elsea=1;endif b1>0b=0;elseb=1;endif c1>0c=0;elsec=1;endN=4*a+2*b+c;endsys = N;

2)模块实现

这里每个模块具体就不介绍了,点开试一试就知道了。

磁链计算:

根据转矩磁链和扇区计算输出脉冲:(代码和模块2选1)

1)代码实现:

对应参数设置如下

S-function代码如下

function[sys,x0,str,ts]=PMSM_switch(t,x,u,flag)switch flag,case 0,[sys,x0,str,ts]=mdlInitializeSizes;case 3,sys=mdlOutputs(t,x,u);case {2,4,9}sys=[];otherwiseerror(['Unhandled flag =',num2str(flag)]);endfunction [sys,x0,str,ts]=mdlInitializeSizessizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs= 1;sizes.NumInputs= 3;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1; % at least one sample time is neededsys = simsizes(sizes);x0 = [];str = [];ts = [-1 0];function sys=mdlOutputs(t,x,u)V_Table=[2 4 6 1 3 5;4 1 5 2 6 3;3 6 2 5 1 4;5 3 1 6 4 2];%V_Table=[5 6 1 2 3 4;3 4 5 6 1 2;6 1 2 3 4 5;2 3 4 5 6 1];x=2*u(1)+u(2)+1;sys=V_Table(x,u(3));

2 )模块实现

参数如下

3 仿真

模型搭建好后,选择仿真时长0.4s:

在需要观测的地方添加示波器模块(scope),以转速和转矩为例:

PID参数选择为:(可自行调整)

电机运行,观察示波器波形

速度:

转矩:

电流:

效果还不错哈。

祝各位早日完成论文^ ^。

S-function模块说明

如果不会用该模块可以选择用纯模块实现,S-function使用方法以后介绍。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。