异步电机(IM)的滑模观测器(SMO, Sliding Mode Observer)最经典用途是无速度传感器矢量控制——用定子 αβ 电流误差反推反电动势,再从反电动势里 arctan 出转子磁链角和转速。
一、IM 在 αβ 坐标系下的电流模型(SMO 依托)
转子磁场定向(FOC)下,αβ 定子电流方程为:

其中反电动势(待估核心):
eα=ω^rψrcosθ^r,eβ=ω^rψrsinθ^re_{\alpha} = \hat{\omega}_r \psi_r \cos\hat{\theta}_r,\quad e_{\beta} = \hat{\omega}_r \psi_r \sin\hat{\theta}_reα=ω^rψrcosθ^r,eβ=ω^rψrsinθ^r
SMO 的本质:把反电动势当"扩张状态",用滑模切换项逼电流误差滑到 0,切换项的平均值 ≈ 反电动势。
二、滑模观测器本体方程

- K=diag(k,k)K = \mathrm{diag}(k,k)K=diag(k,k):滑模增益
- 别用纯
sign,用sat或sigmoid+ 低通,否则高频抖振炸 - 切换项输出 → 就是反电动势的估计 e^αβ\hat{e}_{\alpha\beta}e^αβ
三、转速 / 磁链角解调
从反电动势估计值取角:
θ^r=arctan (−e^βe^α),ω^r=dθ^rdt\hat{\theta}_r = \arctan\!\left(\frac{-\hat{e}_{\beta}}{\hat{e}_{\alpha}}\right), \qquad \hat{\omega}_r = \frac{d\hat{\theta}_r}{dt}θ^r=arctan(e^α−e^β),ω^r=dtdθ^r
工程上更稳的是 PLL 锁相 代替直接微分:
ω^r=Kp(e⊥)+Ki∫e⊥,e⊥=e^αcosθ^r+e^βsinθ^r\hat{\omega}_r = K_p(e_\perp) + K_i\int e_\perp,\quad e_\perp = \hat{e}_{\alpha}\cos\hat{\theta}_r + \hat{e}_{\beta}\sin\hat{\theta}_rω^r=Kp(e⊥)+Ki∫e⊥,e⊥=e^αcosθ^r+e^βsinθ^r
(PLL 误差项本质就是 ê × ê̂,锁住后 ê⊥ê̂ 即磁链方向)
四、MATLAB 函数版 SMO(可嵌 Simulink MATLAB Function)
%% im_smo.m — 异步电机滑模观测器(αβ 电流型)
function [i_hat, e_hat, wr_hat, theta_hat] = im_smo(...
i_ab, u_ab, Ts, Rs, Ls, Lr, Lm, wr_prev, theta_prev, p)
% i_ab: 2×1 实测 [iα; iβ]
% u_ab: 2×1 电压 [uα; uβ]
% p: 极对数
% 返回: i_hat 估电流, e_hat 反电动势, wr_hat 转速, theta_hat 磁链角
persistent i_hat_p e_hat_p theta_p
if isempty(i_hat_p)
i_hat_p = i_ab;
e_hat_p = [0;0];
theta_p = 0;
end
% ---- 参数 ----
sigma = 1 - Lm^2/(Ls*Lr); % 漏感系数
Rr = 3.2; % 转子电阻(示例)
Aii = -(Rs/(sigma*Ls) + Rr*(1-sigma)/(sigma*Lr));
Bui = 1/(sigma*Ls);
Ksm = diag([180, 180]); % 滑模增益 ★调参关键★
% ---- 滑模切换(sat 代替 sign 抑振)----
err = i_ab - i_hat_p;
sat_err = min(max(err, -0.5), 0.5) ./ 0.5; % ±0.5 A 限幅
% ---- SMO 离散迭代 ----
i_dot = Aii*i_hat_p + Bui*u_ab + Ksm*sat_err;
i_hat = i_hat_p + Ts*i_dot;
% 切换项 ≡ 反电动势估计(含 Lm/Lr 系数)
scale = Lm/(Lr*sigma*Ls);
e_raw = -scale * [0 -1; 1 0] * sat_err;
% 低通滤抖振(截止 ~2π×300 rad/s)
fc = 300;
alpha_lp = exp(-2*pi*fc*Ts);
e_hat = alpha_lp*e_hat_p + (1-alpha_lp)*e_raw;
% ---- PLL 解调转速/磁链角 ----
% 反电动势 → 磁链方向: ê ⟂ ψr, 所以 θ = atan2(-êβ, êα)
theta = atan2(-e_hat(2), e_hat(1));
% 角度展开(防跳变)
dtheta = theta - theta_p;
dtheta = dtheta - 2*pi*round(dtheta/(2*pi));
theta_hat = theta_p + dtheta;
% PLL 式转速估计(比直接 dθ/dt 稳)
Kp_pll = 80; Ki_pll = 1500;
persistent int_err
if isempty(int_err), int_err = 0; end
% 误差: ê · sin(θ̂-θ) ≈ ê × ê̂ 的 z 分量
e_pl err = -e_hat(1)*sin(theta_hat) + e_hat(2)*cos(theta_hat);
int_err = int_err + Ts*e_pl err;
wr_est = Kp_pll*e_pl err + Ki_pll*int_err;
wr_hat = wr_est / p; % 电角速度 → 机械转速
% 持久化
i_hat_p = i_hat;
e_hat_p = e_hat;
theta_p = theta_hat;
end
五、主脚本:IM + SMO 闭环仿真
给一个简化的 IM 电流源激励(不挂 FOC,直接给 uαβ 阶跃,看 SMO 能否跟上电流 + 估出转速):
%% main_im_smo.m
clear; clc; close all;
%% === IM 参数 ===
Rs = 1.2; Rr = 3.2;
Ls = 0.15; Lr = 0.15; Lm = 0.14;
p = 2; J = 0.05; Tr = Lr/Rr;
sigma = 1 - Lm^2/(Ls*Lr);
%% === SMO 参数 ===
Ts = 1e-4; T = 0.5;
t = 0:Ts:T;
N = length(t);
% 激励:10 Hz 旋转电压矢量(模拟 FOC 解耦后的 uαβ)
f_exc = 10;
Uamp = 50;
u_ab = [Uamp*cos(2*pi*f_exc*t); Uamp*sin(2*pi*f_exc*t)];
% 实测电流(这里用 IM 简化模型伪造,真实可换 Simulink 电机)
i_ab = zeros(2,N);
psi_r = [0.8;0]; % 转子磁链初值
wr_true = 2*pi*50/p * ones(N,1); % 真转速 50 Hz 电
for k = 1:N-1
% 简化 IM αβ 模型(省掉完整机电耦合,只看电流环)
A = diag([-Rs/(sigma*Ls)-Rr*(1-sigma)/(sigma*Lr), ...
-Rs/(sigma*Ls)-Rr*(1-sigma)/(sigma*Lr)]);
B = diag([1/(sigma*Ls), 1/(sigma*Ls)]);
Er = wr_true(k)*[ -psi_r(2); psi_r(1) ] * Lm/Lr;
i_dot = A*i_ab(:,k) + B*u_ab(:,k) - (Lm/(Lr*sigma*Ls))*Er;
i_ab(:,k+1) = i_ab(:,k) + Ts*i_dot;
% 转子磁链(一阶惯性,简化)
psi_r = psi_r + Ts*(-(1/Tr)*psi_r + (Lm/Tr)*i_ab(:,k));
end
%% === SMO 估算 ===
i_hat = zeros(2,N); e_hat = zeros(2,N);
wr_hat = zeros(N,1); theta_hat = zeros(N,1);
for k = 1:N
[i_hat(:,k), e_hat(:,k), wr_hat(k), theta_hat(k)] = ...
im_smo(i_ab(:,k), u_ab(:,k), Ts, Rs, Ls, Lr, Lm, ...
wr_hat(max(1,k-1)), theta_hat(max(1,k-1)), p);
end
%% === 绘图 ===
figure('Color','white','Position',[100 100 1200 700])
subplot(3,2,1)
plot(t, i_ab(1,:), 'b', t, i_hat(1,:), 'r--', 'LineWidth',1.2)
legend('iα 实测','iα 估')
ylabel('iα (A)'); grid on
subplot(3,2,2)
plot(t, i_ab(2,:), 'b', t, i_hat(2,:), 'r--', 'LineWidth',1.2)
legend('iβ 实测','iβ 估')
ylabel('iβ (A)'); grid on
subplot(3,2,3)
plot(t, e_hat(1,:), 'b', t, e_hat(2,:), 'r', 'LineWidth',1.2)
ylabel('eα (蓝), eβ (红)'); title('反电动势估计'); grid on
subplot(3,2,4)
plot(t, wr_hat*p/2/pi, 'r', 'LineWidth',1.5) % 转 Hz
ylabel('Estimated Speed (Hz elec)')
title('SMO 转速估计'); grid on
subplot(3,2,5)
plot(t, abs(i_ab(1,:)-i_hat(1,:)), 'b', ...
t, abs(i_ab(2,:)-i_hat(2,:)), 'r', 'LineWidth',1)
ylabel('Current Error (A)')
title('滑模电流跟踪误差'); grid on
subplot(3,2,6)
plot(e_hat(1,:), e_hat(2,:), 'b-', 'LineWidth',1.2)
xlabel('eα'); ylabel('eβ')
title('反电动势相轨(≈圆)'); grid on; axis equal
跑出来能看到:
- 电流跟踪误差在 ±0.1 A 内(滑模抖振水平)
- 反电动势相轨接近圆(磁链旋转)
- PLL 估的转速跟真值对得上(前提是 uαβ 解耦好)
六、Simulink 版本(工程更常用)
如果要在 FOC 完整闭环 里用,SMO 做成 MATLAB Function 或 S-Function,挂在电流环后:
┌──────────┐
uαβ───►│ SMO │──► sat(err) ──► LPF ──► êαβ
iαβ───►│ │
└──────────┘
│ êαβ
▼
┌──────────┐
│ PLL │──► ω̂r, θ̂r
└──────────┘
│ θ̂r
▼
FOC 坐标变换 (Park/InvPark)
Simulink 里 sat 用 Sign + Dead Zone + Gain 或 Saturation 块;LPF 用 Transfer Fcn:ωn/(s+ωn), ωn≈2π×300。
参考代码 异步电机的滑膜观测器算法仿真模型 www.youwenfan.com/contentcsw/82580.html
七、参数调优要点
| 参数 | 影响 | 建议 |
|---|---|---|
Ksm | 太小 → 滑不到切换面;太大 → 抖振爆炸 | 从 100→300 扫,看电流误差 RMS |
sat 限幅 | 直接决定抖振幅值 | 限幅 ≈ 1.2×最大反电动势 |
LPF 截止 fc | 太低 → 相位滞后(高速偏);太高 → 抖振残留 | 0.1~0.3×fsw,fsw=10kHz 时 fc≈300~800 Hz |
PLL Kp/Ki | 决定转速动态 | 按典型 II 型:Ki=Kp²/4,ωn≈50~100 rad/s |
八、和别的观测器对比(选型时心里有数)
| 观测器 | 低速表现 | 计算量 | 对参数敏感 |
|---|---|---|---|
| 龙伯格(全阶) | 一般 | 小 | 中(Rr 最关键) |
| 滑模 SMO | 中(<5Hz 吃力) | 最小 | 中 |
| MRAS | 中 | 小 | 中 |
| EKF | 好 | 大 | 高 |
| 高频注入 + SMO | 极低速/零速 OK | 中 | IPM 更适合 |
SMO 的死穴是零低速——反电动势太小被电阻压降淹没,工程上零速段切 高频注入(HFI),>5~10 Hz 再切 SMO,这是车载/牵引逆变器的标配做法。
的滑模观测器&spm=1001.2101.3001.5002&articleId=162545645&d=1&t=3&u=5e093df93470418cac15071506022dc4)
4111

被折叠的 条评论
为什么被折叠?



