作为一名长期从事电机控制算法开发的工程师,我最近在表贴式永磁同步电机(SPMSM)控制领域有了新的突破。传统PI控制在面对参数变化和外部扰动时表现欠佳,而自抗扰控制(ADRC)展现出了惊人的鲁棒性。本文将完整呈现一阶线性/非线性ADRC的Simulink建模过程,包含你从未在教科书上见过的实战细节。
在工业伺服系统中,电机常面临三种典型干扰:
传统PI控制需要为每种工况单独整定参数,而ADRC通过扩张状态观测器(ESO)将所有扰动统一视为"总扰动"进行估计和补偿。这就像经验丰富的老司机,不需要知道具体路况,凭手感就能平稳驾驶。
以一阶系统为例,设被控对象为:
ẋ = f(x,t) + bu
其中f(x,t)包含未知动态和外部扰动。ESO将其扩张为新状态:
z₂ = f(x,t)
于是系统变为:
ẋ = z₂ + bu
ż₂ = h(t)
通过设计观测器:
ė = z₁ - y
ż₁ = z₂ - β₁e + bu
ż₂ = -β₂e
当增益β₁,β₂选择适当时,z₁→x,z₂→f(x,t)。这个看似简单的结构,却蕴含着现代控制理论的精髓——将不确定性转化为可观测状态。
表贴式电机(Ld=Lq)的电压方程:
matlab复制% 参数定义
Rs = 0.5; % 定子电阻(Ω)
Ld = 0.003; % d轴电感(H)
Lq = Ld; % 表贴式电机q轴电感
psi_f = 0.2; % 永磁体磁链(Wb)
P = 4; % 极对数
% 电压方程实现
function dudq = voltage_eq(idq, w_e, udq)
dudq = [udq(1) - Rs*idq(1) + w_e*Lq*idq(2);
udq(2) - Rs*idq(2) - w_e*(Ld*idq(1) + psi_f)];
end
注意:实际Simulink建模时应使用"PMSM"模块而非自行搭建,可避免数值稳定性问题
采用Tustin变换(双线性变换)比前向欧拉更稳定:
matlab复制% 二阶ESO离散化实现
function [z1, z2] = eso_discrete(y, u, z1_prev, z2_prev, h, beta1, beta2, b0)
e = z1_prev - y;
z1 = z1_prev + h*(z2_prev - beta1*e + b0*u);
z2 = z2_prev + h*(-beta2*e);
end
参数整定经验公式:
β₁ = 2ω₀, β₂ = ω₀²
其中ω₀为观测器带宽,一般取控制系统带宽的3~5倍
matlab复制J = 0.01; % 转动惯量(kg·m²)
B = 0.001; % 阻尼系数(N·m·s/rad)

matlab复制kp = 150; % 比例增益
ki = 3000; % 积分增益
beta1 = 100; % ESO增益1
beta2 = 10000; % ESO增益2
b0 = 1.2; % 控制增益估计值
采用非线性函数fal(e,α,δ)代替线性增益:
matlab复制function f = fal(e, alpha, delta)
if abs(e) > delta
f = abs(e)^alpha * sign(e);
else
f = e / (delta^(1-alpha));
end
end
参数选择经验:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电机剧烈震荡 | ESO带宽过高 | 降低β₂,逐步提高 |
| 响应迟缓 | 控制增益过小 | 按20%幅度递增kp |
| 稳态误差 | b0估计不准 | 实测电机增益重新校准 |
| 高频噪声 | 采样时间过长 | 确保Ts<1/(50*ω₀) |
致命错误:曾将β₂设为1e6导致数值溢出,建议先用1e3起步
在相同工况下测试:

matlab复制b0_hat = b0_hat + γ*e1*u; % γ为学习率
这个项目最让我意外的是,非线性ADRC在应对突加负载时,转速恢复时间比PI控制缩短了60%。下次我会分享如何将这套算法移植到DSP28335平台,那又是另一个充满挑战的故事了...