永磁同步电机的EKF观测器滤波控制
立即下载
资源介绍:
针对《现代永磁同步电机控制》一书中,扩展卡尔曼滤波算法仿真模型的搭建
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 = [];