是什么:状态观测器(State Observer)是一个跑在 MCU 里的"软件传感器"——它用能测到的量(电压 u、电流 i 等)和系统的数学模型,实时重建出测不到的状态(转子角度 θ、转速 ω、磁链 ψ、负载转矩 TL 等),记作 θ̂、ω̂("帽子"读作"估计值")。一句话:模型 + 测量 + 误差反馈 = 把不可测状态算出来。
为什么:FOC 需要转子电角度 θ 做坐标变换、速度环需要 ω、力控碰撞检测需要 TL、磁链观测需要 ψ——但在真实关节里,这些量都没有现成的传感器输出:
| 状态量 | 能否直接测 | 典型来源 / 问题 |
|---|---|---|
| 相电流 ia ib ic | ✅ 能测 | 采样电阻 + ADC,便宜可靠(但有噪声、增益误差) |
| 母线电压 Vdc | ✅ 能测 | 分压电阻 + ADC |
| 转子电角度 θ、转速 ω | ❌ 不能直接测 | 要编码器/旋变:贵、占轴向空间、多一条线缆、薄弱环节;机器人关节常用输出端编码器,转子侧仍无直接信息 |
| 永磁磁链 ψf | ❌ 不能直接测 | 随温度漂移,只能标定或在线辨识 |
| 负载转矩 TL | ❌ 不能直接测 | 关节力矩传感器很贵;常用"观测器估 TL"做碰撞检测 |
| 绕组温度 / Rt | ❌ 不能直接测 | 影响 Rs 取值,进而影响观测器精度 |
怎么做——两条路线:①装物理传感器(编码器/旋变/霍尔),简单可靠但每个关节多 30~100 元成本、多几毫米轴向长度、多一根 FPC/线缆,人形机器人 30~40 个关节就是一笔不小的开销和可靠性负担;②无传感器(Sensorless,简称"无感"):完全用算法从电压电流里"算出"θ̂ 和 ω̂——这就是本页主角。除无感 FOC 外,观测器还广泛用于负载转矩估计(碰撞检测/自适应控制)、磁链与温度估计、滤波测速(编码器微分噪声大,用观测器代替差分)。
面试怎么问:"什么是状态观测器?为什么无感 FOC 需要它?无感能完全取代编码器吗?"(答:低速带载场景仍不能——见第 7、8 节。)
是什么:龙伯格(Luenberger)观测器是线性系统的全维状态观测器,结构最简单:拿同一个模型照着对象"跑一份拷贝",把输出误差 y − ŷ 通过增益 L 反馈回模型,把拷贝"拽"回真实轨迹。后续的卡尔曼、SMO,骨架都是它,只是"怎么算反馈增益、怎么处理噪声/非线性"不同。
怎么做:设线性系统 ẋ = Ax + Bu,y = Cx(状态方程,见 04-16)。观测器用同样的 A、B 仿真,再加一个输出误差校正项:
定义估计误差 e = x − x̂,两式相减(Ax − Ax̂ = Ae,测量项 Cy − Cx̂ = Ce),得到误差动态方程:
这一行就是观测器的灵魂:只要矩阵 (A − LC) 的所有特征值都在左半平面(负实部),误差就指数收敛到零,收敛快慢由这些极点决定。增益 L 就是干这件事的"旋钮"——不猜、不凑,直接配置极点。
怎么做:给 (A − LC) 配极点就是选观测器的"带宽"。为什么是折中:
可观测性是前提:若 (A, C) 不可观测,任何 L 都救不回来——某些状态在输出里根本没留"痕迹"。工程上常用 Ackermann 公式或直接解 Sylvester 方程求 L(MATLAB place() / estim(),见 MathWorks 观测器文档,资源卡 R4)。
面试怎么问:"观测器增益 L 怎么选?极点配得越快越好吗?"——标准答案必须答出噪声放大这一半,只答"快就是好"是典型减分项。
分离原理(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 两组极点的并集"。
是什么:卡尔曼滤波(KF)是线性、高斯噪声假设下的最优状态观测器。和龙伯格"增益 L 拍死"不同,KF 的增益 K 每拍根据误差协方差 P 现场计算:模型可信(预测准、P 小)就少听测量,模型发散(P 大)就多听测量。它是"龙伯格 + 噪声统计"的升级,也是 EKF 的地基(系统性学习推荐资源卡 R1:rlabbe 免费在线书,直觉讲解第一)。
怎么做——Q 和 R 的调参直觉(面试和工程都最常考):
| 参数 | 物理意义 | 调大 / 调小的后果 |
|---|---|---|
| Q:过程噪声协方差 | "模型有多不准":建模误差、负载突变、参数漂移等未被模型描述的扰动 | Q 大 → 信测量:响应快、跟随负载变化,但毛刺多;Q 小 → 信模型,平滑但滞后 |
| R:测量噪声协方差 | "测量有多不准":ADC 噪声、采样误差(可实测:静止时采电流算方差) | R 大 → 信模型:平滑、滤波强;R 小 → 信测量,噪声直达输出 |
| P:估计误差协方差 | 滤波器对"自己现在错多少"的内部判断 | 初值 P₀ 给大一些,让滤波器快速信任测量、缩短初始收敛 |
口诀:"信模型还是信测量"——Q 谁大听测量,R 谁大听模型。稳态时 K 趋于常数,KF 退化成一个增益固定的龙伯格观测器(这也是两流派在稳态下等价的直观理解)。
面试怎么问:"Q、R 怎么取?它们和龙伯格增益 L 什么关系?"(Q/R 定 K 的稳态值 = 定效 L;Q/R 之比决定滤波带宽。)
怎么做:机器人关节做碰撞检测常估 TL。把机械方程当"增广状态"纳入 KF:状态取 x = [ω, TL]T,测量 y = ωenc(编码器转速,已滤波)。模型(转动惯量 J、黏摩擦 B、转矩常数 Kt):
TL 建成"随机游走"(每拍加一点过程噪声 w)是观测器里的经典套路——把慢变量放进状态、用 Q 给它"呼吸权",KF 就能一边用电流推算理论加速度、一边从转速残差里把 TL 反解出来。这里的模型是线性的,直接用 3.1 两步公式即可,不需要 EKF。易错点:TL 的 Q_T 给太小 → 碰撞后估计爬升太慢,检测延迟;给太大 → 正常加减速也被误判成"碰撞"。面试怎么问:"没有力矩传感器怎么检测碰撞?"——增广状态 + KF 估 TL + 阈值/滑窗判据,是标准答题框架。
对象:恒值负载转矩 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⁻ |
|---|---|---|---|---|
| 1 | 1.0000+0.01 = 1.0100 | 1.0100/1.2600 = 0.8016 | 0 + 0.8016×(10.2−0) = 8.1762 | 0.1984×1.0100 = 0.2004 |
| 2 | 0.2004+0.01 = 0.2104 | 0.2104/0.4604 = 0.4570 | 8.1762 + 0.4570×(9.8−8.1762) = 8.1762+0.7421 = 8.9183 | 0.5430×0.2104 = 0.1142 |
| 3 | 0.1142+0.01 = 0.1242 | 0.1242/0.3742 = 0.3320 | 8.9183 + 0.3320×(10.1−8.9183) = 8.9183+0.3923 = 9.3106 | 0.6680×0.1242 = 0.0830 |
K 的收敛趋势与稳态值:K 依次为 0.8016 → 0.4570 → 0.3320,继续递推依次约 0.2712 → 0.2373 → 0.2171 → 0.1965 → 0.1878 → …,单调收敛到稳态 K∞ ≈ 0.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 节碰撞检测的调参依据)。
是什么:电机方程里有 sinθ、cosθ——天然非线性,KF 不能直接用。EKF(Extended KF)的做法:围绕当前估计点把非线性函数泰勒展开取一次项(雅可比矩阵),把非线性问题"局部线性化",然后照搬 KF 的两步。它是 PMSM 无感里精度上限最高的方案之一,代价是算力与调参负担。
怎么做:非线性系统 xk+1 = f(xk, uk) + w,yk = h(xk) + v,预测与更新中的 A、C 换成雅可比:
以 PMSM 无感为例(转子磁场坐标系 dq + 机械方程),状态取 x = [id, iq, ω, θ]T,输入 u = [vd, vq]T,连续状态方程(表贴式 Ld=Lq=Ls 时同理简化):
注意 ω、θ 都是状态——EKF 一次同时给出转速和角度,不需要额外 PLL(与 SMO 的关键差异)。测量方程 h(x) = [id, iq]T(H 是常数矩阵)。离散化用前向欧拉(xk+1 = xk + T·f),每拍重新算 4×4 雅可比 F(含 cosθ、sinθ 项),然后走 KF 两步。
协方差传播:预测步 P⁻ = F P FT + Q 描述"不确定性随模型扩散",更新步 P = (I−KH)P⁻ 描述"测量把不确定性压回去"。P 对角线就是各状态当前估计误差的方差——它能当作置信度输出(切换策略里判断"观测器可信度"的天然指标)。
Q/R 初值方法(工程套路):
发散排查清单(面试必背 + 现场救命):
定点数实现注意: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 算力与浮点支持要求高。
是什么:SMO(Sliding Mode Observer,滑模观测器)把"让估计误差归零"变成一个滑动模态问题:设计一个电流观测器,用大增益开关项把电流误差"砸"到零;误差为零时,开关项的等效控制恰好等于扩展反电动势(EEMF)——它里面藏着 θ。结构简单、计算量小、对参数不敏感,是商用无感固件(TI InstaSPIN 之外最常见的方案、ST MC SDK 标配)的主力,也是面试出题密度最高的观测器。
怎么做:在静止 αβ 坐标系下,PMSM 电流方程为(dq 方程经反 Park 变换):
照此搭一个电流估计器,把未知的 −e/L 项替换成开关项,并定义滑模面:
滑模存在条件(到达条件)s·ṡ < 0 → 只要 k 大于 EEMF 的幅值上界(k > max|ω ψf|,留 1.5~2 倍裕量),误差就会被"顶"在零面上滑动——这一步完全不用精确的 Ls、Rs 值,这正是 SMO 对参数不敏感的原因(龙伯格做不到)。面试怎么问:"SMO 的滑模增益 k 怎么取?"——答"k 按最高转速下的 EEMF 幅值 ωmaxψf 取裕量,过大加剧抖振、过小到达不了滑模面"。
为什么:误差滑到零后,开关项高频切换的等效(平均)值就是被它顶替的那一项:
EEMF 是个幅值 ∝ ωψf、相位锁定在 θ+90° 的正弦对——把它当"量角器"就有 θ。但开关原始输出是"高频毛刺+低频正弦"的混合,要一阶低通滤波(LPF)把毛刺滤掉:
滤波必然引入随转速变化的相位滞后,必须用 arctan(ω·τ) 在线补偿,否则 θ̂ 落后真实 θ,FOC 力矩系数下降、高转速时甚至失步。截止频率取低 → 毛刺小但滞后大;取高 → 反之。这是 SMO 调参的第一矛盾。易错点:补偿角随 ω 变——低速时≈0 可忽略,高速时不补就是系统性角度误差,表现为"转速越高、带载能力越差"。
是什么:理想 sign 函数在零面附近无限频开关,叠加离散采样,输出像"锯齿上骑正弦"——这就是抖振(chattering)。后果:EEMF 毛刺大 → LPF 被迫取低截止 → 滞后加重;还带来高频噪声、损耗、机械啸叫。怎么做:工程三板斧:
面试怎么问:"SMO 抖振怎么抑制?"——标准答案组合拳:边界层函数(sat/sigmoid)+ 合理 k + LPF 截止与相位补偿 + (加分)自适应增益或超螺旋。
为什么:拿到 (êα, êβ),最直接是 θ̂ = atan2(êβ, êα),ω̂ 再做差分。但:①低速时 EEMF 幅值小、信噪比差,除法/反正切把噪声放大;②atan2 结果要跨 2π 解包裹,毛刺直接窜进 θ̂;③ω̂ 由 θ̂ 差分而来,一次微分使噪声再放大 3dB 以上。所以工业实现全部用 PLL(锁相环):把"相位跟踪"变成闭环控制问题,相当于对相位误差做了一次低通:
ε 是"相位差 × 幅值"的误差信号,PI 把它调到零 → θ̂ 咬住 θ,PI 输出顺带就是平滑的 ω̂,一举两得。PI 带宽取"电流环带宽的 1/5~1/2、且低于采样频率 1/10":带宽高跟踪快但抖,带宽低平滑但动态滞后。面试怎么问:"为什么用 PLL 而不是直接 arctan?"——必须答出噪声抑制 + 无需解包裹 + 同时平滑得到 ω̂ 三点。
把 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) 高速失步先查相位补偿是否生效 */
是什么:MRAS(Model Reference Adaptive System)的思路是"用两个模型互相打脸":参考模型不含待估量 ω(纯电压方程积分出的磁链),可调模型含可调参数 ω̂(电流方程算出的磁链);两者输出的广义误差 ε 喂给自适应律,实时修正 ω̂ 直到两模型一致——一致时,可调模型里的 ω̂ 就等于真实转速。
为什么敢用比例积分:Popov 超稳定性一句话直觉——只要前向通道正实、反馈通道满足 Popov 不等式,PI 形式的自适应律就能保证误差系统全局渐近稳定,不必为每个电机单独做李雅普诺夫证明。结构里没有开关切换,输出天然平滑无抖振,计算量比 EKF 小一个量级。
与 SMO 对比(面试常考):MRAS 平滑、噪声小;但参考模型的纯积分会漂移(直流偏置积分到天上,要用低通/高通替代或加复位),且两个模型都吃 Rs 精度——低速时电压小、电阻压降占比大,误差急剧恶化,所以 MRAS 同样是中高速方案,平滑性换来的是比 SMO 更强的模型依赖。面试怎么问:"MRAS 三个要素?为什么自适应律是 PI?它和 SMO 怎么选?"(要平滑低噪选 MRAS,要参数鲁棒选 SMO,低速都靠 HFI。)
为什么:SMO/EKF/MRAS 全都靠 EEMF,而 EEMF 幅值 = ψf·ω——ω≈0 时信号本身消失,再好的观测器也只是放大噪声;同时零低速下逆变器死区压降、管压降这些非线性误差占比最大,S/N 双重崩塌。这就是"无感低速为什么难"的物理根源。出路:主动往电机里注入一个高频小信号,让电机自己变成传感器——位置信息不再来自反电动势,而来自凸极效应:内置式永磁电机(IPM)磁路不对称,Ld ≠ Lq(典型 Lq > Ld,凸极率 ρ = Lq/Ld ≈ 1.2~3),高频激励下的阻抗随转子位置角周期变化,高频电流响应里就调制着 2θ 信息。
怎么做:两种主流注入法:
代价(缺点三连,面试必答):①噪声与损耗:注入频率落在人耳听觉带,电机"啸叫"+附加铜损,家用/办公场景敏感;②带宽低:注入频率限制了位置环动态,一般只覆盖零低速;③依赖凸极:表贴式 PMSM(Ld≈Lq)理论无凸极,只能靠磁饱和引起的微弱凸极(凸极率 1.05 左右),信噪比差;±180° 歧义还要靠注入强脉冲辨识磁极极性(N-S 辨识)。
面试怎么问:"HFI 为什么需要凸极?表贴式电机怎么办?"——答:凸极提供位置相关的阻抗差;SPM 靠饱和凸极勉强可用,或改用 IF 开环启动(见 8.2);机器人关节常用 IPM,天然适配 HFI。
怎么做:工业无感固件的标准架构是"低速 HFI + 中高速 SMO/EKF/MRAS + 切换带滞环与加权":
| 速段 | 方案 | 理由 |
|---|---|---|
| 零速~低速(0 ~ 5% ωN) | HFI(或 IF 启动) | 基波无信号,只有"电机自传感"可用;静止也能定位 |
| 切换带(5% ~ 10% ωN) | 滞环 + 渐变加权 | 两方案角度都有一定可信度,平滑交接避免力矩跳变 |
| 中高速(>10% ωN) | SMO / EKF / MRAS | EEMF 信噪比充足;SMO 简单鲁棒,EKF 精度上限高 |
为什么切换带要滞环:单阈值切换在临界转速附近会"反复横跳"(升速刚切过去、减速刚切回来),造成 θ̂ 抖动甚至失步。用双阈值:升速到 ωhi 才切出 HFI,降速到 ωlo < ωhi 才切回,中间是保持区。带内再做角度/转速渐变加权:
易错点:加权前必须把两路角度差 wrap 到 ±π 再交叉插值,直接对 0~2π 原始值加权会在过零处瞬间飞掉;ω̂ 同理做凸组合。切换瞬间 PLL/HFI 内部状态(积分器)要预置到对侧值,避免交接后互相"拉扯"。
混合方案一页纸框图(自上而下读):ADC(ia ib)→Clark→(vα vβ, iα iβ)→[HFI 模块|SMO 模块]→切换器(滞环+加权)→θ̂ ω̂→Park/速度环→SVPWM。两个观测器并行后台运行、切换器只选输出,是商用固件最常见的实现——比"跑一个才启动一个"平稳,代价是算力(选型时可参考第 9 节大表的计算量行)。TI 的 InstaSPIN-FAST 则是另一种思路:单一观测器同时输出磁链/角度/转速/转矩,靠观测器内部自适应跨速段(资源卡 R2)。
IF(Current-Frequency)开环启动——无凸极时的兜底:开关磁阻电机、表贴式 PMSM(HFI 凸极信号太弱)或算力跑不动 HFI 的场合,经典做法是:
IF 启动简单可靠,但带载能力弱、负载突变或惯量大时可能失步、转向必须预先已知——机器人关节(高减速比、负载惯量反射到转子侧小)恰好是 IF 启动的舒适区,这也是很多关节驱动"上电抖一下"的来源。面试怎么问:"无感启动有哪些方案?各自适用什么电机?"——HFI(凸极 IPM,可带载静止启动)、IF(通用兜底,轻载)、V/F 开环(风机泵类)、复合式(零低速 HFI + 高速观测器)。
选型没有"最好",只有"最合适"。下表把本页六个观测器按 9 个维度对齐(行 = 维度,列 = 观测器),面试与选型都建议记结论列:
| 维度 | 龙伯格 | KF(线性) | EKF | SMO | MRAS | HFI |
|---|---|---|---|---|---|---|
| 适用速段 | 有测量时全速段(估不可测状态) | 同左(线性系统) | 中高速(基波无感) | 中高速(基波无感) | 中高速(基波无感) | 零速~低速专属 |
| 被估状态 | 任意线性状态(含 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 关节) |
怎么做:FOC 一拍流程是"采样 → 计算 → 下拍装载 PWM",电压矢量实际滞后计算值约 1.5 拍(采样半拍 + 装载一拍),高速时滞后角 ω·1.5Ts 不可忽略,直接吃掉电压裕量并让观测器输入失真。标准补偿:
与 FOC 电流环的接口:观测器是 FOC 流水线里的"编外一环"——θ̂ 喂给 Park/逆 Park 变换当坐标基准(有传感器时这一格是编码器),ω̂ 喂给速度环做反馈;反过来,观测器吃 FOC 的实际输出电压(指令值经死区补偿后)和相电流采样。顺序上观测器必须在 Park 变换之前算完 θ̂,所以它和电流环挤在同一个高优先级中断里,20kHz 下的时间预算通常只有几微秒——这就是 SMO 在 MCU 上比 EKF 更常见的原因。
为什么:观测器的"标尺"就是电机参数。Rs 偏大 → 低速时电阻压降占比大,θ̂ 出现系统性超前/滞后偏差(带载能力下降);L 偏差 → 影响 EEMF 提取相位与 HFI 解调系数;ψf 温漂 → 影响幅值标定与转矩常数。易错点:这些是模型误差,调 Q/R/带宽只能"掩盖"不能"消除"。在线辨识一句话:利用电压方程残差做递推最小二乘(RLS)辨识 Rs/L(静止注入法标定 + 温升模型修正是工程折中),辨识值周期性刷新观测器参数,即可把参数失配从"系统性偏差"压成"慢变小扰动"。
面试怎么问:"观测器在 FOC 里的位置和时序?高速时角度为什么变差?"——前者答"θ̂ 供 Park 变换、ω̂ 供速度环,与电流环同中断级";后者答"死区/延迟占比上升 + LPF 滞后角增大,需 1.5 拍旋转补偿与相位补偿联动"。
以下 6 题是"观测器/无感 FOC"方向的必考题(与本站题库 06-11 保研复试面试题库 中 yk-09 无感 FOC、xk-04 观测器两题互为补充,先做题库建立问题地图,再用本页把每题答深)。