🔍 状态观测器全解:龙伯格 / KF / EKF / SMO / MRAS / HFI

从"看不见的状态怎么估"讲起:龙伯格打地基、卡尔曼管噪声、EKF 解非线性、SMO 扛工业大梁、MRAS 平滑保底、HFI 补齐零低速,最后合成一张无感 FOC 全速域切换地图。电机工程师视角,每个观测器都按"是什么→为什么→怎么做→公式/代码→面试怎么问→易错点"展开。
状态观测器 无感FOC EKF SMO 高频注入HFI PLL锁相 面试高频
🎯 本页学习目标
1. 能写出龙伯格观测器的误差动态方程 ė = (A − LC)e,并说出增益 L 极点配置中"收敛快 vs 噪声敏感"的折中
2. 能画出 EKF"预测—更新"两步框图,说出 Q、R 的物理意义("信模型"还是"信测量")与发散排查思路
3. 能徒手推导 SMO 的滑模面、等效控制含 EEMF 的来龙去脉,并读懂 ~60 行教学版 C 实现
4. 能解释为什么零低速必须 HFI、凸极效应(Ld≠Lq)是什么,以及速段切换带滞环与角度加权怎么做
5. 能对着"观测器对比大表"回答面试题:SMO 抖振、EKF 发散、无感低速为什么难
建议用时:约 70 分钟(精读)+ 30 分钟(自测与 FAQ 折叠展开)

1 为什么需要状态观测器:看不见的状态怎么估?

是什么:状态观测器(State Observer)是一个跑在 MCU 里的"软件传感器"——它用能测到的量(电压 u、电流 i 等)和系统的数学模型,实时重建出测不到的状态(转子角度 θ、转速 ω、磁链 ψ、负载转矩 TL 等),记作 θ̂、ω̂("帽子"读作"估计值")。一句话:模型 + 测量 + 误差反馈 = 把不可测状态算出来

1.1 哪些状态"测不到":无感 FOC 的动机

为什么:FOC 需要转子电角度 θ 做坐标变换、速度环需要 ω、力控碰撞检测需要 TL、磁链观测需要 ψ——但在真实关节里,这些量都没有现成的传感器输出:

状态量能否直接测典型来源 / 问题
相电流 ia ib ic✅ 能测采样电阻 + ADC,便宜可靠(但有噪声、增益误差)
母线电压 Vdc✅ 能测分压电阻 + ADC
转子电角度 θ、转速 ω❌ 不能直接测要编码器/旋变:贵、占轴向空间、多一条线缆、薄弱环节;机器人关节常用输出端编码器,转子侧仍无直接信息
永磁磁链 ψf❌ 不能直接测随温度漂移,只能标定或在线辨识
负载转矩 TL❌ 不能直接测关节力矩传感器很贵;常用"观测器估 TL"做碰撞检测
绕组温度 / Rt❌ 不能直接测影响 Rs 取值,进而影响观测器精度

怎么做——两条路线:①装物理传感器(编码器/旋变/霍尔),简单可靠但每个关节多 30~100 元成本、多几毫米轴向长度、多一根 FPC/线缆,人形机器人 30~40 个关节就是一笔不小的开销和可靠性负担;②无传感器(Sensorless,简称"无感"):完全用算法从电压电流里"算出"θ̂ 和 ω̂——这就是本页主角。除无感 FOC 外,观测器还广泛用于负载转矩估计(碰撞检测/自适应控制)磁链与温度估计滤波测速(编码器微分噪声大,用观测器代替差分)。

💡 一句话动机:凡是"模型知道、测量够不着"的量,都值得一个观测器。对机器人工程师:省一个编码器 = 省成本省空间省一根线;对算法工程师:观测器是从"经典调参"迈向"现代状态空间控制"(04-16)的第一道门。

面试怎么问:"什么是状态观测器?为什么无感 FOC 需要它?无感能完全取代编码器吗?"(答:低速带载场景仍不能——见第 7、8 节。)

⚠️ 易错点:观测器估出来的 θ̂ 是数学构造,精度上限由模型参数(Rs、L、ψf)决定;别把它当成"免费的高精度传感器"。参数失配时误差是系统性偏差,滤波再久也消不掉(见 10.2)。

2 龙伯格观测器:一切观测器的地基

是什么:龙伯格(Luenberger)观测器是线性系统的全维状态观测器,结构最简单:拿同一个模型照着对象"跑一份拷贝",把输出误差 y − ŷ 通过增益 L 反馈回模型,把拷贝"拽"回真实轨迹。后续的卡尔曼、SMO,骨架都是它,只是"怎么算反馈增益、怎么处理噪声/非线性"不同。

2.1 误差动态方程:为什么加 L 就能收敛

怎么做:设线性系统 ẋ = Ax + Bu,y = Cx(状态方程,见 04-16)。观测器用同样的 A、B 仿真,再加一个输出误差校正项:

观测器:\ \dot{\hat{x}} = A\hat{x} + Bu + L\,(y - C\hat{x}),\qquad 输出误差:\ e_y = y - C\hat{x}

定义估计误差 e = x − x̂,两式相减(Ax − Ax̂ = Ae,测量项 Cy − Cx̂ = Ce),得到误差动态方程:

\dot{e} = (A - LC)\,e \;\;\Rightarrow\;\; e(t) = e^{\,(A-LC)t}\,e(0) \xrightarrow{\;t\to\infty\;} 0

这一行就是观测器的灵魂:只要矩阵 (A − LC) 的所有特征值都在左半平面(负实部),误差就指数收敛到零,收敛快慢由这些极点决定。增益 L 就是干这件事的"旋钮"——不猜、不凑,直接配置极点。

u 被控对象(真实电机) ẋ = Ax + Bu y y = Cx(测量) Σ + ŷ = Cx̂(估计) e = y − ŷ × L 误差反馈增益 龙伯格观测器(模型拷贝) x̂̇ = Ax̂ + Bu + L(y − Cx̂) 目标: ė = (A − LC)e → 0,估计 x̂ 收敛到真实 x
图① 龙伯格观测器结构:同一模型跑一份"拷贝",输出误差 e = y − ŷ 经增益 L 反馈校正,把估计状态拽回真实轨迹

2.2 极点配置:收敛速度 vs 噪声敏感的折中

怎么做:给 (A − LC) 配极点就是选观测器的"带宽"。为什么是折中:

经验准则:观测器主导极点 ≈ (3 ~ 5) × 闭环主导极点,且 ≤ 采样频率的 1/10;再往上只换来噪声

可观测性是前提:若 (A, C) 不可观测,任何 L 都救不回来——某些状态在输出里根本没留"痕迹"。工程上常用 Ackermann 公式或直接解 Sylvester 方程求 L(MATLAB place() / estim(),见 MathWorks 观测器文档,资源卡 R4)。

面试怎么问:"观测器增益 L 怎么选?极点配得越快越好吗?"——标准答案必须答出噪声放大这一半,只答"快就是好"是典型减分项。

⚠️ 易错点:①把观测器极点和闭环极点混在一起配——先定控制带宽,再让观测器快 3~5 倍;②忽略执行器饱和:误差大时 L·e 会让观测器输出飞到模型有效域之外,实际要给校正项限幅。

2.3 分离原理与离散实现(含 C 代码)

分离原理(Separation Principle):对线性系统,"设计状态反馈 K"(04-16 的 LQR/极点配置)与"设计观测器 L"可以完全独立进行,合起来的闭环 (A − BK, LC) 的特征多项式恰好是两者之积,互不干扰。这条原理是现代控制的"模块化许可证":先按性能定 K,再按噪声定 L(详见 04-16 状态空间一页)。

离散实现:MCU 上按周期 Ts 执行"预测 → 校正"两步。对 PMSM 电机的电流模型做龙伯格(可顺带把 EEMF 的一帧当扰动估计),核心就几行:

// 龙伯格观测器离散实现(预测-校正形式),每个控制周期 Ts 执行一次
// 系统已离散化: x[k+1] = Ad·x[k] + Bd·u[k],  y[k] = C·x[k]
typedef struct {
    float x_hat[4];   // 估计状态, 如 [ia ib ea eb](电流+EEMF)
    float L[4];       // 观测器增益(按极点配置离线算好)
    float Ad[4][4];   // 离散状态矩阵(由 A·Ts 一阶保持离散化)
    float Bd[4][2];   // 离散输入矩阵
} luenberger_t;

void luenberger_step(luenberger_t *o, const float u[2], const float y[2], float Ts)
{
    float corr[2];                        // 输出误差 e_y = y - C·x̂
    corr[0] = y[0] - o->x_hat[0];         // C = [I 0]: 只取电流两个状态作输出
    corr[1] = y[1] - o->x_hat[1];
    if (corr[0] >  CORR_MAX) corr[0] =  CORR_MAX;   // 校正项限幅: 防止大误差冲飞估计
    if (corr[0] < -CORR_MAX) corr[0] = -CORR_MAX;
    if (corr[1] >  CORR_MAX) corr[1] =  CORR_MAX;
    if (corr[1] < -CORR_MAX) corr[1] = -CORR_MAX;

    for (int i = 0; i < 4; i++) {
        float xd = 0.0f;
        for (int j = 0; j < 4; j++) xd += o->Ad[i][j] * o->x_hat[j];   // 预测: Ad·x̂
        for (int j = 0; j < 2; j++) xd += o->Bd[i][j] * u[j];          // + Bd·u
        // 校正: + L·e_y(L 只有前两行非零, 因为只有电流可测)
        xd += o->L[i] * ((i < 2) ? corr[i] : 0.0f);
        o->x_hat[i] = xd;                 // 注意: 严格应先算全部再加, 状态少时此写法误差可忽略
    }
    // x_hat[2]、x_hat[3] 即估计出的 EEMF 分量, 后续 arctan/PLL 得到 θ̂(与 SMO 相通)
}

面试怎么问:"分离原理是什么?为什么能用估计状态代替真实状态做反馈?"——答出"控制律用 x̂ 代替 x,只要观测器稳定,闭环极点仍是 K 与 L 两组极点的并集"。

⚠️ 易错点:龙伯格是确定性方法——它对"噪声长什么样"不做任何假设,增益配好了就定了,不随噪声变化自适应。当测量噪声大、需要"最优权衡"时,就该轮到卡尔曼滤波(第 3 节);当模型非线性时,轮到 EKF(第 4 节)。

3 卡尔曼滤波回顾:预测/更新与 Q·R 调参直觉

是什么:卡尔曼滤波(KF)是线性、高斯噪声假设下的最优状态观测器。和龙伯格"增益 L 拍死"不同,KF 的增益 K 每拍根据误差协方差 P 现场计算:模型可信(预测准、P 小)就少听测量,模型发散(P 大)就多听测量。它是"龙伯格 + 噪声统计"的升级,也是 EKF 的地基(系统性学习推荐资源卡 R1:rlabbe 免费在线书,直觉讲解第一)。

3.1 预测/更新两步与 Q·R 的物理意义

预测(Predict):\ \hat{x}^- = A\hat{x} + Bu,\qquad P^- = A\,P\,A^{\mathsf T} + Q
更新(Update):\ K = P^-C^{\mathsf T}(C\,P^-C^{\mathsf T} + R)^{-1},\quad \hat{x} = \hat{x}^- + K(y - C\hat{x}^-),\quad P = (I - KC)\,P^-

怎么做——Q 和 R 的调参直觉(面试和工程都最常考):

参数物理意义调大 / 调小的后果
Q:过程噪声协方差"模型有多不准":建模误差、负载突变、参数漂移等未被模型描述的扰动Q 大 → 信测量:响应快、跟随负载变化,但毛刺多;Q 小 → 信模型,平滑但滞后
R:测量噪声协方差"测量有多不准":ADC 噪声、采样误差(可实测:静止时采电流算方差)R 大 → 信模型:平滑、滤波强;R 小 → 信测量,噪声直达输出
P:估计误差协方差滤波器对"自己现在错多少"的内部判断初值 P₀ 给大一些,让滤波器快速信任测量、缩短初始收敛

口诀:"信模型还是信测量"——Q 谁大听测量,R 谁大听模型。稳态时 K 趋于常数,KF 退化成一个增益固定的龙伯格观测器(这也是两流派在稳态下等价的直观理解)。

面试怎么问:"Q、R 怎么取?它们和龙伯格增益 L 什么关系?"(Q/R 定 K 的稳态值 = 定效 L;Q/R 之比决定滤波带宽。)

⚠️ 易错点:Q、R 是协方差矩阵,不是标量噪声幅值;多维状态要对角放置各维噪声强度,量纲要和状态一致(rad、rad/s、A),混了量纲 P 会瞬间非正定。

3.2 线性 KF 例:恒速假设下的负载转矩估计

怎么做:机器人关节做碰撞检测常估 TL。把机械方程当"增广状态"纳入 KF:状态取 x = [ω, TL]T,测量 y = ωenc(编码器转速,已滤波)。模型(转动惯量 J、黏摩擦 B、转矩常数 Kt):

\dot{\omega} = \tfrac{K_t}{J}i_q - \tfrac{B}{J}\omega - \tfrac{1}{J}T_L,\qquad \dot{T}_L = 0\ (慢变随机游走:\ T_{L,k+1} = T_{L,k} + w_k,\ w_k \sim Q_{T})

TL 建成"随机游走"(每拍加一点过程噪声 w)是观测器里的经典套路——把慢变量放进状态、用 Q 给它"呼吸权",KF 就能一边用电流推算理论加速度、一边从转速残差里把 TL 反解出来。这里的模型是线性的,直接用 3.1 两步公式即可,不需要 EKF。易错点:TL 的 Q_T 给太小 → 碰撞后估计爬升太慢,检测延迟;给太大 → 正常加减速也被误判成"碰撞"。面试怎么问:"没有力矩传感器怎么检测碰撞?"——增广状态 + KF 估 TL + 阈值/滑窗判据,是标准答题框架。

数值算例:一维 KF 递推 3 拍(恒值负载转矩估计,手推)

对象:恒值负载转矩 TL 估计,建模成随机游走 x[k+1] = x[k](预测步状态不变),测量 z = x + v。参数:P₀ = 1,Q = 0.01,R = 0.25(相当于测量噪声标准差 0.5 N·m);测量序列 z = [10.2, 9.8, 10.1] N·m。初始估计 x̂₀ = 0(无先验,P₀ 给大表示「自己也不知道」)。每拍三件事:预测 P⁻ = P + Q → 增益 K = P⁻/(P⁻+R) → 更新 x̂ = x̂ + K(z−x̂)、P = (1−K)·P⁻。数值保留 4 位小数:

预测 P⁻ = P+Q增益 K = P⁻/(P⁻+R)更新 x̂ = x̂+K(z−x̂)P = (1−K)·P⁻
11.0000+0.01 = 1.01001.0100/1.2600 = 0.80160 + 0.8016×(10.2−0) = 8.17620.1984×1.0100 = 0.2004
20.2004+0.01 = 0.21040.2104/0.4604 = 0.45708.1762 + 0.4570×(9.8−8.1762) = 8.1762+0.7421 = 8.91830.5430×0.2104 = 0.1142
30.1142+0.01 = 0.12420.1242/0.3742 = 0.33208.9183 + 0.3320×(10.1−8.9183) = 8.9183+0.3923 = 9.31060.6680×0.1242 = 0.0830

K 的收敛趋势与稳态值:K 依次为 0.8016 → 0.4570 → 0.3320,继续递推依次约 0.2712 → 0.2373 → 0.2171 → 0.1965 → 0.1878 → …,单调收敛到稳态 K0.181。稳态值可闭式求解:令 P⁻ 的稳态为 p,由 p = R·p/(p+R) + Q 解得 p = [Q+√(Q²+4QR)]/2 = [0.01+√0.0101]/2 = 0.0552,故 K = 0.0552/(0.0552+0.25) = 0.1810——与递推趋势吻合(这就是 3.1 节「稳态时 KF 退化为定增益龙伯格观测器」的数值版)。

怎么读这张表:初始阶段 P 大 → K 大 → 第一拍几乎全信测量(x̂ 从 0 直接跳到 8.18),这是「快速吃掉初始误差」;之后 P 逐拍收缩 → K 越来越小 → 每拍只按残差做小步修正,K 小 = 越来越信模型、越来越不信单次测量(对应 3.1 节口诀的动态版)。若真实负载是 10 N·m,3 拍后估到 9.31,还在收敛途中——继续跑会贴上去;若负载突然阶跃,P 很小、K 很小,估计会爬升变慢,这正是把 TL 的 Q 给大一点的理由(3.2 节碰撞检测的调参依据)。

📌 自检:把数字换成你的电机参数重算一遍(提示:只改 Q、R、z 序列,三步公式不变;先口算稳态 K,再看递推是否走向它)。

4 扩展卡尔曼滤波 EKF:非线性系统与 PMSM 无感主力

是什么:电机方程里有 sinθ、cosθ——天然非线性,KF 不能直接用。EKF(Extended KF)的做法:围绕当前估计点把非线性函数泰勒展开取一次项(雅可比矩阵),把非线性问题"局部线性化",然后照搬 KF 的两步。它是 PMSM 无感里精度上限最高的方案之一,代价是算力与调参负担。

4.1 雅可比线性化:PMSM 状态 [id iq ω θ] 推导框架

怎么做:非线性系统 xk+1 = f(xk, uk) + w,yk = h(xk) + v,预测与更新中的 A、C 换成雅可比:

F_k = \left.\frac{\partial f}{\partial x}\right|_{\hat{x}_k,\,u_k},\qquad H_k = \left.\frac{\partial h}{\partial x}\right|_{\hat{x}_k},\qquad P^- = F_k P F_k^{\mathsf T} + Q

以 PMSM 无感为例(转子磁场坐标系 dq + 机械方程),状态取 x = [id, iq, ω, θ]T,输入 u = [vd, vq]T,连续状态方程(表贴式 Ld=Lq=Ls 时同理简化):

\begin{aligned} \dot{i}_d &= \tfrac{1}{L_d}\big(v_d - R_s i_d + \omega\,L_q\,i_q\big)\\ \dot{i}_q &= \tfrac{1}{L_q}\big(v_q - R_s i_q - \omega(L_d\,i_d + \psi_f)\big)\\ \dot{\omega} &= \tfrac{1}{J}\big(\tfrac{3}{2}p\,\psi_f\,i_q - T_L\big),\qquad \dot{\theta} = p\,\omega \end{aligned}

注意 ω、θ 都是状态——EKF 一次同时给出转速和角度,不需要额外 PLL(与 SMO 的关键差异)。测量方程 h(x) = [id, iq]T(H 是常数矩阵)。离散化用前向欧拉(xk+1 = xk + T·f),每拍重新算 4×4 雅可比 F(含 cosθ、sinθ 项),然后走 KF 两步。

u = [vd vq] 本拍施加的电压 y = [id iq] 实测电流(ADC) u 上一拍值(延迟补偿) ① 预测 Predict(模型推) x̂⁻ = f(x̂, u) F = ∂f/∂x(雅可比, 含 cosθ sinθ) P⁻ = F P Fᵀ + Q "我觉得现在大概在哪"(先验) x̂⁻, P⁻ ② 更新 Correct(测量校) K = P⁻Hᵀ(HP⁻Hᵀ + R)⁻¹ x̂ = x̂⁻ + K(y − H x̂⁻), P = (I−KH)P⁻ "用测量残差修正自己"(后验) 下一拍 ω̂ θ̂ 给 Park 变换 与速度环 Q = 过程噪声(模型不准的度量) · R = 测量噪声(ADC 不准的度量) · 每控制周期执行一次
图② EKF 两步循环:预测步"模型往外推",更新步"测量往回拉",增益 K 由协方差现场算出

4.2 协方差传播、工程调参与定点实现

协方差传播:预测步 P⁻ = F P FT + Q 描述"不确定性随模型扩散",更新步 P = (I−KH)P⁻ 描述"测量把不确定性压回去"。P 对角线就是各状态当前估计误差的方差——它能当作置信度输出(切换策略里判断"观测器可信度"的天然指标)。

Q/R 初值方法(工程套路):

发散排查清单(面试必背 + 现场救命):

🧯 EKF 发散排查八条:① P 失去对称正定 → 用对称化 P=(P+Pᵀ)/2 或 Joseph 形式更新;② Q 太小 → 滤波器"过度自信"无视测量,残差越滚越大;③ R 太小 → 盲信噪声测量,P 被压得过小后突然失去纠偏能力;④ 初值 x̂₀ 离谱、P₀ 太小 → 初始 P₀ 给大(×100)让滤波器快速吸收测量;⑤ 步长 T 与采样率不匹配 / 模型离散化误差;⑥ Rs、L、ψf 参数失配(温升后 Rs 可漂 30%+);⑦ 测量野值(ADC 毛刺)→ 残差卡方门限,超限跳过更新;⑧ 数值下溢:定点实现里 P 被截断到 0。

定点数实现注意:EKF 全是矩阵乘加,P 的动态范围大(从 1e-6 到 1e3),Q15/Q16 定点极易溢出或下溢——要么用 Qm.n 长格式(64 位中间量),要么干脆选带硬件 FPU 的 MCU(STM32G4/F4,见 04-02)直接上 float32;4×4 矩阵求逆避免显式求逆,按 (HP⁻Hᵀ+R)-1 是 2×2 用解析式。面试怎么问:"EKF 为什么会发散?你怎么保证它不发散?"——答 Joseph 形式 / P 对称化 / 残差门限 / Q·R 在线校正,即可超出多数候选人。

EKF 核心循环伪代码(每控制周期一次):

// EKF 伪代码框架: 状态 x = [id iq w th], 测量 y = [id iq]
// 约定: f() 为离散状态方程, Jac() 返回 4x4 雅可比 F
void ekf_step(ekf_t *e, const float u[2], const float y[2], float T)
{
    /* ---------- ① 预测 Predict ---------- */
    f(e->x, u, T);                              // x̂⁻ = f(x̂, u): 非线性状态方程(前向欧拉)
    Jac(e->F, e->x, u, T);                      // F = ∂f/∂x, 在当前估计点算(含 cos/sin)
    mat_mult_AT_A(e->P, e->F, e->P);            // P⁻ = F·P·Fᵀ  (4x4)
    for (i = 0; i < 4; i++) e->P[i][i] += e->Q[i];   // P⁻ += Q(对角阵时简化)

    /* ---------- ② 更新 Correct ---------- */
    // H = [1 0 0 0; 0 1 0 0](测电流), S = H·P⁻·Hᵀ + R → 2x2
    S[0][0] = e->P[0][0] + e->R[0];   S[0][1] = e->P[0][1];
    S[1][0] = e->P[1][0];             S[1][1] = e->P[1][1] + e->R[1];
    inv2(S_inv, S);                            // 2x2 解析求逆, 避免通用矩阵求逆
    // K = P⁻·Hᵀ·S⁻¹ → 4x2: 取 P⁻ 前两列再右乘 S⁻¹
    for (i = 0; i < 4; i++)
      for (j = 0; j < 2; j++) {
        K[i][j] = 0;
        for (k = 0; k < 2; k++) K[i][j] += e->P[i][k] * S_inv[k][j];
      }
    // 残差 r = y − H·x̂⁻ (可加卡方门限: |r|² 超限则跳过本拍更新, 防野值)
    r[0] = y[0] - e->x[0];   r[1] = y[1] - e->x[1];
    for (i = 0; i < 4; i++) e->x[i] += K[i][0]*r[0] + K[i][1]*r[1];   // x̂ = x̂⁻ + K·r
    for (i = 0; i < 4; i++)            // P = (I − K·H)·P⁻(H 只取前两行, 简化展开)
      for (j = 0; j < 4; j++)
        Pn[i][j] = e->P[i][j]
                 - (K[i][0]*e->P[0][j] + K[i][1]*e->P[1][j]);
    copy_P(e->P, Pn);
    symmetrize(e->P);                          // P = (P + Pᵀ)/2: 数值稳定的关键一行

    /* 输出: e->x[2] = ω̂ → 速度环; e->x[3] = θ̂(wrap 到 [0,2π)) → Park/逆Park */
}

面试怎么问:"EKF 相比 SMO 好在哪、贵在哪?"——好:协方差加权、最优融合、天然给出 ω̂ 且抗噪可调;贵:每拍 4×4 矩阵乘(数百次乘加)、7 组以上参数要调、有发散风险,对 MCU 算力与浮点支持要求高。

⚠️ 易错点:①EKF 线性化只在估计点附近一阶有效——状态突跳大(启动冲击)时先验偏离,可能发散,工程上配合"启动阶段加大 Q"过渡;②θ 状态记得 wrap 到 [0, 2π),否则 sin/cos 与协方差随圈数漂移;③别用 0 初值估 θ̂——先用开环定位或 HFI 拉到 ±30° 内再切入 EKF。

5 SMO 滑模观测器:工业无感的主力方案

是什么:SMO(Sliding Mode Observer,滑模观测器)把"让估计误差归零"变成一个滑动模态问题:设计一个电流观测器,用大增益开关项把电流误差"砸"到零;误差为零时,开关项的等效控制恰好等于扩展反电动势(EEMF)——它里面藏着 θ。结构简单、计算量小、对参数不敏感,是商用无感固件(TI InstaSPIN 之外最常见的方案、ST MC SDK 标配)的主力,也是面试出题密度最高的观测器。

5.1 结构三件套:电流观测器 + 滑模面 + 开关增益

怎么做:在静止 αβ 坐标系下,PMSM 电流方程为(dq 方程经反 Park 变换):

i̇_α = \tfrac{1}{L_s}\big(v_α - R_s\,i_α - e_α\big),\qquad i̇_β = \tfrac{1}{L_s}\big(v_β - R_s\,i_β - e_β\big)

照此搭一个电流估计器,把未知的 −e/L 项替换成开关项,并定义滑模面:

观测器:\ \dot{\hat{i}}_α = \tfrac{1}{L_s}\big(v_α - R_s\,\hat{i}_α + z_α\big),\quad z_α = k\cdot\mathrm{sign}(e_α),\qquad 滑模面:\ s = e_α = i_α - \hat{i}_α = 0

滑模存在条件(到达条件)s·ṡ < 0 → 只要 k 大于 EEMF 的幅值上界(k > max|ω ψf|,留 1.5~2 倍裕量),误差就会被"顶"在零面上滑动——这一步完全不用精确的 Ls、Rs 值,这正是 SMO 对参数不敏感的原因(龙伯格做不到)。面试怎么问:"SMO 的滑模增益 k 怎么取?"——答"k 按最高转速下的 EEMF 幅值 ωmaxψf 取裕量,过大加剧抖振、过小到达不了滑模面"。

5.2 等效控制含 EEMF:低通滤波提取与相位补偿

为什么:误差滑到零后,开关项高频切换的等效(平均)值就是被它顶替的那一项:

z_{α,eq} \approx e_α = -\psi_f\,\omega\sin\theta,\qquad z_{β,eq} \approx e_β = \psi_f\,\omega\cos\theta \quad(\text{扩展反电动势 EEMF})

EEMF 是个幅值 ∝ ωψf、相位锁定在 θ+90° 的正弦对——把它当"量角器"就有 θ。但开关原始输出是"高频毛刺+低频正弦"的混合,要一阶低通滤波(LPF)把毛刺滤掉:

\hat{e} = \frac{z_{eq}}{\tau s + 1} \;\Rightarrow\; \text{相位滞后 } \Delta\theta = \arctan(\omega\,\tau),\qquad \tau = \tfrac{1}{\omega_{lpf}}\ (\text{截止角频率的倒数})

滤波必然引入随转速变化的相位滞后,必须用 arctan(ω·τ) 在线补偿,否则 θ̂ 落后真实 θ,FOC 力矩系数下降、高转速时甚至失步。截止频率取低 → 毛刺小但滞后大;取高 → 反之。这是 SMO 调参的第一矛盾。易错点:补偿角随 ω 变——低速时≈0 可忽略,高速时不补就是系统性角度误差,表现为"转速越高、带载能力越差"。

5.3 抖振问题:sigmoid / 饱和函数与边界层

是什么:理想 sign 函数在零面附近无限频开关,叠加离散采样,输出像"锯齿上骑正弦"——这就是抖振(chattering)。后果:EEMF 毛刺大 → LPF 被迫取低截止 → 滞后加重;还带来高频噪声、损耗、机械啸叫。怎么做:工程三板斧:

面试怎么问:"SMO 抖振怎么抑制?"——标准答案组合拳:边界层函数(sat/sigmoid)+ 合理 k + LPF 截止与相位补偿 + (加分)自适应增益或超螺旋

⚠️ 易错点:sigmoid 严格说不再是"真滑模"(边界层内等效于高增益线性反馈),面试要说清"边界层内放弃完全滑模换取连续性";边界层 Δ 太大时 θ̂ 会带直流偏置。

5.4 PLL 从 EEMF 提取 θ̂ 与 ω̂:为什么不用 arctan

为什么:拿到 (êα, êβ),最直接是 θ̂ = atan2(êβ, êα),ω̂ 再做差分。但:低速时 EEMF 幅值小、信噪比差,除法/反正切把噪声放大;atan2 结果要跨 2π 解包裹,毛刺直接窜进 θ̂;ω̂ 由 θ̂ 差分而来,一次微分使噪声再放大 3dB 以上。所以工业实现全部用 PLL(锁相环):把"相位跟踪"变成闭环控制问题,相当于对相位误差做了一次低通:

\varepsilon = -\hat{e}_α\cos\hat{\theta} - \hat{e}_β\sin\hat{\theta} \approx \psi_f\,\omega\sin(\theta - \hat{\theta}) \;\xrightarrow{\;\theta-\hat{\theta}\,\text{小}\;}\; \psi_f\,\omega\,(\theta - \hat{\theta})
\text{PI 环路:}\quad \hat{\omega} = K_p\,\varepsilon + K_i\!\int\!\varepsilon\,\mathrm{d}t,\qquad \hat{\theta} = \int\!\hat{\omega}\,\mathrm{d}t

ε 是"相位差 × 幅值"的误差信号,PI 把它调到零 → θ̂ 咬住 θ,PI 输出顺带就是平滑的 ω̂,一举两得。PI 带宽取"电流环带宽的 1/5~1/2、且低于采样频率 1/10":带宽高跟踪快但抖,带宽低平滑但动态滞后。面试怎么问:"为什么用 PLL 而不是直接 arctan?"——必须答出噪声抑制 + 无需解包裹 + 同时平滑得到 ω̂ 三点。

实测 iα iβ Clark 变换后 Σ + e = i − î(滑模面 s=0) 饱和函数 z = k·sat(e/Δ) 一阶低通 LPF 1/(τs+1) + 相位补偿 êα ≈ −ψf·ω·sinθ, êβ ≈ ψf·ω·cosθ(EEMF) PLL 锁相环 ε = −êα·cosθ̂ − êβ·sinθ̂ ≈ ψf·ω·sin(θ−θ̂) PI → ω̂(平滑转速) ∫ω̂ → θ̂(wrap 0~2π) 对相位误差闭环 = 又一层低通 θ̂ ω̂ → Park/速度环 开关项 z 电流观测器模型 dî/dt = (v − Rs·î + z)/Ls vα vβ 施加电压 估计电流 î 误差滑到零 → 开关项均值 ≈ EEMF → LPF 滤毛刺 → PLL 解调出 θ̂ 与 ω̂
图③ SMO + PLL 全链路:电流误差 → 饱和开关 → 电流模型(î 反馈) → LPF → EEMF → PLL → θ̂ ω̂

5.5 完整离散 C 代码(教学版)

把 5.1~5.4 串起来,一个能在 STM32 上 20kHz 跑的最小可用 SMO 大约 60 行(实际产品还要加启动逻辑、参数在线修正与野值防护):

// ================= SMO 滑模观测器 · 教学版(表贴式 PMSM, αβ 系) =================
typedef struct {
    float Rs, Ls;        // 定子电阻/电感(标定值)
    float Fc;            // 控制周期频率 [Hz]
    float k_slide;       // 滑模增益: 取 1.5~2 倍 ω_max·ψf
    float w_lpf;         // EEMF 低通截止角频率 [rad/s], 约 ω_max/3
    float bnd;           // 饱和函数边界层(额定电流 2%~5%)
    float ii_a, ii_b;    // 估计电流 î
    float ea, eb;        // LPF 后的 EEMF
    float th, w;         // 输出: 电角度 θ̂ [rad] / 电角速度 ω̂ [rad/s]
    float kp, ki, intg;  // PLL PI
} smo_t;

static inline float satf(float x, float b) {          // 边界层饱和函数(抗抖振核心)
    if (x >  b) return  1.0f;
    if (x < -b) return -1.0f;
    return x / b;                                     // 层内线性, 层外饱和 ±1
}

void smo_init(smo_t *s, float rs, float ls, float fc) {
    s->Rs = rs;  s->Ls = ls;  s->Fc = fc;
    s->k_slide = 0;  s->w_lpf = 0;  s->bnd = 0.1f;    // 参数由电机标定后填入
    s->ii_a = s->ii_b = s->ea = s->eb = 0;
    s->th = 0;  s->w = 0;  s->intg = 0;
}

// 每控制周期调用一次: val = [vα vβ](施加电压), ial = [iα iβ](实测电流)
void smo_step(smo_t *s, const float val[2], const float ial[2], float Ts)
{
    /* ① 电流误差 = 滑模面 s = i − î */
    float ea_err = ial[0] - s->ii_a;
    float eb_err = ial[1] - s->ii_b;

    /* ② 开关项: 饱和函数代替 sign(k·sat(e/Δ)), 抑制抖振 */
    float za = s->k_slide * satf(ea_err, s->bnd);
    float zb = s->k_slide * satf(eb_err, s->bnd);

    /* ③ 电流观测器(前向欧拉): dî/dt = (v − Rs·î + z)/Ls */
    s->ii_a += Ts * (val[0] - s->Rs * s->ii_a + za) / s->Ls;
    s->ii_b += Ts * (val[1] - s->Rs * s->ii_b + zb) / s->Ls;

    /* ④ 一阶低通提取等效控制(≈EEMF): ê = z/(τs+1) */
    float al = s->w_lpf * Ts;                         // 离散化系数(w_lpf·Ts ≪ 1)
    s->ea += al * (za - s->ea);
    s->eb += al * (zb - s->eb);

    /* ⑤ PLL: ε ≈ ψf·ω·sin(θ−θ̂), PI 调零 → ω̂;再积分 → θ̂ */
    float eps   = -s->ea * cosf(s->th) - s->eb * sinf(s->th);
    s->intg    += s->ki * eps * Ts;                   // PI 积分支路
    s->w        = s->kp * eps + s->intg;              // ω̂(已平滑, 直接给速度环)

    /* ⑥ θ̂ 积分 + LPF 相位滞后补偿 arctan(ω·τ), τ = 1/w_lpf */
    float comp  = atanf(s->w / s->w_lpf);             // 相位补偿角(随转速变化)
    s->th      += (s->w + comp * s->w_lpf) * Ts;      // 近似: 把补偿并入积分速率
    while (s->th >= 6.2831853f) s->th -= 6.2831853f;  // wrap 到 [0, 2π)
    while (s->th <  0.0f)       s->th += 6.2831853f;
}

/* 调参口诀(按顺序):
   1) k_slide = 2·ω_max·ψf 过大抖振/过小脱锁;  2) bnd = 0.02~0.05·额定电流;
   3) w_lpf ≈ ω_max/3, 降落快但滞后大;        4) PLL 带宽: kp/ki 由 2ζωn、ωn² 反解,
      ωn 取电流环带宽 1/5~1/2;                  5) 高速失步先查相位补偿是否生效 */
⚠️ 易错点:①三相欠采样误差会通过 î 反馈"教坏"观测器——电流采样偏置要先行校零(见 04-02 与 FOC 调参手册);②启动前 θ̂ 无意义,EEMF≈0 时 PLL 输出随机游走——必须配合第 8 节的启动策略;ψf 温漂不影响"到达滑模面",但影响 ε 的幅值标定,PLL 带宽设计要按最小 EEMF 校核。

6 MRAS 模型参考自适应:平滑但吃模型

6.1 参考模型 / 可调模型 / 自适应律与 Popov 直觉

是什么:MRAS(Model Reference Adaptive System)的思路是"用两个模型互相打脸":参考模型不含待估量 ω(纯电压方程积分出的磁链),可调模型含可调参数 ω̂(电流方程算出的磁链);两者输出的广义误差 ε 喂给自适应律,实时修正 ω̂ 直到两模型一致——一致时,可调模型里的 ω̂ 就等于真实转速。

参考模型:\ \psi_α = \int(v_α - R_s\,i_α)\,\mathrm{d}t,\quad \psi_β = \int(v_β - R_s\,i_β)\,\mathrm{d}t \qquad 可调模型:\ \hat{\psi}_α = L_s i_α + \psi_f\cos\hat{\theta},\ \hat{\psi}_β = L_s i_β + \psi_f\sin\hat{\theta}
自适应律:\ \varepsilon = \psi_β\hat{\psi}_α - \psi_α\hat{\psi}_β,\qquad \hat{\omega} = K_p\,\varepsilon + K_i\!\int\!\varepsilon\,\mathrm{d}t,\qquad \hat{\theta} = \int\!\hat{\omega}\,\mathrm{d}t

为什么敢用比例积分:Popov 超稳定性一句话直觉——只要前向通道正实、反馈通道满足 Popov 不等式,PI 形式的自适应律就能保证误差系统全局渐近稳定,不必为每个电机单独做李雅普诺夫证明。结构里没有开关切换,输出天然平滑无抖振,计算量比 EKF 小一个量级。

与 SMO 对比(面试常考):MRAS 平滑、噪声小;但参考模型的纯积分会漂移(直流偏置积分到天上,要用低通/高通替代或加复位),且两个模型都吃 Rs 精度——低速时电压小、电阻压降占比大,误差急剧恶化,所以 MRAS 同样是中高速方案,平滑性换来的是比 SMO 更强的模型依赖。面试怎么问:"MRAS 三个要素?为什么自适应律是 PI?它和 SMO 怎么选?"(要平滑低噪选 MRAS,要参数鲁棒选 SMO,低速都靠 HFI。)

⚠️ 易错点:MRAS 的 ε 叉积里隐含 ψf 标定——ψf 错了 ω̂ 有标度误差;"自适应"指的是参数在线修正,不是"对参数失配免疫",别混为一谈。

7 HFI 高频注入:零低速的最后一块拼图

7.1 零低速为什么基波方案集体失效:凸极效应救场

为什么:SMO/EKF/MRAS 全都靠 EEMF,而 EEMF 幅值 = ψf·ω——ω≈0 时信号本身消失,再好的观测器也只是放大噪声;同时零低速下逆变器死区压降、管压降这些非线性误差占比最大,S/N 双重崩塌。这就是"无感低速为什么难"的物理根源。出路:主动往电机里注入一个高频小信号,让电机自己变成传感器——位置信息不再来自反电动势,而来自凸极效应:内置式永磁电机(IPM)磁路不对称,Ld ≠ Lq(典型 Lq > Ld,凸极率 ρ = Lq/Ld ≈ 1.2~3),高频激励下的阻抗随转子位置角周期变化,高频电流响应里就调制着 2θ 信息。

高频阻抗:\ Z_d = R_s + j\omega_h L_d \;\neq\; Z_q = R_s + j\omega_h L_q \;\Rightarrow\; \text{注入响应含 } \sin 2\Delta\theta,\ \Delta\theta = \theta - \hat{\theta}
定子(IPM 电机截面) 转子(永磁体) d 轴 q 轴 凸极率 ρ = Lq/Ld > 1(IPM) 表贴式 SPM: ρ ≈ 1 → 无凸极,HFI 失效 d 轴:磁阻大 → Ld 小 q 轴:磁阻小 → Lq 大 注入 v_h 看响应 Δθ = θ − θ̂ 解调幅值 幅值 ∝ cos(2Δθ) Δθ = 0:幅值最大 → PLL 把 θ̂ 拉向 θ 二倍频特性: ±180° 有歧义, 靠磁饱和极性辨识消除
图④ HFI 凸极原理:IPM 的 Ld≠Lq 让高频响应随转子位置变化,解调出 sin2Δθ 信号即可锁相

7.2 脉振/旋转注入原理、噪声与损耗代价

怎么做:两种主流注入法:

i_q^{h}\cdot\sin(\omega_h t) \xrightarrow{\ \text{LPF}\ } \; \epsilon_h \approx K\,\frac{V_h\,T}{4}\left(\frac{1}{L_d}-\frac{1}{L_q}\right)\sin(2\Delta\theta) \;\xrightarrow{\;\text{PLL}\;}\; \hat{\theta} \to \theta

代价(缺点三连,面试必答):噪声与损耗:注入频率落在人耳听觉带,电机"啸叫"+附加铜损,家用/办公场景敏感;②带宽低:注入频率限制了位置环动态,一般只覆盖零低速;③依赖凸极:表贴式 PMSM(Ld≈Lq)理论无凸极,只能靠磁饱和引起的微弱凸极(凸极率 1.05 左右),信噪比差;±180° 歧义还要靠注入强脉冲辨识磁极极性(N-S 辨识)。

面试怎么问:"HFI 为什么需要凸极?表贴式电机怎么办?"——答:凸极提供位置相关的阻抗差;SPM 靠饱和凸极勉强可用,或改用 IF 开环启动(见 8.2);机器人关节常用 IPM,天然适配 HFI。

⚠️ 易错点:注入频率不是越高越好——要低于 PWM 开关频率的 1/10 且高于电流环带宽,否则解调失败;注入幅值过小信噪比差、过大发热啸叫,按"产生 5%~10% 额定电流的高频纹波"取值。

8 无感方案分段切换策略:全速域拼图

8.1 速段划分、滞环与角度渐变加权

怎么做:工业无感固件的标准架构是"低速 HFI + 中高速 SMO/EKF/MRAS + 切换带滞环与加权":

速段方案理由
零速~低速(0 ~ 5% ωN)HFI(或 IF 启动)基波无信号,只有"电机自传感"可用;静止也能定位
切换带(5% ~ 10% ωN)滞环 + 渐变加权两方案角度都有一定可信度,平滑交接避免力矩跳变
中高速(>10% ωN)SMO / EKF / MRASEEMF 信噪比充足;SMO 简单鲁棒,EKF 精度上限高

为什么切换带要滞环:单阈值切换在临界转速附近会"反复横跳"(升速刚切过去、减速刚切回来),造成 θ̂ 抖动甚至失步。用双阈值:升速到 ωhi 才切出 HFI,降速到 ωlo < ωhi 才切回,中间是保持区。带内再做角度/转速渐变加权:

\hat{\theta} = w\,\hat{\theta}_{HFI} + (1-w)\,\hat{\theta}_{SMO},\qquad w:\ 1 \to 0 \ \text{随 } \hat{\omega}\ \text{线性渐变},\qquad \Delta\theta = \mathrm{wrap}_{\pm\pi}(\hat{\theta}_{HFI}-\hat{\theta}_{SMO})\ \text{先 wrap 再加权}

易错点:加权前必须把两路角度差 wrap 到 ±π 再交叉插值,直接对 0~2π 原始值加权会在过零处瞬间飞掉;ω̂ 同理做凸组合。切换瞬间 PLL/HFI 内部状态(积分器)要预置到对侧值,避免交接后互相"拉扯"。

零低速:HFI 高频注入 (或 IF 开环启动兜底) 切换带 滞环+加权渐变 中高速:SMO / EKF / MRAS EEMF 信噪比充足, 观测器接管 转速 ω → 0 5% ωN 10% ωN 100% ωN(额定) 升速 ≥10%:切出 HFI(HFI 静默退后台) 降速 ≤5%:切回 HFI(滞环 5%, 防临界抖动) 带内: θ̂ = w·θ̂_HFI + (1−w)·θ̂_SMO(w 随 ω 线性渐变, 角度差先 wrap ±π) 判定源可用 ω̂、EEMF 幅值或 EKF 的 P 矩阵置信度
图⑤ 无感全速域切换策略:低速 HFI → 切换带滞环渐变 → 中高速基波观测器,双阈值防临界振荡

8.2 混合方案框图与 IF 开环启动兜底

混合方案一页纸框图(自上而下读):ADC(ia ib)→Clark→(vα vβ, iα iβ)→[HFI 模块|SMO 模块]→切换器(滞环+加权)→θ̂ ω̂→Park/速度环→SVPWM。两个观测器并行后台运行、切换器只选输出,是商用固件最常见的实现——比"跑一个才启动一个"平稳,代价是算力(选型时可参考第 9 节大表的计算量行)。TI 的 InstaSPIN-FAST 则是另一种思路:单一观测器同时输出磁链/角度/转速/转矩,靠观测器内部自适应跨速段(资源卡 R2)。

IF(Current-Frequency)开环启动——无凸极时的兜底:开关磁阻电机、表贴式 PMSM(HFI 凸极信号太弱)或算力跑不动 HFI 的场合,经典做法是:

1定向
d 轴通恒流,转子吸到已知位置(有抖动)
2开环拖动
θ̂ 按斜坡强制旋转,iq 给恒定拖动电流
3加速
频率斜坡上升,靠电流矢量"拖着"转子走
4切换
到切换转速且 EEMF 可信后,SMO 闭环接管

IF 启动简单可靠,但带载能力弱、负载突变或惯量大时可能失步、转向必须预先已知——机器人关节(高减速比、负载惯量反射到转子侧小)恰好是 IF 启动的舒适区,这也是很多关节驱动"上电抖一下"的来源。面试怎么问:"无感启动有哪些方案?各自适用什么电机?"——HFI(凸极 IPM,可带载静止启动)、IF(通用兜底,轻载)、V/F 开环(风机泵类)、复合式(零低速 HFI + 高速观测器)。

⚠️ 易错点:IF 拖动阶段 iq 给小了拖不动(丢步反转),给大了切换瞬间转矩跳变——工程上按"能拖动负载惯量的最小电流 + 斜坡时间 ≥ 机电时间常数"整定;切换条件不能只看转速,要等观测器角度收敛(如 EEMF 幅值超阈值且 PLL 锁定标志置位)。

9 观测器对比大表:一张表选型

选型没有"最好",只有"最合适"。下表把本页六个观测器按 9 个维度对齐(行 = 维度,列 = 观测器),面试与选型都建议记结论列:

维度龙伯格KF(线性)EKFSMOMRASHFI
适用速段有测量时全速段(估不可测状态)同左(线性系统)中高速(基波无感)中高速(基波无感)中高速(基波无感)零速~低速专属
被估状态任意线性状态(含 TL)线性状态 + 转矩等增广[id iq ω θ] 全套经 EEMF→PLL 得 θ̂ ω̂ω̂ θ̂(经磁链)θ̂(低速)+极性
计算量低(几十乘加)低~中(每拍 4×4 矩阵链)(几十乘加 + LPF + PLL)中(两模型 + PI)中(注入 + 解调 + PLL)
参数敏感性高(增益基于 A、B 精度)高(Q/R 也依赖模型)中(协方差可吸收部分失配)(滑模到达条件只需上界)高(纯积分漂移 + 双模型)中(取决于凸极率)
抗噪性取决于 L(快则噪)最优(高斯假设下)好(Q/R 可调)中(LPF/PLL 决定)好(天然平滑)好(相关双频解调)
抖振/副作用(需边界层抑制)啸叫 + 附加损耗
收敛动态极点配置决定K 随 P 自适应K 随 P 自适应,可发散到达滑模面后强收敛Popov 保证渐近PLL 牵引(慢)
实现复杂度★ 简单★★★★★★(调参项多)★★(约 60 行 C)★★★★★★(要调制/解调链)
典型应用负载转矩估计、编码器滤波多传感器融合、电量计高端无感伺服、导航无感 FOC 事实标准(风机/水泵/关节)无感方案备选、转速重构零速带载启动(电梯/牵引/IPM 关节)
📌 选型口诀:有编码器只估转矩/滤波 → 龙伯格或 KF;无感中高速看"算力换不换性能":算力够、要精度 → EKF;算力紧、要皮实 → SMO;要平滑低噪 → MRAS;零速带载启动 → 必须 HFI(有凸极)或 IF(兜底)。机器人关节 = IPM + 高动态,主流答案是 HFI + SMO 切换

10 工程落地要点:从仿真到真机的坑

10.1 采样与一拍延迟补偿,观测器与 FOC 的接口

怎么做:FOC 一拍流程是"采样 → 计算 → 下拍装载 PWM",电压矢量实际滞后计算值约 1.5 拍(采样半拍 + 装载一拍),高速时滞后角 ω·1.5Ts 不可忽略,直接吃掉电压裕量并让观测器输入失真。标准补偿:

\theta_{cmp} = \hat{\theta} + \omega \cdot 1.5\,T_s\ (\text{旋转坐标一拍延迟补偿}),\qquad \text{观测器输入用上一拍实际输出电压 } v_{k-1}

与 FOC 电流环的接口:观测器是 FOC 流水线里的"编外一环"——θ̂ 喂给 Park/逆 Park 变换当坐标基准(有传感器时这一格是编码器),ω̂ 喂给速度环做反馈;反过来,观测器吃 FOC 的实际输出电压(指令值经死区补偿后)和相电流采样。顺序上观测器必须在 Park 变换之前算完 θ̂,所以它和电流环挤在同一个高优先级中断里,20kHz 下的时间预算通常只有几微秒——这就是 SMO 在 MCU 上比 EKF 更常见的原因。

10.2 参数 Rs/L 失配的影响、在线辨识一句话与启动失败排查

为什么:观测器的"标尺"就是电机参数。Rs 偏大 → 低速时电阻压降占比大,θ̂ 出现系统性超前/滞后偏差(带载能力下降);L 偏差 → 影响 EEMF 提取相位与 HFI 解调系数;ψf 温漂 → 影响幅值标定与转矩常数。易错点:这些是模型误差,调 Q/R/带宽只能"掩盖"不能"消除"。在线辨识一句话:利用电压方程残差做递推最小二乘(RLS)辨识 Rs/L(静止注入法标定 + 温升模型修正是工程折中),辨识值周期性刷新观测器参数,即可把参数失配从"系统性偏差"压成"慢变小扰动"。

🧯 启动失败/失步排查八步(按概率排序):极对数 p 配错(θ̂ 与真实 θ 成整数倍偏差,电机嗡嗡不动或抽动);②相序/电流采样偏置错(Clark 后波形畸变,观测器全错);③Rs/Ls 标定值与实物不符(温升后 R 漂移可达 30%~40%);④IF 启动电流太小拖不动(丢步)或斜坡太快;⑤切换条件过早(EEMF 未建立就切 SMO,必失步);⑥PLL 带宽过宽(低速毛刺当转速)/过窄(加速跟不上);⑦注入参数不当(幅值小信噪比差、频率过高解调失败);⑧一拍延迟未补偿,高速带载力矩掉、过流失步。排查顺序:先静态(编码器对拍 θ̂)→ 再空载启动 → 最后带载,一次只改一个参数。

面试怎么问:"观测器在 FOC 里的位置和时序?高速时角度为什么变差?"——前者答"θ̂ 供 Park 变换、ω̂ 供速度环,与电流环同中断级";后者答"死区/延迟占比上升 + LPF 滞后角增大,需 1.5 拍旋转补偿与相位补偿联动"。

11 面试高频问答:先背框架,再背细节

以下 6 题是"观测器/无感 FOC"方向的必考题(与本站题库 06-11 保研复试面试题库 中 yk-09 无感 FOC、xk-04 观测器两题互为补充,先做题库建立问题地图,再用本页把每题答深)。

Q1. SMO 的抖振是怎么产生的?怎么抑制?
抖振来自理想 sign 开关项在滑模面两侧的高频切换,叠加离散采样后表现为 EEMF 上的高频毛刺。抑制四板斧:①sign 换成饱和函数/sigmoid 引入边界层(宽度取额定电流 2%~5%,层内线性、层外饱和);②滑模增益 k 按需取(过小到不了滑模面、过大加剧抖振),可做自适应 k;③LPF 滤毛刺并用 arctan(ω·τ) 补相位滞后;④进阶用超螺旋等高阶滑模,把不连续项移进导数。面试加分点:主动指出"边界层内已不是严格滑模,是连续近似"。
Q2. EKF 跑着跑着发散了,可能是什么原因?怎么排查?
按概率排:①P 失去对称正定(用对称化 P=(P+Pᵀ)/2 或 Joseph 形式更新);②Q 太小滤波器过度自信/或 R 太小盲信噪声;③初值差、P₀ 太小(放大 P₀);④Rs/L/ψf 参数失配(温升漂移);⑤测量野值未剔除(残差卡方门限);⑥步长/离散化误差。工程预防:限制 K 上限、协方差限幅、残差门限跳过更新、定期重置 P。答出"发散 = 协方差与真实误差脱钩"这个本质即超越多数候选人。
Q3. HFI 为什么需要电机有凸极(Ld≠Lq)?表贴式怎么办?
HFI 的位置信息不来自反电动势,而来自"高频阻抗随转子位置变化"——只有 Ld≠Lq,注入响应才含 sin2Δθ 调制项;Ld=Lq 时阻抗与位置无关,注入等于白注。表贴式 PMSM 理论凸极率≈1,只能利用磁饱和引起的微弱凸极(信噪比差),或放弃 HFI 改用 IF 开环启动/强注入做 N-S 极性辨识。IPM(凸极率 1.2~3)是 HFI 的舒适区,机器人关节多 IPM,天然适配。
Q4. 观测器(或 PLL)的带宽/极点怎么选?越快越好吗?
不是。观测器极点配置成比闭环主导极点快 3~5 倍即可,同时受两个约束:①不能超过采样频率的 1/10(离散化失真);②增益越大对测量噪声越敏感,θ̂ 毛刺会直接进 Park 变换变成力矩纹波。PLL 带宽参考:电流环带宽的 1/5~1/2,低速毛刺大降带宽、加速跟踪差升带宽。核心答法:"收敛速度与噪声抑制是一对矛盾,按'比控制环快、比噪声慢'取中间"。
Q5. 无感控制在零低速为什么难?有哪些对策?
双重原因:①可观测信号 EEMF 幅值 ∝ ω,零低速时信号物理性消失;②死区/管压降等逆变器非线性在低电压下占比最大,S/N 双崩。对策:零低速用 HFI(凸极 IPM,静止可定位,代价是噪声/损耗/带宽);表贴或无凸极用 IF 开环启动(轻载兜底);或零低速直接不开环、接受"死区"(某些风机泵类只中高速启动)。
Q6. SMO 提取角度为什么用 PLL 而不直接 arctan?切换策略为什么要滞环?
arctan 三宗罪:低速信噪比差时除法放大噪声、跨 2π 需解包裹有跳变毛刺、ω̂ 还要差分再放大噪声。PLL 把相位跟踪变成闭环:误差 ε≈ψf·ω·sin(θ−θ̂) 小角度下线性,PI 调零即锁定,输出 θ̂ 平滑且 ω̂ 白送,相当于对相位又做了一次低通。滞环同理是防"临界转速反复横跳":升速到 ω_hi 才切出、降速到 ω_lo<ω_hi 才切回,带内角度加权渐变(角度差先 wrap ±π),避免 θ̂ 跳变造成力矩冲击。

12 本节自测

1. 龙伯格观测器的估计误差 e = x − x̂ 满足 ė = (A − LC)e。要让估计收敛,必须保证什么?
💡 解析:误差动态由 (A − LC) 决定,特征值配置在左半平面误差才指数收敛;可观测性 (A,C) 是存在这样的 L 的前提。L 不是越小越好——L 大收敛快但放大测量噪声(2.2 节的折中)。
2. 卡尔曼滤波中,想让估计更快跟踪"负载突变",应该怎么调 Q(过程噪声)?
💡 解析:Q 代表"模型有多不准"。Q 大 → 稳态增益 K 大 → 信测量 → 跟踪快但噪声直达输出;这是 3.1 节"信模型还是信测量"的口诀。P₀ 调小反而让初始阶段更不信任测量,收敛更慢。
3. SMO 误差到达滑模面后,开关项的"等效控制"在物理上等于什么?
💡 解析:滑模面上开关项的均值恰好顶替了模型中被略去的 EEMF 项(5.2 节),EEMF 相位锁定转子角度,经 LPF + PLL 解调出 θ̂ ω̂——这正是 SMO 能无感的原因。Rs·i 与 Vdc 都在观测器方程中显式出现,不是被估计的未知项。
4. 某关节采用表贴式 PMSM(Ld ≈ Lq),零速带载启动时最适合的无感方案是?
💡 解析:零速 EEMF≈0,SMO/MRAS 全部失效(5.2 节与 Q5);HFI 依赖凸极 Ld≠Lq,表贴式凸极率≈1 无有效信号(7.1 节);IF 启动不依赖任何电机凸极特性,是通用兜底(8.2 节),代价是轻载适用、转向需已知。
5. 无感 FOC 在"HFI 与 SMO 两种方案的切换带"设计滞环(双阈值)的直接目的是?
💡 解析:单阈值在临界转速会"反复横跳"(8.1 节):升速到 ω_hi 才切出、降速到 ω_lo < ω_hi 才切回,中间保持区配合角度渐变加权(角度差先 wrap ±π),实现平滑交接。死区补偿是 10.1 节的另一件事,与滞环无关。
6. 关于 EKF 用于 PMSM 无感(状态 [id iq ω θ]),下列说法正确的是?
💡 解析:EKF 的核心是雅可比线性化(4.1 节);与 SMO 不同,ω、θ 是 EKF 的增广状态,无需外挂 PLL(这是两者关键差异,面试常问);P 矩阵对角线是估计误差方差,可当置信度用于切换判据(8.1 节),并非无用。
📌 本节小结:①观测器 = 模型 + 测量 + 误差反馈,把不可测的 θ、ω、TL、ψ 从电压电流里"算"出来,无感 FOC 与负载转矩估计是两大动机;②龙伯格立骨架(误差动态 ė=(A−LC)e,极点快 3~5 倍,收敛 vs 噪声折中),KF 加噪声统计(Q 信测量、R 信模型),EKF 用雅可比啃下 PMSM 非线性并一次给出 ω̂ θ̂;③SMO 用滑模把电流误差砸到零、开关项均值即 EEMF,LPF+相位补偿+PLL 输出 θ̂ ω̂,抖振用边界层抑制;④MRAS 双模型 + PI 自适应律(Popov 保证),平滑但吃参数;⑤零低速基波全灭,EEMF∝ω 是物理根源,HFI 靠凸极 Ld≠Lq 补位;⑥全速域 = 低速 HFI + 中高速 SMO/EKF/MRAS + 滞环与角度渐变加权,真机还要过"一拍延迟补偿、参数失配、启动排查"三关。
🤔 思考题: 1. 人形机器人膝关节(高减速比谐波 + IPM 电机)要做全速域无感,你会选哪套观测器组合?切换带放在额定转速的百分之几?为什么谐波减速器的反射惯量让 IF 启动变容易?
2. 机器人负载是"时变惯量"(手臂伸屈改变 J),这对 EKF 的 Q 矩阵和 3.2 节的 TL 观测器各提出什么要求?
3. 如果给你一块 STM32G431(170MHz FPU)和一块无 FPU 的 M0,分别你会把 EKF 和 SMO 部署在哪块上?算力之外还要考虑什么(定点误差、调试手段)?

13 参考来源与延伸资源

📌 配套站内页:本页是站内"观测器"唯一的体系页,建议与 02-11 FOC 调参整定实战手册(电流环/编码器校准,观测器的输入端)、06-11 保研复试面试题库(yk-09 无感 FOC、xk-04 观测器问答)、04-16 现代控制理论(状态空间/分离原理前置)、04-18 ADRC 自抗扰(把"扰动观测"推到极致的下一篇)连读。以下外部资源均经检索核实可访问(2026-09)。
📗
⭐ Kalman and Bayesian Filters in Python(rlabbe,免费全书)
GitHub 19k+ star 的开源教材:14 章 Jupyter Notebook 全部可运行,覆盖 KF/EKF/UKF/粒子滤波,主打"建立直觉而非证明",CC BY 4.0 免费。本页第 3、4 节的最佳配套读物,3.1 节的 Q/R 直觉即源于此书讲法。
GitHub 开源书 ⭐ 强烈推荐 KF/EKF 中级
📘
⭐ TI SPRUHJ1:InstaSPIN-FOC 与 InstaSPIN-MOTION 用户指南(FAST 观测器)
TI 官方文献(SPRUHJ1I,2021 修订):详述工业级 FAST 观测器如何同时估计磁链/角度/转速/转矩,以及无感启动与参数辨识(Motor Profiler)的工程细节,是"商用无感固件怎么做"的第一手参考(第 8.1 节混合方案提到过)。
TI 官方文档 ⭐ 工业视角 无感FOC 高级
🛠️
ST X-CUBE-MCSDK:STM32 电机控制软件开发套件(含状态观测器无感)
ST 官方 MCSDK(MCSDK 6.x):PMSM FOC 固件库 + Motor Control Workbench 配置工具,官方特性明确支持"无传感器运行(状态观测器)"与观测器+PLL 架构;配套 Motor Pilot 上位机可实时看 θ̂/ω̂ 波形,适合把本页算法"点灯"验证。
ST 官方 状态观测器 中级
📐
MathWorks:Discrete-time Luenberger Observer 模块文档
Simulink 官方参考页:离散龙伯格观测器模块的定义、方程与使用条件(可观测系统),配套 Simscape Electrical 的"Observers"专题还有磁链观测器等电机专用观测器,把第 2 节公式落到仿真验证。
MathWorks 官方 龙伯格 入门~中级
📄
⭐ 知乎专栏:彻底吃透滑模观测器(PMSM 无感算法:理论精讲+推导+算法+调参)
知乎口碑最好的 SMO 系统性长文:从滑模变结构原理讲到完整推导、离散实现与调参,算法已在 Speedgoat 硬件上验证,凸极/非凸极电机均适用——与 5.1~5.5 节逐节对照着读,推导盲区全补齐。
知乎专栏 ⭐ 推导最全 SMO 中级
📄
知乎专栏:滑模观测器(SMO)关键点解析和调参指导
实操向:详解 SMO 滑模增益、LPF 截止频率、边界层的调整方法,呼应 5.3 节"抖振 vs 精度"折中,看完就知道调参旋钮各管什么。
知乎专栏 SMO 调参 中级
📄
知乎专栏:使用"自适应"滑模观测器升级你的普通 SMO
进阶向:自适应滑模增益如何同时缓解抖振与相位滞后,甚至省掉一阶低通——对应 5.3 节"抖振三板斧"第三板,面试聊到 SMO 改进方向时引用。
知乎专栏 自适应SMO 高级
📄
知乎专栏:扩展卡尔曼滤波器实例与推导(附 GitHub 代码)
EKF 核心思路——非线性系统在估计点雅可比线性化后套用 KF——的完整推导 + 可运行实例,适合把 4.1 节的公式骨架走一遍代码。
知乎专栏 EKF 推导 中级
📄
CSDN:扩展卡尔曼滤波 EKF 在 PMSM 无位置传感器控制上的运用详解(αβ 系建模)
从 αβ 坐标系建模出发讲 EKF 无感实现的系列文章,与本页 4.1 节 dq 系建模互为对照(两种坐标系选型本身就是一道面试题)。
CSDN 博客 EKF 无感 高级
📄
CSDN:永磁同步电机无感 FOC 滑模观测器(SMO)完整笔记
章节完整:滑模变结构基本原理 → 传统二阶滑模观测器 → 全阶滑模观测器 → 反正切位置估计,"全阶 SMO"与"arctan vs PLL"两处可作为 5.4 节的延伸。
CSDN 博客 SMO 原理 中级
🎬
⭐ B站:SMO 滑模观测器入门(Sliding Mode Observer,本科毕设友好)
2 万+播放的入门视频:不用深数学先讲清"误差→开关→EEMF→角度"的因果链,适合读 5.1~5.3 节卡壳时换脑子;同 UP 主还有完整理论推导篇。
B站视频 ⭐ 入门首选 SMO 入门
🎬
B站:无感 FOC 滑模观测器仿真讲解(反正切 + PLL 两种位置提取)
Simulink 仿真演示,把 5.4 节"arctan vs PLL"的对比做成了可复现实验,能直观看到 arctan 方案在噪声下的毛刺。
B站视频 仿真实战 中级
🎬
⭐ B站:(SMO + 高频脉振方波注入)FOC 矢量控制全速域方案
把本页第 7、8 节拼成完整方案的视频实现:中低速 SMO + 零低速脉振方波 HFI + 加权切换,正好是图⑤切换策略的活教材。
B站视频 HFI + SMO 切换 高级
📘
Microchip AN1292:PMSM 无感 FOC + PLL 位置/速度估计器(应用笔记)
大厂应用笔记视角:SMO/EEMF 提取 + PLL 估计器的完整工程描述与实现要点,可作为本页 5.4 节 PLL 部分的"第二信源"交叉验证。
Microchip 官方 PLL 估计器 中级
📚
教材章节推荐(Nise / Norman 观测器部分,不附链接)
《Control Systems Engineering》(Norman S. Nise)与《Automatic Control Systems》(Farid Golnaraghi / Benjamin C. Kuo)中"State-Space Design / Observers"章节:龙伯格观测器的严格定义、可观测性判据与极点配置例题——本页第 2 节的教科书出处,保研复试问概念时按教材口径作答最稳。
教科书 观测器理论 中级