下载资源后端资源详情
EKF滤波电机控制.zip
大小:56.59KB
价格:22积分
下载量:0
评分:
5.0
上传者:qq_58058623
更新日期:2024-07-26

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

资源文件列表(大概)

文件名
大小
EKF滤波电机控制/EKF.m
4KB
EKF滤波电机控制/PMSM_EKF.slx
53.04KB
EKF滤波电机控制/PMSM_EKF.slxc
4.91KB
EKF滤波电机控制/slprj/
-
EKF滤波电机控制/slprj/sim/
-
EKF滤波电机控制/slprj/sim/varcache/
-
EKF滤波电机控制/slprj/sim/varcache/PMSM_EKF/
-
EKF滤波电机控制/slprj/sim/varcache/PMSM_EKF/checksumOfCache.mat
392B
EKF滤波电机控制/slprj/sim/varcache/PMSM_EKF/tmwinternal/
-
EKF滤波电机控制/slprj/sim/varcache/PMSM_EKF/tmwinternal/simulink_cache.xml
312B
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%输入参数后面还可以接续一系列的附带参数simStateComplianceswitch 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;%连续状态数,缺省为0sizes.NumDiscStates = 4;%离散状态数,缺省为0sizes.NumOutputs = 2;%输出个数,缺省为0sizes.NumInputs = 4;%输入个数,缺省为0sizes.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表示状态导数,即dxfunction 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表示输出,即yfunction sys=mdlGetTimeOfNextVarHit(t,x,u)%计算下一个采样时间%仅在系统是变采样时间系统时调用sampleTime = 1; %设置下一次采样时间是在1s以后sys = t + sampleTime;%sys表示下一个采样时间点function sys=mdlTerminate(t,x,u)%仿真结束时要调用的回调函数%在仿真结束时,可以在此完成仿真结束所需的必要工作sys = [];

用户评论 (0)

发表评论

captcha