10无感 FOC / 观测器
反电动势、SMO、PLL 与开闭环切换
本模块主旨
反电动势是无感的"回声"——速度大听得清、速度小被噪声淹没;要懂 SMO 离散化、Rs 温飘、PLL 带宽、切换滞回四件事才能上量产。学完应能回答
- 能默写 e = v − Rs·i − Ls·di/dt,并解释每一项的物理含义和离散化误差源
- 能解释为什么低速 BEMF 幅值小 → 估角度失败(SNR 塌陷),并定量算"信噪比 = 1"的临界转速
- 理解 PLL 用 sin(θ_meas − θ̂) 而不是 Δθ 直接做误差的原因(在 ±π/2 内单调)
- 掌握 STM32 上 SMO 离散化骨架(一阶 Euler + sat 函数)和稳定步长选择
- 能识别 SMO 抖振、Rs 温飘漂角、PLL 增益过大、滤波延迟相位损失四类典型故障现象
- 知道 BEMF/HFI 切换的转速边界(5-10% 同步速)和滞回原则,以及健康检查闭环
总览
无感 FOC 核心是"角度可信度管理"——什么时候可信、什么时候必须回退到开环。算法只是其中一环。零基础速入
类比
无感 FOC 像在黑暗中用回声定位——没有编码器(眼睛),靠"听"反电动势的回声来判断转子在哪儿。回声大(高速)听得清;回声小(低速)就被噪声淹没,得先盲推一段时间(开环启动)等回声出现再切闭环。核心概念
无感不是没有角度,而是用电压、电流、电机模型估算角度。低速反电动势小,估算不可靠;高速精度高。常见方案:开环启动 → 反电动势观测器 → PLL 锁相得角度。为什么要学
- 风机、水泵、压缩机、家电都用无感 FOC(省一个编码器 = 省成本 + 简化结构)。
- "电机不转""低速失步""切换瞬间抖动"绝大多数源于角度估算质量。
- 理解 BEMF 和 PLL 后才知道为什么风机厂商规定"启动时一定要先开环转 1 秒"。
第一手操作
右侧把"转速"从 450 rpm 拉到 2000 rpm,看左侧"PLL 锁相"图:估算角度(蓝)从大幅滞后真实角度(绿)变成几乎重合。下方"BEMF αβ" 波形振幅明显增大——回声变大,定位变准。学习目标
- 区分有感 FOC 与无感 FOC
- 理解反电动势观测器和 PLL 的工作原理
- 学会"开环启动 → 闭环切换"的工程套路
核心概念
- 反电动势 BEMF = Ke·ω,正比于转速。低速 BEMF 小,被 ADC 噪声 + Rs/Ls 参数误差掩盖,估算不可靠。
- PLL = Phase-Locked Loop,是把"测量角度"通过 PI 锁相变成"平滑跟踪角度",过滤噪声。
- 工程套路:上电先开环 V/f 拖到目标速度(典型 30-50% 额定)→ 等观测器置信度上去 → 平滑切到闭环。
公式
反电动势观测
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。鲁棒性好,但有抖振。
工程意义
- 低速时 BEMF 信号比噪声小→必须开环启动。500 rpm 是经验阈值。
- Rs/Ls 参数标定不准 → 估算 BEMF 偏差 → 角度有恒定偏移。生产线必做参数辨识。
- 负载突变(开闭环切换、负载冲击)会让 PLL 暂时失锁——需要"健康检查"自动回退到开环。
STM32 移植指南
- 离散化用前向欧拉就够(Ts = PWM 周期);高带宽场景用 Tustin。
- L·diα/dt 用 (iα[k] − iα[k-1]) / Ts,但要先加 Butterworth 低通去高频噪声。
- 上电流程:1) 对齐 d 轴 → 2) 开环 V/f 拖动 → 3) 监测 PLL 收敛(角度误差 < 5° 持续 20ms)→ 4) 切闭环。
常见误区
- 低速强行闭环,BEMF 太小 PLL 锁不住,电机抖动甚至反转。
- 观测器增益过高 → 角度抖到电流环噪声放大。
- 没加 PLL 健康检查,故障情况继续按估算角度送电流→烧管。
- 把开环 V/f 启动的电压设得过大或过小,电机失步。
调试方法
- 临时装个编码器对比:估算角度 vs 真实角度,画误差曲线。
- 观察 BEMF αβ 波形是否对称正弦。畸变 → 检查 Rs/Ls 参数和死区补偿。
- 阶跃负载,看 PLL 恢复时间(应 < 50ms);恢复慢 → Kp/Ki 偏低。
建议实验
- 速度从 450 rpm 拉到 2000 rpm,看 PLL 锁相质量变化。
- 把"噪声"参数从 0.08 拉到 0.5,看角度估算抖动加剧。
- 把 PLL Kp/Ki 加倍,看 BEMF 噪声直接放大到角度。
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 必须有"开环启动"阶段?
- 硬件要求
- 低速时 BEMF 信号被噪声淹没,无法估算角度 (正确)
- 让用户耐心等待
- 降低成本
提示:BEMF = Ke·ω 正比于转速。低速(< 500rpm)BEMF 几乎为零,全是 Rs/Ls 参数误差和 ADC 噪声,角度估不出来。先用开环 V/f 把电机拖到一定速度再切闭环。
反电动势观测公式 e = v − Ri − L·di/dt 中,最易导致角度偏移的参数误差是?
- v
- R (正确)
- L
- 都不影响
提示:R 直接乘电流,误差直接进 BEMF。L 影响 di/dt 项,电流变化率小时影响弱。生产线参数辨识第一项就是 Rs。
PLL 锁相中 Kp/Ki 加大的副作用?
- 没影响
- 锁相更快但角度抖动放大(噪声经过 PI 直接进 θ) (正确)
- 降低带宽
- 失锁
提示:PI 增益越大跟踪越快,但同时放大输入端的噪声(BEMF 估算抖动)。在低速噪声大时尤其敏感,需要折中。
滑模观测器 (SMO) 的"等效控制项"为什么要经过低通滤波?
- 硬件要求
- sign() 切换函数本身有高频抖振,滤掉抖振才得到平滑 BEMF (正确)
- 减少计算量
- 修正 Rs
提示:SMO 让估算电流强制收敛到测量值,依靠 sign(error) 切换。这个切换以采样频率抖动,必须低通才能从中提取 BEMF 平均值作为角度信息源。
从开环切到闭环的最佳判据?
- 等 1 秒
- BEMF 幅值 ≥ 阈值 + PLL 角度误差 < 5° 持续 ≥ 20ms (正确)
- 检测电流稳定
- 速度命令到达
提示:切换条件应基于"估算质量"——BEMF 信噪比够高 + PLL 已稳定锁相一段时间。光看时间不够,遇到启动失步会把电机拖跑了。