【电机滤波例程9】永磁磁链增广扩展卡尔曼滤波(EKF)原理与MATLAB例程。附完整代码的下载链接
原创代码请勿贩卖文章目录总体介绍算法原理实现流程运行结果MATLAB源代码总体介绍采用永磁磁链增广扩展卡尔曼滤波EKF利用dq电压、电流估计永磁磁链并通过对数状态保持参数为正。单个.m文件包含数据生成、模型、滤波、评价和全部局部函数。适合课程实验、算法学习和二次开发测量条件编码器位置和机械转速已知输入为dq轴电压、电流其余电机参数已知。算法原理采用表贴式永磁同步电机的dq电气模型满足LdLqp.L。编码器位置和机械转速视为已知量以dq电压、电流辨识单个未知电气参数对数状态保证物理参数为正。 扩展卡尔曼滤波利用离散模型雅可比近似传播局部状态误差。离散化和EKF递推真值使用四个RK4子步输入在一个采样区间内保持不变滤波器采用二阶显式中点法和对应的解析链式雅可比。实现流程设置参数、固定随机种子生成已知编码器转速、dq电压、真实电气状态和带噪dq电流。初始化带误差的估计状态核对解析雅可比。逐步执行模型预测和当前案例的量测更新。检查有限值与协方差正定性统计指标并输出Figure。运行结果参数辨识结果图对比目标参数真值和估计值显示局部线性化三倍标准差带及参数相对误差。电流滤波结果图分别显示d、q轴电流的真值、带噪观测与估计用于观察参数辨识同时的电流滤波效果。电压激励与编码器转速图展示dq轴电压激励和已知机械转速说明电气参数辨识的数据输入条件。新息与参数不确定度图展示归一化新息平方NIS及参数局部标准差随时间的变化用于检查残差统计量和局部不确定度。命令行输出完整统计量保存在MATLAB工作区的result.statistics原有指标保存在result.metrics可自行查看。MATLAB源代码部分代码展示% PMSM永磁磁链增广EKF辨识独立MATLAB例程% 2026-09-20/Ver1作者matlabfilterV同号可获取代码定制、讲解等clear;clc;close all;rng(0);%% 集中参数SI单位wm为机械角速度theta为电角度p.Rs0.45;p.L3e-3;p.psi0.075;p.pairs4;p.J2e-3;p.B5e-4;p.dt1e-4;p.duration0.65;p.ratedSpeed150;t0:p.dt:p.duration;countnumel(t);%% 理想速度控制台架编码器转速已知辨识电气子模型% 状态为 [id,iq,log(a/a_nominal)]正参数a标称值*exp(x3)。% 每套只辨识一个参数其余电参数视为已知不声称联合辨识。p.nominalp.psi;parameterName永磁磁链;parameterUnitWb;parameterTruep.nominal*(10.18*(1tanh((t-0.25)/0.07))/2);omegaMeasured9015*sin(2*pi*2*t);% 理想编码器机械转速thetaMeasuredcumtrapz(t,p.pairs*omegaMeasured);idReference1.2*sin(2*pi*31*t)0.7*sin(2*pi*67*t);iqReference2.51.5*sin(2*pi*17*t);truthzeros(3,count);truth(:,1)[0;0;log(parameterTrue(1)/p.nominal)];voltagezeros(2,count);currentObszeros(2,count);currentObs(:,1)0.04*randn(2,1);planttruth(:,1);fork2:count womegaMeasured(k-1)*p.pairs;% 电压生成仅使用标称参数解耦叠加多频电流给定提供持续激励。u[p.Rs*plant(1)-w*p.L*plant(2);p.Rs*plant(2)w*(p.L*plant(1)p.psi)]...2.0*([idReference(k-1);iqReference(k-1)]-plant(1:2));umax(-60,min(60,u));voltage(:,k-1)u;forsub1:4hp.dt/4;plant(3)log(parameterTrue(k-1)/p.nominal);aelectricalODE(plant,u,omegaMeasured(k-1),p);belectricalODE(planth*a/2,u,omegaMeasured(k-1),p);celectricalODE(planth*b/2,u,omegaMeasured(k-1),p);delectricalODE(planth*c,u,omegaMeasured(k-1),p);plantplanth*(a2*b2*cd)/6;endplant(3)log(parameterTrue(k)/p.nominal);truth(:,k)plant;currentObs(:,k)plant(1:2)0.04*randn(2,1);endvoltage(:,end)voltage(:,end-1);%% 对数参数增广EKF初始参数为标称值的75%x[0.1;-0.1;log(0.75)];Pdiag([0.3^2,0.3^2,0.3^2]);Qdiag([2e-6,2e-6,2e-7]);R0.04^2*eye(2);H[eye(2),zeros(2,1)];estimatezeros(3,count);estimate(:,1)x;innovationnan(2,count);nisnan(1,count);minEigenvaluezeros(1,count);minEigenvalue(1)min(eig(P));parameterSigmazeros(1,count);parameterSigma(1)p.nominal*exp(x(3))*sqrt(P(3,3));jacobianErrorcheckElectricalJacobian([0.4;2;log(0.85)],[1;30],90,p);assert(jacobianError1e-6,电气模型离散雅可比检查失败);fork2:count[xp,F]electricalStep(x,voltage(:,k-1),omegaMeasured(k-1),p);PpF*P*FQ;vcurrentObs(:,k)-H*xp;SH*Pp*HR;K(Pp*H)/S;xxpK*v;IKHeye(3)-K*H;PIKH*Pp*IKHK*R*K;P(PP)/2;estimate(:,k)x;innovation(:,k)v;nis(k)v*(S\v);minEigenvalue(k)min(eig(P));parameterSigma(k)p.nominal*exp(x(3))*sqrt(P(3,3));end%% 物理参数输出与误差评价%% 可视化辨识结果、误差、电流与激励%% 全时段统计与命令行报告%% 局部函数dq电气模型及所选参数对模型的解析导数%% 命令行统计方差按N归一化有限观测按共同有效时刻比较完整代码下载https://download.csdn.net/download/callmeup/93509583如需帮助或有滤波相关的MATLAB代码定制需求可从个人主页左侧联系我