永磁同步电机的仿真模型1、永磁同步电机介绍永磁同步电动机(permanent Magnets synchronous Motor, PMSM),转子采用永磁材料,定子为短距分布式绕组,采用三相正弦波交流电驱动,且定子感应电动势波形呈正弦波"定子绕组通过控制功率管(如IGBT)的不同开关组合,产生旋转磁场跟踪永磁转子的位置,自动地维持与转子的磁场有900的空间夹角,以产生最大的电机转矩"旋转磁场的转速则严格地由永磁转子的转速所决定,PMSM具有直流电动机的特性,有稳定的起动转矩,可以自行起动,并可类似直流电动机对电机进行闭环控制,多用于伺服系统和高性能的调速系统。
永磁同步电动机按转子形状可以分为两类:凸极式永磁同步电机和隐极式永磁同步电机。
它们的区别在于转子磁极所在的位置,凸极式永磁同步电机转子磁极是突起在轴上的,其直轴和交轴电感参数不相等"而隐极式永磁同步电机的转子磁极是内置在轴内的,直轴和交轴电感参数相等"凸极式转子具有明显的磁极,定子和转子之间的气隙是不均匀的,因此其磁路与转子的位置有关。
2、永磁同步电机的控制方法目前对永磁同步电机的控制技术主要有磁场定向矢量控制技术(field orientation control,FOC)与直接转矩控制技术(direct torque control,DTC)。
在这里我们使用磁场定向矢量控制技术来建立永磁同步电机的仿真模型。
磁场定向矢量控制技术的核心是在转子旋转坐标系中针对激磁电流id和转矩电流iq分别进行控制,并且采用的是经典的PI线性调节器,系统呈现出良好的线性特性,可以按照经典的线性控制理论进行控制系统的设计,逆变器控制采用了较成熟的SPWM、SVPWM等技术。
磁场定向矢量控制技术较成熟,动态、稳态性能较佳,所以得到了广泛的实际应用。
该方法摒弃了矢量控制中转子磁场定向的思想,采用定子磁场定向,分别对定子磁链和转矩直接进行控制。
直接转矩控制的实现方法是:计算得到磁链和转矩的实际值与参考值之间的偏差,通过滞环比较以及当前定子磁链的空间位置确定控制信号,在离线计算的开关表中选取合适的空间电压矢量,再通过离散的bang-bang 控制方式调制产生PWM 信号,以控制逆变器产生合适的电压和电流驱动电机转动。
直接转矩控制摒弃了复杂的空间矢量坐标运算,电机的数学模型得到了简化,控制结构也简单,对电机参数变化不敏感,控制系统的动态性能得到了极大提高。
然而有利也有弊,直接转矩控制逆变器的开关频率不固定;转矩、电流脉动大;采样频率也非常高。
下图为磁场定向矢量控制技术的原理图。
FOC控制技术的原理:原理图中涉及到双反馈,第一层反馈为转速反馈:设定电机转速初始值作为给定值,然后与反馈的实际值(位置传感器采集到的位移微分得到)进行比较,得到的差值输入PI控制器进行控制,得到交轴电流iq。
同时三相绕组输出的电流iA,iB,iC经过clarke变换和park变化得到iq和id的实际值,分别与给定值进行比较,将比较后的值再进行park转换,得到的结果经过SVPWM技术调制之后输入到逆变器,继而可以驱动三相电机。
图2.1 磁场定向矢量控制技术原理3、基于FOC技术的永磁同步电机建模在这里采用的是最简单的id=0的控制方法。
Id=0时,从电动机端口看,永磁同步电机相当于一台他励的直流电动机,定子电流中只有交轴分量,而且定子磁动势空间矢量与永磁体磁动势空间矢量正交,电动机转矩中只有永磁转矩分量。
因为电磁转矩仅仅依赖交轴电流,从而实现了转矩表达式中的交直轴电流解耦。
下图为建立的基于FOC控制技术的永磁同步电机SIMULINK仿真模型图2.2 基于FOC技术的永磁同步电机SIMULINK模型控制模型主要包括转速给定部分,比例积分(PI)模块,坐标转换模块,逆变器控制模块,以及电动机模块。
下面进行一一介绍。
3.1 转速给定部分转速给定模块使用SIMULINK中的常数(constant)模块,单位为rpm。
给定的速度要输入到电角速度计算模块(Gain)中,以得到给定转速的电角速度(单位为rad/s)。
设定电动机极对数为4,则其参数为2*pi*4/60。
图2.3 速度给定部分图2.4 电角速度计算模块的参数设定3.2 比例积分(PI)模块调速系统实施转速闭环控制,转速比例积分调节器中的比例模块设置比例参数,积分模块设置积分参数。
调节器内同时设置了内限幅和外限幅模块(saturation)。
设定的PI参数如下图。
图2.5 PI模块的参数设定图2.6 PI模块的内部结构图2.7 Saturation的参数设置3.3坐标转换模块在三相静止坐标系下分析永磁同步电机的数学模型存在着许多难以克服的困难,引入空间矢量坐标变换理论可以简化其数学模型,并能够很容易的分析永磁同步电机的动态特性,空间坐标变换矢量图如图2-4 所示,图中fs为空间矢量,可为电压、电流、磁链等空间物理量,ωe 为转子旋转角速度,θe 为转子轴线与A 相绕组轴线的夹角。
图2.8 空间坐标变换矢量图按照 f 不变的原则,可得到三相静止坐标系abc 变换到两相静止坐标系αβ的clark 变换矩阵为:clark 逆变换矩阵为:同理若以转子磁链轴线方向为坐标系的横轴,称为直轴(d 轴),以垂直转子磁链轴线方向90°为纵轴,称为交轴(q 轴),可建立与转子同步旋转的坐标系dq,简称同步旋转坐标系,将两相静止坐标系αβ变换到同步旋转坐标系dq 的park 变换矩阵为:park 逆变换矩阵为:根据上述坐标转换原理,我们建立dq到abc坐标系和abc到dq坐标系的转换模块。
如下图:图2.9 dq坐标系到三相静止坐标系变换模块图2.10 dq坐标系到三相静止坐标系变换模块内部实现图2.11 三相静止坐标系到dq坐标系变换模块图2.12 三相静止坐标系到dq坐标系变换模块的内部实现3.4 逆变器控制模块采用电流滞环脉冲宽度调制方法,该模块输入为三相相电流给定值和三相相电流实际值,输出为三相相电压。
其内部连接图如图所示:图2.13 CHBPWM逆变器模块内部连接图三相比较模块相同,其中比较模块通过比较A相给定的电流值和A相实际电流得出逆变器输出的A相相电压值,其内部连接图如图所示:图2.14 比较模块内部连接图其中,传递函数模块(transfer fcn)对相电流进行滤波,可以滤去A相反馈电流中的高次谐波。
继电器(relay)模块实现的是电流滞环控制功能。
其输入为给定电路与实际电流的差值,输出为A相相电压。
其参数对话框如下图所示,主要有4个参数:开通动作值(switch on point)、关断动作值(switch off point)、开通时输出值(output when on)、关断时输出值(output when off)。
实现的功能是:当给定的电流值大于实际电流值的差达到开通动作值时,输出的A相相电压为155V,当给定的电流值小于实际电流值达到关断动作值时,输出A相电压为-155V。
图2.15 继电器参数设置3.5电动机模型在SIMULINK中对永磁同步电机进行仿真建模通常采用以下三种方法:(1)在SIMULINK中内部提供的PMSM模型,它包含在电力系统库的电动机库中。
这种方法简单,方便,适于快熟创建永磁同步电动机调速系统,但由于模型已经封装好,不能随意修改,同时也不方便研究PMWM内部的建模方法。
(2)使用SIMULINK library库里已有的分离模块进行组合搭建电机模型,该方法思路清晰、简单、直观,但需要较多的模块,连线较多且不利于差错,油漆是复杂的数学模型。
因此,本方法适用于简单的、小规模系统的仿真系统建模。
(3)用s-函数模块构造模型。
该方法基于数学表达式,容易修改,方式灵活。
这种模型处理能力强,可以方便地构建复杂的动态系统,非常适合PMSM的访真分析。
我们采用第三种方法进行建模S函数模块位于SIMULINK模块库的用户自定义函数子目录下,s函数可以用MATLAB语言编写,也可以用C,C++等语言编写。
它有特定的结构形式。
这里用MATLAB语言编写,此时S函数与MATLAB 函数不同的只是其特定的结构模式。
具体的s函数见附件。
图2.16 永磁同步电机模型为使用方便,把整个模型建成子系统,同时为方便输入电动机的各项参数,使用风转子系统(mask subsystem)为电动机参数输入提供对话框。
图2.17 S函数构建的PMSM模块内部连接图子系统内部使用s函数模块,设置s函数模块调用s函数名为PMSMdq,s函数的参数设为电动机的参数。
点击edit可以进入s函数编写界面,进行修改。
需要注意的是,s函数的文件必须和PMSM仿真的模型放在同一文件夹下,否则会出现仿真错误的情况。
图2.18 S函数参数对话框仿真时,PMSM的电动机参数设为:定子绕组R1为0.875欧;直轴电感Ld为8.5mH;交轴电感Lq为8.5mH;转子永磁体在定子绕组中产生的磁链为0.175Wb;极对数np为4.负载转矩初始值为1N.m,在0.04s时阶跃为5N.m。
转矩的输入为阶跃函数。
参数设置如下图2.19 PMSM参数设置对话框4、永磁同步电机控制模型仿真将仿真时间设为0.06s,然后进行仿真,得到的仿真结果如下图4.1 输入的阶跃扭矩信号图4.2 输出的转矩信号图4.3 输出的三相相电流图4.4 输出的电角速度信号图4.5 输出的电机转速可以看出在起动过程中,电动机转矩上升到最大值以后保持在限幅值,此过程中电动机的转速迅速上升。
加速结束后,电动机进入稳态运行,电动机的电磁转矩与负载转矩平衡。
在负载突加的时候,电动机转矩迅速上升并与负载相平衡,然后迪纳冬季又重新进入稳态运行。
电气传动系统的响应很快,这是因为控制系统中的电流闭环控制响应比较快,动态性能好。
附件function[ sys, x0, str, ts]=PMSMdq(t,x,u,flag,parameters,x0_in)%PMSM model.%parameters;%ld,lq:inductance in dp reference of frame%r:stater resistance%psi_f:flux in webers by PM on rotor%p:number of pole pairs%j:inertia of motor and load%mu_f:viscous friction%inputs:%ud,uq:voltages in dp reference of frame%tl:torque of load%inner variants:%id,iq currents in dp reference of frame%ud,uq:voltage int dp reference of frame%wr:angular velocity of the rotor%te:electronmagnetic torque%theta: position of rotor%outputs:%wr:angular velocity of the rotor%te:electronmagnetic torque%id,iq currents in dp reference of frame%theta :position of rotor%----------------------------%u(1 2 3)=%ud uq tl%parameters (1 2 3 4 5 6 7)=% ld lq r psi_f p j mu_f%sys(1 2 3 4 5 )=% wr te id iq theta%x(1 2 3 4 )=% id iq wr thetaswitch flagcase 0[sys x0 str ts]=mdlInitializeSizes(x0_in);%iniatialization case 1%calculate the derivativessys=mdlDerivatives(x,u,parameters);case 3%outputsys=mdlOutputs(x,u,parameters);case{2,4,9}%unused flagssys=[];otherwise%Error handlingerror(['Unhandled flag=',num2str(flag)]);end%end of PMSMdq%-----------------------------------%mdlInitializeSizes%----------------------------------function[sys,x0,str,ts]=mdlInitializeSizes(x0_in)%-------------------------------------%u(1 2 3)=% ud uq tl%parameters(1 2 3 4 5 6 7 )=% ld lq r psi_f p j mu_f%x( 1 2 3 4)=% id iq wr thetasizes=simsizes;sizes.NumContStates=4;sizes.NumDiscStates=0;sizes.NumOutputs=5;sizes.NumInputs=3;sizes.DirFeedthrough=0;sizes.NumSampleTimes=1;sys=simsizes(sizes);x0=x0_in;str=[];ts=[0 0];%End of mdlInitializeSizes.%---------------------------%mdlDerivatives%Return the derivatives for the continuous states%-----------------------------function[ sys ]=mdlDerivatives(x,u,parameters)%-----------------------------%u( 1 2 3)=% ud uq tl%parameters(1 2 3 4 5 6 7)=% ld lq r psi_f p j mu_f%sys(1 2 3 4 5)=% wr te id iq theta%x(1 2 3 4)=% id iq wr theta%id'=ud/ld-r*iq/lq+lq*p*wr*iq/ldsys(1)=u(1)/parameters(1)-parameters(3)*x(1)/parameters(1)+parameters (2)*parameters(5)*x(3)*x(2)/parameters(1);%iq'=uq/lq-r*iq/lq-ld*p*wr*id/lq-psi_f*p*wr/lqsys(2)=u(2)/parameters(2)-parameters(3)*x(2)/parameters(2)-parameters (1)*parameters(5)*x(3)*x(1)/parameters(2)-parameters(4)*parameters(5)*x( 3)/parameters(2);%te=1.5*p*[psi_f*iq+(ld-lq)*id*iq]te=1.5*parameters(5)*(parameters(4)*x(2)+(parameters(1)-parameters(2) )*x(1)*x(2));%wr'=(te-mu_f*wr-tl)/jsys(3)=(te-parameters(7)*x(3)-u(3))/parameters(6);%theta'=p*wrsys(4)=parameters(5)*x(3);%End of mdlDerivatives%-------------------------------------------%mdlOutputs%Return the block outputs.%-----------------------------------------function sys=mdlOutputs(x,u,parameters,te)%------------------------------------------%u(1 2 3)=% ud uq tl%parameters(1 2 3 4 5 6 7)=% ld lq r psi_f p j mu_f%sys(1 2 3 4 5)=% wr te id iq theta%x(1 2 3 4 )=% id iq wr theta%output wrsys(1)=x(3);%output te%te=1.5*p*[psi_f*iq+(ld-lq)*id*iq]te=1.5*parameters(5)*(parameters(4)*x(2)+(parameters(1)-parameters(2) )*x(1)*x(2));sys(2)=te;%output idqsys(3)=x(1);%idsys(4)=x(2);%iq%out thetasys(5)=x(4);%End of mdlOutputs。