【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接

本博客介绍基于扩展卡尔曼滤波(EKF)的永磁同步电机(PMSM)转速与转子电角度状态估计方法。依托PMSM数学模型,利用FOC下的电压、电流量测信号,通过EKF实现状态预测与量测更新,并输出估计误差、新息诊断、电流/转速/角度观测曲线。支持参数可调,适用于不同工况下的传感器状态估计仿真。

在这里插入图片描述

复完整代码的下载链接。有中文注释,包运行成功

简洁

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

运行结果

状态估计误差

在这里插入图片描述

电压与新息诊断

在这里插入图片描述

电流观测与估计

在这里插入图片描述

转速与角度观测

在这里插入图片描述

命令行输出:

在这里插入图片描述

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.youkuaiyun.com/download/callmeup/93681020

如需帮助,或有滤波相关的MATLAB代码定制需求,可从个人主页左侧联系我

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB卡尔曼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值