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

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

文章目录

简洁

本程序基于永磁同步电机(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代码定制需求,可从个人主页左侧联系我

相关推荐
guo_wen_qiang1 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
Initialize-le1 小时前
Docker 容器网络不通?五步排查法
1024程序员节
天马37981 小时前
微信小程序swiper实现滚动渐变效果案例1
1024程序员节·微信小程序swiper·实现滚动渐变效果案例
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言学生信息管理系统 — 知识点详解(18)
c语言·学习·1024程序员节
ha_lydms1 小时前
AnalyticDB MySQL 技术架构
大数据·hadoop·mysql·adb·spark·dataworks·1024程序员节
zh路西法1 小时前
【四足强化学习经典算法】(一):RMA——盲视运动控制与快速适应模块
pytorch·强化学习·1024程序员节·四足机器人·dagger·pyhon·rma
太理摆烂哥1 小时前
MySQL索引
1024程序员节
爱读书的小胖1 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy1 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化