资讯详情

【PMSM例程3】负载前馈与补偿估计,基于EKF,附MATLAB程序的下载链接

📅 2026/10/28 1:48:42 | 华诺云谱 👁 阅读
【PMSM例程3】负载前馈与补偿估计,基于EKF,附MATLAB程序的下载链接
附完整代码的下载链接文章目录总体介绍运行结果前馈试验电流与转矩负载估计误差负载前馈速度补偿负载观测与前馈电流命令行输出MATLAB源代码总体介绍本程序基于永磁同步电机Permanent Magnet Synchronous Motor, PMSM数学模型采用扩展卡尔曼滤波Extended Kalman Filter, EKF实现未知负载转矩观测并结合磁场定向控制FOC设计负载转矩前馈补偿方法。通过模拟不同负载阶跃变化工况对比开启和关闭前馈补偿时的转速响应、负载估计误差及抗扰性能并输出相关曲线和评价指标。电机参数、控制器参数、负载变化及测量噪声等均可自行调整便于开展电机负载观测、前馈补偿与抗扰控制仿真研究。运行结果前馈试验电流与转矩负载估计误差负载前馈速度补偿负载观测与前馈电流命令行输出MATLAB源代码部分代码如下% 负载观测与前馈补偿独立MATLAB例程% 2026-10-12/Ver1作者matlabfilterV同号可获取代码定制、讲解等% 只使用基础MATLAB。参数为普通标量信号为数值数组不使用结构体。% 点击运行即可末尾含全部局部函数。Figure无水印配套PNG由维护工具导出。clear;clc;close all;rng(0);%% 共用教学参数与单位不将本例解释为Word中15 kW电机的实机验证Rs0.45;Ld3e-3;Lq3.6e-3;psi_f0.075;pole_pairs4;J2e-3;B5e-4;Ts1e-4;simulation_time1.2;dc_voltage120;voltage_limitdc_voltage/sqrt(3);current_limit10;Kp_speed0.25;Ki_speed4.0;current_bandwidth1200;Kp_dLd*current_bandwidth;Kp_qLq*current_bandwidth;Ki_dRs*current_bandwidth;Ki_qRs*current_bandwidth;time0:Ts:simulation_time;sample_countnumel(time);Kt1.5*pole_pairs*psi_f;Kr1.5*pole_pairs*(Ld-Lq);% 维护用汇总也是数值向量各指标仍以独立、有意义的变量保留。speed_rmseNaN;angle_rmse_degNaN;load_rmseNaN;parameter_relative_rmse_pctNaN;secondary_parameter_rmse_pctNaN;improvement_pctNaN;current_rmseNaN;peak_speed_errorNaN;gap_speed_rmseNaN;recovery_speed_rmseNaN;final_parameterNaN;final_secondary_parameterNaN;disturbance_speed_peakNaN;control_current_peakNaN;takeover_speed_peakNaN;recovery_timeNaN;covariance_minInf;covariance_chol_failures0;jacobian_error0;state_is_finite1;%% 同一负载事件、同一传感器噪声分别关闭和开启前馈speed_reference80*ones(1,sample_count);load_true0.35*ones(1,sample_count);load_true(time0.45)0.90;load_true(time0.85)0.45;current_noise0.04*randn(2,sample_count);encoder_noise0.04*randn(1,sample_count);state_historyzeros(4,sample_count,2);load_historyzeros(2,sample_count);feedforward_historyzeros(2,sample_count);voltage_historyzeros(2,sample_count,2);current_reference_historyzeros(2,sample_count);observer_covariancediag([0.08^2,0.25^2]);A_load[-B/J,-1/J;0,0];F_loadeye(2)Ts*A_loadTs^2*A_load*A_load/2;Q_loaddiag([1e-4,4e-5]);R_speed0.04^2;H_speed[1,0];jacobian_errorcheck_motor_jacobian(Rs,Ld,Lq,psi_f,pole_pairs,J,B,Ts,false);% 负载模型的离散导数另作中心差分核对。load_check[90;0.45];torque_check0.7;numericalzeros(2);forcolumn1:2h1e-5;offsetzeros(2,1);offset(column)h;numerical(:,column)(load_predict(load_checkoffset,torque_check,Ts,J,B)...-load_predict(load_check-offset,torque_check,Ts,J,B))/(2*h);endjacobian_errormax(jacobian_error,norm(numerical-F_load,fro)/norm(F_load,fro));assert(jacobian_error1e-6,负载观测模型导数核对失败);forrun_index1:2plant[0;(0.35B*80)/Kt;80;0.30];state_history(:,1,run_index)plant;integralszeros(3,1);x_load[80encoder_noise(1);0.20];P_loadobserver_covariance;load_history(run_index,1)x_load(2);feedforward_filtered0;fork2:sample_count% 编码器辅助本例未知负载真值不传入控制器或负载观测器。measured_speedplant(3)encoder_noise(k-1);measured_dqplant(1:2)current_noise(:,k-1);ccos(plant(4));ssin(plant(4));measured_ab[c,-s;s,c]*measured_dq;iq_feedforward(0.35B*80)/Kt;ifrun_index2targetmax(-2,min(2,(x_load(2)-0.35)/Kt));feedforward_filteredfeedforward_filteredTs/(0.008Ts)*(target-feedforward_filtered);iq_feedforwardiq_feedforwardfeedforward_filtered;endfeedforward_history(run_index,k-1)feedforward_filtered;[uab,integrals,current_reference_history(run_index,k-1)]foc_controller(...measured_ab,plant(4),measured_speed,speed_reference(k-1),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_feedforward);voltage_history(:,k-1,run_index)uab;measured_torqueKt*measured_dq(2)Kr*measured_dq(1)*measured_dq(2);xp_loadload_predict(x_load,measured_torque,Ts,J,B);Pp_loadF_load*P_load*F_loadQ_load;plantmotor_truth_step(plant,uab,Ts,Rs,Ld,Lq,psi_f,pole_pairs,J,B,load_true(k-1));residualplant(3)encoder_noise(k)-H_speed*xp_load;SH_speed*Pp_load*H_speedR_speed;KPp_load*H_speed/S;x_loadxp_loadK*residual;IKHeye(2)-K*H_speed;P_loadIKH*Pp_load*IKHK*R_speed*K;P_load(P_loadP_load)/2;[~,chol_flag]chol(P_load);covariance_chol_failurescovariance_chol_failures(chol_flag~0);covariance_minmin(covariance_min,min(eig(P_load)));assert(chol_flag0all(isfinite(x_load)),负载观测数值异常);state_history(:,k,run_index)plant;load_history(run_index,k)x_load(2);endend完整代码https://download.csdn.net/download/callmeup/93685239如需帮助或有滤波相关的MATLAB代码定制需求可从个人主页左侧联系我
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑