首页下载资源后端永磁同步电机的EKF观测器滤波控制

ZIP永磁同步电机的EKF观测器滤波控制

qq_5805862356.59KB需要积分:1

资源文件列表:

EKF滤波电机控制.zip 大约有11个文件
  1. EKF滤波电机控制/EKF.m 4KB
  2. EKF滤波电机控制/PMSM_EKF.slx 53.04KB
  3. EKF滤波电机控制/PMSM_EKF.slxc 4.91KB
  4. EKF滤波电机控制/slprj/
  5. EKF滤波电机控制/slprj/sim/
  6. EKF滤波电机控制/slprj/sim/varcache/
  7. EKF滤波电机控制/slprj/sim/varcache/PMSM_EKF/
  8. EKF滤波电机控制/slprj/sim/varcache/PMSM_EKF/checksumOfCache.mat 392B
  9. EKF滤波电机控制/slprj/sim/varcache/PMSM_EKF/tmwinternal/
  10. EKF滤波电机控制/slprj/sim/varcache/PMSM_EKF/tmwinternal/simulink_cache.xml 312B
  11. EKF滤波电机控制/slprj/sim/varcache/PMSM_EKF/varInfo.mat 1.32KB

资源介绍:

针对《现代永磁同步电机控制》一书中,扩展卡尔曼滤波算法仿真模型的搭建
function [sys,x0,str,ts] = EKF(t,x,u,flag) %主函数 %主函数包含四个输出: % sys数组包含某个子函数返回的值,返回值取决于flag的值。例如flag=3,sys则包含了S-function的输出。 % x0为所有状态的初始化向量,除flag=0外,x0被忽略 % str是保留参数,总是一个空矩阵(M文件s-function 必须设置该元素为空矩阵) % Ts返回系统采样时间(一个两列矩阵,包含块的采样时间和偏移量) %函数的四个输入分别为采样时间t、状态x、输入u和仿真流程控制标志变量flag %输入参数后面还可以接续一系列的附带参数simStateCompliance switch flag case 0, [sys,x0,str,ts]=mdlInitializeSizes; case 1, sys=mdlDerivatives(t,x,u); case 2, sys=mdlUpdate(t,x,u); case 3, sys=mdlOutputs(t,x,u); case 4, sys=mdlGetTimeOfNextVarHit(t,x,u); case 9, sys=mdlTerminate(t,x,u); otherwise DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end %主函数结束 %下面是各个子函数,即各个回调过程 function [sys,x0,str,ts]=mdlInitializeSizes %初始化回调子函数 %提供状态、输入、输出、采样时间数目和初始状态的值 %初始化阶段,标志变量flag首先被置为0,S-function首次被调用时该子函数首先被调用, %且为S-function模块提供下面信息 %该子函数必须存在 global P0; sizes = simsizes; %生成sizes数据结构,信息被包含在其中 sizes.NumContStates = 0; %连续状态数,缺省为0 sizes.NumDiscStates = 4; %离散状态数,缺省为0 sizes.NumOutputs = 2; %输出个数,缺省为0 sizes.NumInputs = 4; %输入个数,缺省为0 sizes.DirFeedthrough = 0; %是否存在直馈通道,1存在,0不存在 sizes.NumSampleTimes = 1; %采样时间个数,至少是一个 sys = simsizes(sizes); %返回size数据结构所包含的信息 x0 = [0 0 0 0]; P0 = diag([0.1 0.1 180 0.1]); %设置初始状态 str = []; %保留变量置空 ts = 1e-6; %设置采样时间 function sys=mdlDerivatives(t,x,u) %计算导数回调子函数 %给定t,x,u计算连续状态的导数,可以在此给出系统的连续状态方程 %该子函数可以不存在 sys = []; %sys表示状态导数,即dx function sys=mdlUpdate(t,x,u) %状态更新回调子函数 %给定t、x、u计算离散状态的更新 %每个仿真步内必然调用该子函数,不论是否有意义 %除了在此描述系统的离散状态方程外,还可以在此添加其他每个仿真步内都必须执行的代码 global P0; Rs=2.875; Ls=0.0085; np=4; J=0.001; flux=0.175; B1=0; Q=diag([0.1 0.1 80 0.1]); R=diag([0.2 0.2]); T=1e-6; vs_ab=[u(3),u(4)]'; is_ab=[u(1),u(2)]'; H=[1 0 0 0; 0 1 0 0]; A=1.5*np^2*flux/J; V=A*(x(2)*cos(x(4))-x(1)*sin(x(4)))-B1*np^2*x(3)/J; B=[1/Ls 0 0 0;0 1/Ls 0 0]'; F=[Rs/Ls 0 flux/Ls*sin(x(4)) flux/Ls*x(3)*cos(x(4)); 0 -Rs/Ls -flux/Ls*cos(x(4)) x(3)*flux/Ls*sin(x(4)); 0 0 0 0; 0 0 1 0]; f1=[-Rs/Ls*x(1)+x(3)*flux/Ls*sin(x(4)); -Rs/Ls*x(2)-x(3)*flux/Ls*cos(x(4)); V; x(3)]; f2=diag([1 1 1 1])+F*T; X_pred=x+T*(f1+B*vs_ab); Y_pred=H*X_pred; Y=is_ab; P_pred=f2*P0*f2'+Q; K=P_pred*H'*inv(H*P_pred*H'+R); sys=X_pred+K*(Y-Y_pred); P0 = P_pred-K*H*P_pred; %sys表示下一个离散状态,即x(k+1) function sys=mdlOutputs(t,x,u) %计算输出回调函数 %给定t,x,u计算输出,可以在此描述系统的输出方程 %该子函数必须存在 sys = [x(3),x(4)]; %sys表示输出,即y function sys=mdlGetTimeOfNextVarHit(t,x,u) %计算下一个采样时间 %仅在系统是变采样时间系统时调用 sampleTime = 1; %设置下一次采样时间是在1s以后 sys = t + sampleTime; %sys表示下一个采样时间点 function sys=mdlTerminate(t,x,u) %仿真结束时要调用的回调函数 %在仿真结束时,可以在此完成仿真结束所需的必要工作 sys = [];
100+评论
captcha