10无感 FOC / 观测器

反电动势、SMO、PLL 与开闭环切换

本模块主旨
反电动势是无感的"回声"——速度大听得清、速度小被噪声淹没;要懂 SMO 离散化、Rs 温飘、PLL 带宽、切换滞回四件事才能上量产。

学完应能回答

查看完整 Walkthrough(8 步 + 4 误区)

总览
无感 FOC 核心是"角度可信度管理"——什么时候可信、什么时候必须回退到开环。算法只是其中一环。

零基础速入

类比
无感 FOC 像在黑暗中用回声定位——没有编码器(眼睛),靠"听"反电动势的回声来判断转子在哪儿。回声大(高速)听得清;回声小(低速)就被噪声淹没,得先盲推一段时间(开环启动)等回声出现再切闭环。
核心概念
无感不是没有角度,而是用电压、电流、电机模型估算角度。低速反电动势小,估算不可靠;高速精度高。常见方案:开环启动 → 反电动势观测器 → PLL 锁相得角度。

为什么要学

第一手操作
右侧把"转速"从 450 rpm 拉到 2000 rpm,看左侧"PLL 锁相"图:估算角度(蓝)从大幅滞后真实角度(绿)变成几乎重合。下方"BEMF αβ" 波形振幅明显增大——回声变大,定位变准。

学习目标

核心概念

公式

反电动势观测
eα = vα − R·iα − L·diα/dt\neβ = vβ − R·iβ − L·diβ/dt

从 αβ 电压扣除电阻压降和电感压降,剩下的是 BEMF。Rs/Ls 参数错会直接影响精度。

角度提取
θ_est = atan2(eα, −eβ)

BEMF 矢量领先转子磁链 90°;用 atan2 求角后修正 90° 得到电角度。

PLL 锁相
Δθ = sin(θ_meas − θ_est)\nω_est = Kp·Δθ + ∫(Ki·Δθ)dt\nθ_est ← θ_est + ω_est·dt

PI 控制器追相位差。低速时增大 Kp/Ki 加快收敛但增加抖动。

SMO 滑模观测器
di_est/dt = (1/L)·(v − R·i_est − Z·sign(i_est − i_meas))

滑模等效控制项 Z·sign(...) 经低通滤波后近似 BEMF。鲁棒性好,但有抖振。

工程意义

STM32 移植指南

常见误区

  • 低速强行闭环,BEMF 太小 PLL 锁不住,电机抖动甚至反转。
  • 观测器增益过高 → 角度抖到电流环噪声放大。
  • 没加 PLL 健康检查,故障情况继续按估算角度送电流→烧管。
  • 把开环 V/f 启动的电压设得过大或过小,电机失步。

调试方法

建议实验

STM32 C 代码骨架

/* ============================================
 * smo_pll.c — 滑模观测器 + PLL 锁相
 * 简化教学版,工程版需要参数辨识 + 健康检查
 * ============================================ */
typedef struct {
    /* 电机参数 */
    float rs;       // Ω
    float ls;       // H
    float ke;       // V·s/rad

    /* SMO 状态 */
    float i_alpha_est, i_beta_est;
    float z_alpha_filtered, z_beta_filtered;  // 等效 BEMF
    float smo_gain;
    float lpf_alpha;     // 低通系数 = Ts·ωc / (1+Ts·ωc)

    /* PLL 状态 */
    float pll_kp, pll_ki;
    float pll_integral;
    float omega_est;     // rad/s
    float theta_est;     // rad
} sensorless_t;

static inline float sat_unit(float x) { return x > 1.0f ? 1.0f : (x < -1.0f ? -1.0f : x); }

void sensorless_step(sensorless_t *s,
                     float v_alpha, float v_beta,
                     float i_alpha_meas, float i_beta_meas,
                     float dt)
{
    /* 1. 滑模观测器:电流模型 + 等效控制项 */
    float di_alpha = (v_alpha - s->rs * s->i_alpha_est) / s->ls;
    float di_beta  = (v_beta  - s->rs * s->i_beta_est)  / s->ls;

    /* 等效 BEMF 项:error 经过 sat 限幅替代 sign,平滑抖振 */
    float err_a = sat_unit((s->i_alpha_est - i_alpha_meas) * 5.0f);
    float err_b = sat_unit((s->i_beta_est  - i_beta_meas)  * 5.0f);
    float z_alpha = -s->smo_gain * err_a;
    float z_beta  = -s->smo_gain * err_b;

    s->i_alpha_est += (di_alpha + z_alpha / s->ls) * dt;
    s->i_beta_est  += (di_beta  + z_beta  / s->ls) * dt;

    /* 2. 低通滤掉抖振,得到平滑 BEMF */
    s->z_alpha_filtered += s->lpf_alpha * (z_alpha - s->z_alpha_filtered);
    s->z_beta_filtered  += s->lpf_alpha * (z_beta  - s->z_beta_filtered);

    /* 3. PLL 锁相:Δθ = sin(θ_meas - θ_est)
     *    用 BEMF 反算 θ_meas = atan2(z_α, -z_β),但避免 atan2 抖动用 sin 误差形式 */
    float sin_dtheta = -s->z_beta_filtered  * cosf(s->theta_est)
                       -s->z_alpha_filtered * sinf(s->theta_est);
    /* 标定到 [-1, 1]: 除以 BEMF 估算幅值 */
    float bemf_amp = sqrtf(s->z_alpha_filtered * s->z_alpha_filtered
                         + s->z_beta_filtered  * s->z_beta_filtered) + 1e-6f;
    sin_dtheta /= bemf_amp;
    sin_dtheta = sat_unit(sin_dtheta);

    /* PI 锁相 */
    s->pll_integral += s->pll_ki * sin_dtheta * dt;
    s->omega_est = s->pll_kp * sin_dtheta + s->pll_integral;

    /* 角度积分 */
    s->theta_est += s->omega_est * dt;
    if (s->theta_est >  M_PI) s->theta_est -= 2.0f * M_PI;
    if (s->theta_est < -M_PI) s->theta_est += 2.0f * M_PI;
}

/* 健康检查(在主循环慢任务中跑):
 *   - BEMF 幅值 < 阈值 → 切回开环
 *   - 角度误差 |Δθ| > 阈值持续 20ms → 切回开环
 *   - 估算 ω_est 与命令速度偏差过大 → 报警
 */

下一步

随堂题

为什么无感 FOC 必须有"开环启动"阶段?
  1. 硬件要求
  2. 低速时 BEMF 信号被噪声淹没,无法估算角度 (正确)
  3. 让用户耐心等待
  4. 降低成本
提示:BEMF = Ke·ω 正比于转速。低速(< 500rpm)BEMF 几乎为零,全是 Rs/Ls 参数误差和 ADC 噪声,角度估不出来。先用开环 V/f 把电机拖到一定速度再切闭环。
反电动势观测公式 e = v − Ri − L·di/dt 中,最易导致角度偏移的参数误差是?
  1. v
  2. R (正确)
  3. L
  4. 都不影响
提示:R 直接乘电流,误差直接进 BEMF。L 影响 di/dt 项,电流变化率小时影响弱。生产线参数辨识第一项就是 Rs。
PLL 锁相中 Kp/Ki 加大的副作用?
  1. 没影响
  2. 锁相更快但角度抖动放大(噪声经过 PI 直接进 θ) (正确)
  3. 降低带宽
  4. 失锁
提示:PI 增益越大跟踪越快,但同时放大输入端的噪声(BEMF 估算抖动)。在低速噪声大时尤其敏感,需要折中。
滑模观测器 (SMO) 的"等效控制项"为什么要经过低通滤波?
  1. 硬件要求
  2. sign() 切换函数本身有高频抖振,滤掉抖振才得到平滑 BEMF (正确)
  3. 减少计算量
  4. 修正 Rs
提示:SMO 让估算电流强制收敛到测量值,依靠 sign(error) 切换。这个切换以采样频率抖动,必须低通才能从中提取 BEMF 平均值作为角度信息源。
从开环切到闭环的最佳判据?
  1. 等 1 秒
  2. BEMF 幅值 ≥ 阈值 + PLL 角度误差 < 5° 持续 ≥ 20ms (正确)
  3. 检测电流稳定
  4. 速度命令到达
提示:切换条件应基于"估算质量"——BEMF 信噪比够高 + PLL 已稳定锁相一段时间。光看时间不够,遇到启动失步会把电机拖跑了。