2. 符号函数在SMO中的应用

任务目标

在FOC无感控制中,SMO利用滑模面s(x)=0迫使观测电流收敛至实际电流,进而从等效控制中提取反电动势信息。本案例实现基于符号函数sign(·)的滑模控制律,观测永磁同步电机在αβ轴系下的反电动势,并通过仿真波形分析符号函数引起的抖振现象。

核心原理与实现

PMSM在αβ坐标系下的电流方程为:

diα/dt = (−Rsiα + uα − eα)/Ls,diβ/dt = (−Rsiβ + uβ − eβ)/Ls

其中反电动势 eα = −ψfωesinθe,eβ = ψfωecosθe。SMO构造观测电流 îαβ,以电流误差为滑模面,控制律取 v = k·sign(î−i),当滑模面到达后,等效控制 veq 即包含反电动势信息,经低通滤波后得到 êαβ。

关键完整代码


import numpy as np
import matplotlib.pyplot as plt

# 电机参数
Rs, Ls, flux = 0.958, 0.00525, 0.1827
pole_pairs = 4

# 仿真参数
dt = 1e-5
t_end = 0.2
t = np.arange(0, t_end, dt)
n = len(t)

# 给定电角速度与转子位置(开环给定)
omega_e = 2 * np.pi * 50          # 电角速度 50Hz
theta_e = omega_e * t

# 实际电流(由理想反电动势反推,假设电流环理想跟踪)
i_alpha = 2.0 * np.sin(2 * np.pi * 10 * t)
i_beta  = 2.0 * np.cos(2 * np.pi * 10 * t)

# 实际反电动势
e_alpha_true = -flux * omega_e * np.sin(theta_e)
e_beta_true  =  flux * omega_e * np.cos(theta_e)

# SMO参数
k_smo = 50.0          # 滑模增益
fc_lpf = 800.0        # LPF截止频率
alpha_lpf = 2 * np.pi * fc_lpf * dt / (2 * np.pi * fc_lpf * dt + 1)

# 状态初始化
i_hat_alpha, i_hat_beta = 0.0, 0.0
e_hat_alpha_f, e_hat_beta_f = 0.0, 0.0
e_hat_alpha, e_hat_beta = np.zeros(n), np.zeros(n)
i_err_alpha, i_err_beta = np.zeros(n), np.zeros(n)

# 仿真主循环
for idx in range(n):
    # 电流误差
    err_alpha = i_hat_alpha - i_alpha[idx]
    err_beta  = i_hat_beta  - i_beta[idx]
    i_err_alpha[idx] = err_alpha
    i_err_beta[idx]  = err_beta

    # 符号函数滑模控制律
    v_alpha = k_smo * np.sign(err_alpha)
    v_beta  = k_smo * np.sign(err_beta)

    # 观测电流更新(欧拉法)
    di_hat_alpha = (-Rs * i_hat_alpha + v_alpha) / Ls
    di_hat_beta  = (-Rs * i_hat_beta  + v_beta)  / Ls
    i_hat_alpha += di_hat_alpha * dt
    i_hat_beta  += di_hat_beta  * dt

    # 等效控制 = 滑模控制律经低通滤波(一阶惯性环节)
    e_hat_alpha_f += alpha_lpf * (v_alpha - e_hat_alpha_f)
    e_hat_beta_f  += alpha_lpf * (v_beta  - e_hat_beta_f)

    e_hat_alpha[idx] = e_hat_alpha_f
    e_hat_beta[idx]  = e_hat_beta_f

# 角度与速度估计(atan2 + 差分)
theta_hat = np.unwrap(np.arctan2(-e_hat_alpha, e_hat_beta))
omega_hat = np.gradient(theta_hat, dt)

# 绘图
fig, axs = plt.subplots(3, 1, figsize=(10, 9))
axs[0].plot(t, e_alpha_true, 'b-', lw=1.5, label='真实 e_α')
axs[0].plot(t, e_hat_alpha, 'r-', lw=0.8, label='观测 e_α (含抖振)')
axs[0].set_ylabel('反电动势 (V)')
axs[0].legend(); axs[0].grid(True)

axs[1].plot(t, i_err_alpha, 'g-', lw=0.8)
axs[1].set_ylabel('电流误差 î_α−i_α (A)')
axs[1].grid(True)

axs[2].plot(t, omega_hat, 'm-', lw=1.0, label='观测电角速度')
axs[2].axhline(omega_e, color='k', ls='--', lw=1.0, label='给定电角速度')
axs[2].set_xlabel('时间 (s)')
axs[2].set_ylabel('电角速度 (rad/s)')
axs[2].legend(); axs[2].grid(True)

plt.tight_layout()
plt.savefig('smo_sign_observation.png', dpi=100)
plt.show()

运行与验证

运行方式:直接执行脚本(需安装 numpy 和 matplotlib)。

通过条件:

  1. 观测反电动势波形(红色)与真实值(蓝色)整体包络一致,但红色波形叠加明显的高频锯齿状纹波——该纹波即符号函数导致的抖振现象;
  2. 电流误差波形在滑模到达后呈现高频小幅振荡(而非平滑归零),振荡幅值与 k_smo 正相关;
  3. 观测电角速度在真实值附近波动,波动幅度随抖振强度增大而增大。

抖振分析:将 k_smo 从50增大至200后重新运行,可观察到反电动势纹波幅值明显增大、速度估计波动加剧;将符号函数替换为饱和函数 sat(x/Δ)(Δ=0.5)后运行,抖振显著抑制,但会引入相位延迟。该对比验证了符号函数开关特性直接导致抖振的机理。