
复完整代码的下载链接。有中文注释,包运行成功
文章目录
简洁
本程序基于永磁同步电机(PMSM)数学模型,实现机械转速与转子电角度的扩展卡尔曼滤波(EKF)估计。通过模拟磁场定向控制(FOC)下的电压、电流信号,利用EKF完成电机状态预测与量测更新,并绘制转速、角度、电流及估计误差曲线。电机参数、控制器参数、仿真时间及测量噪声等均可自行调整,便于开展不同工况下的状态观测仿真。
运行结果
状态估计误差

电压与新息诊断

电流观测与估计

转速与角度观测

命令行输出:

MATLAB源代码
部分代码:
matlab
% 转速与角度观测:独立MATLAB例程
% 2026-10-11/Ver1,作者:matlabfilter,V同号,可获取代码定制、讲解等
clear; clc; close all;
rng(0);
%% 共用教学参数与单位:不将本例解释为Word中15 kW电机的实机验证
Rs=0.45; Ld=3e-3; Lq=3.6e-3; psi_f=0.075;
pole_pairs=4; J=2e-3; B=5e-4;
Ts=1e-4; simulation_time=1.2;
dc_voltage=120; voltage_limit=dc_voltage/sqrt(3); current_limit=10;
Kp_speed=0.25; Ki_speed=4.0;
current_bandwidth=1200;
Kp_d=Ld*current_bandwidth; Kp_q=Lq*current_bandwidth;
Ki_d=Rs*current_bandwidth; Ki_q=Rs*current_bandwidth;
time=0:Ts:simulation_time; sample_count=numel(time);
Kt=1.5*pole_pairs*psi_f; Kr=1.5*pole_pairs*(Ld-Lq);
% 维护用汇总也是数值向量;各指标仍以独立、有意义的变量保留。
speed_rmse=NaN; angle_rmse_deg=NaN; load_rmse=NaN;
parameter_relative_rmse_pct=NaN; secondary_parameter_rmse_pct=NaN;
improvement_pct=NaN; current_rmse=NaN; peak_speed_error=NaN;
gap_speed_rmse=NaN; recovery_speed_rmse=NaN;
final_parameter=NaN; final_secondary_parameter=NaN;
disturbance_speed_peak=NaN; control_current_peak=NaN; takeover_speed_peak=NaN;
recovery_time=NaN; covariance_min=Inf; covariance_chol_failures=0;
jacobian_error=0; state_is_finite=1;
%% 编码器FOC台架:仅负责生成实际电压、电流和物理一致的真值
speed_reference=80+20*(1+tanh((time-0.25)/0.035))/2 ...
-10*(1+tanh((time-0.85)/0.035))/2;
load_true=0.35*ones(1,sample_count);
state_true=zeros(4,sample_count); voltage_ab=zeros(2,sample_count);
plant=[0;(0.35+B*80)/Kt;80;0.30]; state_true(:,1)=plant;
controller_integrals=zeros(3,1); iq_reference=zeros(1,sample_count);
voltage_saturated=false(1,sample_count);
iq_bias=(0.35+B*80)/Kt;
for k=2:sample_count
feedback_ab=current_measurement(plant);
[uab,controller_integrals,iq_reference(k-1),voltage_saturated(k-1)]=foc_controller( ...
feedback_ab,plant(4),plant(3),speed_reference(k-1),controller_integrals,Ts, ...
Rs,Ld,Lq,psi_f,pole_pairs,voltage_limit,current_limit, ...
Kp_speed,Ki_speed,Kp_d,Ki_d,Kp_q,Ki_q,iq_bias);
voltage_ab(:,k-1)=uab;
plant=motor_truth_step(plant,uab,Ts,Rs,Ld,Lq,psi_f,pole_pairs,J,B,load_true(k-1));
state_true(:,k)=plant;
end
voltage_ab(:,end)=voltage_ab(:,end-1);
iq_reference(end)=iq_reference(end-1);
current_ab_true=[cos(state_true(4,:)).*state_true(1,:)-sin(state_true(4,:)).*state_true(2,:); ...
sin(state_true(4,:)).*state_true(1,:)+cos(state_true(4,:)).*state_true(2,:)];
noise_std=0.04*ones(2,sample_count);
current_ab_meas=current_ab_true+noise_std.*randn(2,sample_count);
measurement_valid=true(1,sample_count);
current_ab_meas(:,~measurement_valid)=NaN;
%% 状态观测:不使用台架的真实转速、真实角度或未知负载
完整代码:
https://download.csdn.net/download/callmeup/93681020
如需帮助,或有滤波相关的MATLAB代码定制需求,可从个人主页左侧联系我