滑模观测器SMO在无感FOC中的工程实战解析

发布时间:2026/10/24 2:51:34
滑模观测器SMO在无感FOC中的工程实战解析

1. 为什么选滑模观测器这条路

1.1 有位置传感器方案,到底要付出什么代价

先更正一个标题里的字:项目标题写的是“滑膜观测器”,电机控制圈里一般叫“滑模观测器”,英文是 sliding mode observer,简称 SMO。“滑膜”大概率是输入法顺手带出来的错别字,行业里也有人这么叫,知道是同一个东西就行。

我最近在一套某跨平台无感FOC驱动项目里,就用这个算法做三相永磁同步电机的无传感器控制,也就是把编码器、霍尔之类的位置传感器省掉,直接用电流、电压信息估算转子位置和转速。这篇属于实际项目复盘,适合正在折腾FOC,或者刚接触无传感电机驱动的工程师。会从选型思路、数学模型、离散化代码、参数整定、故障排查几个方面,把 SMO 这条技术路线讲透。

先说为什么要去掉传感器。电机上装霍尔或者编码器,表面看只是多一个器件,实际上牵一发动全身。霍尔方案的问题是角度分辨率太低,通常只有 60° 电角度的换相精度,FOC 要跑得顺,依赖连续的高分辨率角度,霍尔只能拿来辅助启动和粗略换相;编码器精度高,但安装时要考虑轴承端同轴度、码盘防污染、线束屏蔽,稍不注意就会引入位置跳变。

更现实的成本压力在量大、价低的场合。风机、水泵、压缩机这类负载,对动态响应要求不高,但对器件成本和长期可靠性非常敏感。一个合格编码器的采购价可能比主控芯片还贵,加上线束、接插件、装配工时,一台设备的成本至少多十几块。而且安装传感器的轴伸变长,机械结构可靠性下降,在振动、高低温环境下码盘容易失效。所以“无传感器控制”不是炫技,是这一类应用降本增效的硬需求。

1.2 无传感技术方案横向对比

无传感器控制并不是只有 SMO 一条路,业界常用的还有高频注入法、磁链观测器、模型参考自适应等。选型之前一定要分清应用场景,否则很容易在低速性能或者算法复杂度上踩坑。

方案适用转速段依赖的核心物理量主要优点主要缺点
高频注入法零速、低速电机的凸极率(Ld、Lq差异)零速带载能力较好在表贴式电机上信号弱,实现复杂
滑模观测器中高速反电动势,即永磁磁链与转速乘积算法简单、鲁棒性强、参数依赖少零速、极低速基本失效,有抖振
磁链观测器中高速定子磁链模型中高速性能稳定低速因电阻压降占比大将失真
MRAS辨识中高速电机全参数模型理论成熟对参数误差很敏感,调参难度高

这个项目最终选 SMO,是因为目标负载是风机和水泵,属于平方转矩特性,启动阶段不需要满转矩输出。用很简单的 I/F 强拖策略把电机从零速带起来,转速一旦超过额定转速的 5%~10%,反电动势质量就已经足够好,SMO 立刻能接管。这种组合实现成本极低,代码量也最小,后续维护压力小。

SMO 最令人欣赏的地方在于鲁棒性。它内部自带一个滑模切换结构,对外部扰动、参数变化、负载突变有很强的抑制能力,电机电感、磁链参数偏离估算值几十个百分点时,观测器依然能稳定输出角度。这一点在批量生产中特别重要,因为每台电机的参数不可能完全一致,如果算法对参数太敏感,产线一致性就会成为灾难。

2. 先把滑模观测器的数学模型吃透

2.1 静止坐标系电压方程和反电动势信息

在聊代码之前,必须先理解 SMO 到底在观测什么。三相PMSM在一个电角度周期内,定子绕组感应的反电动势波形是正弦变化的,反电动势里面天然携带转子的位置信息。

三相PMSM在αβ静止坐标系下的定子电压方程可以写成:

uα = Rs·iα + Ls·(diα/dt) + eα
uβ = Rs·iβ + Ls·(diβ/dt) + eβ

其中,uα、uβ是αβ轴电压,iα、iβ是αβ轴电流,Rs是定子电阻,Ls是定子电感,eα、eβ是反电动势分量。反电动势的具体表达式为:

eα = -ψf·ωe·sin(θe)
eβ = ψf·ωe·cos(θe)

ψf 是永磁磁链,ωe 是电角速度,θe 就是我们要估的转子电角度。可以看到,只要能把 eα、eβ 提取出来,角度信息就在“反正切”这一层等着你。

但是电压方程里,电流微分项和反电动势项是耦合在一起的。反电动势不是一个直接测量量,它被包裹在电流动态之中。传统思路是拿电流做状态量构造观测器,再把包含反电动势的部分当作扰动项来处理。滑模观测器的核心思想,就是利用一个不连续的切换项把反电动势“逼”出来。

2.2 滑模面、切换函数与等效连续控制

滑模控制里的“滑模面”,可以理解成一条让系统轨迹必须贴上去运行的轨道。在SMO里,我们拿电流估算值与实际采样值的误差来构造滑模面,即:

sα = iα_hat - iα
sβ = iβ_hat - iβ

当估算电流与实际电流相等时,s = 0,系统进入滑模运动。为了把状态“压”到滑模面上,控制律选为符号函数形式:

vα = K·sign(sα)
vβ = K·sign(sβ)

这里 K 是滑模增益。把这个切换量代入电流观测方程,就构成完整的SMO结构。当系统进入滑模运动后,电流误差恒等于零,为了维持这个状态,切换项的低频等效值必须“抵掉”反电动势项,也就是说,从数学上看,等效控制输入在数值上等于反电动势的相反值。

这地方有一个理论到工程的关键转换点:直接拿高频开关控制量去算角度,会得到全是毛刺的结果。因为符号函数输出的是 ±K 的高频跳变,而不是平滑的正弦波。工程上的标准做法是拉一个低通滤波器,把高频开关分量滤掉,取其低频连续分量,这个分量在滑模运动阶段就等价于反电动势。这也是为什么 SMO 总是和低通滤波器成对出现的原因。

2.3 角度解算与低通滤波相位补偿

拿到滤波后的反电动势估算值 eα_est、eβ_est 之后,最朴素的角度解算是直接反正切:

θe = atan2(-eα_est, eβ_est)

这个公式本身没问题,但实际工程中我强烈建议别直接裸用。原因很简单:反正切对噪声非常敏感,尤其在反电动势幅值还被低通滤波器衰减之后,信噪比会进一步变差。估算出来的角度一抖,电流环解耦就会出问题,表现出来就是电流畸变和转速波动。

更稳的做法是在反正切之后,再串一个锁相环(PLL)来平滑角度和转速。PLL 的本质是一个以角度误差为输入、以估算转速为积分输出的闭环调节器,等效于一个低通滤波加一个频率跟踪器。PLL 调得好,角度波形会非常干净,转速信号也可以直接用它输出的估算转速,不需要再做额外差分。

低通滤波必然带来相位滞后。这个滞后在低速时可能不明显,转速一上去,滞后对应的电角度误差会越来越大。以50Hz电频率、1kHz截止频率的一阶低通滤波器为例,滞后角大约为 atan(50/1000) ≈ 2.86° 电角度,看起来不大;但如果电频率到了 500Hz,滞后就变成 atan(500/1000) ≈ 26.6°,已经足以让磁场定向明显偏轴,输出电流浪费在d轴上,带载能力急速下降。

所以完整的 SMO 角度输出必须做相位补偿。补偿量一般包含两部分:一是低通滤波器的滞后角 atan(ωe/ωc),二是数字控制器固有延时造成的一个载波周期左右的滞后,可以近似为 ωe·Td。实际调试时,角度补偿值最好做成随估算电角速度变化的查表函数,而不是固定一个常数。

3. 从数学到代码:离散化实现与参数整定

3.1 电流采样、标幺化和坐标变换

SMO 的输入是静止坐标系下的电压和电流,所以代码第一步是处理好电流采样和坐标变换。三相电流采样最常见的是双电阻或者三电阻方案,通过 ADC 同步采样得到 ia、ib、ic,然后做 Clarke 变换得到 iα、iβ。

有一个容易踩的坑是电流采样时序。如果 ADC 不是在 PWM 载波中心时刻触发采样,采样点很可能落在开关管开关瞬间附近,电流信号上叠着很强的开关噪声,滑模观测器会把这种噪声当作有效信号去“跟踪”,结果就是估算角度高频抖动。硬件上一定要让 ADC 与 PWM 中心对齐,软件上采样完成后立刻执行观测器和电流环计算,这样可以最大程度减小控制延时。

电流标幺化处理也很重要。我在项目里习惯先把原始 ADC 值换算成实际的安培数,也就是除以采样电阻、运放增益、ADC 满量程电压之后再乘回满量程电流值,后续所有运算都用实际物理单位。虽然很多框架推荐全部用标幺值,但 SMO 调试阶段还是物理单位更直观。等算法调通了,再整体改成标幺化适配不同功率的电机。

3.2 滑模观测器核心代码实现

下面这段代码是 SMO 在电流环中断里执行的核心流程,对应一阶后向欧拉离散化,运行频率一般是 PWM 频率,也就是10kHz。伪代码中把每一个物理量的含义都标注出来,方便直接对照公式移植。

/* 滑模观测器单步计算,PWM中断周期执行,Ts为中断周期 */ /* 1. 电流采样与Clarke变换 */ i_alpha = (2.0f/3.0f) * (ia - 0.5f*ib - 0.5f*ic); i_beta = (2.0f/3.0f) * (SQRT3_2*ib - SQRT3_2*ic); /* 2. 观测器状态方程离散化:预测电流 */ ialpha_hat += (Ts / Ls) * (u_alpha - Rs*ialpha_hat - v_alpha); ibeta_hat += (Ts / Ls) * (u_beta - Rs*ibeta_hat - v_beta); /* 3. 电流误差与滑模切换项:用sat()代替sign()抑制抖振 */ e_ialpha = ialpha_hat - i_alpha; e_ibeta = ibeta_hat - i_beta; v_alpha = Kslide * sat(e_ialpha, boundary); v_beta = Kslide * sat(e_ibeta, boundary); /* 4. 一阶低通滤波提取等效反电动势分量 */ e_alpha_est += 2.0f * PI * lpf_freq * Ts * (v_alpha - e_alpha_est); e_beta_est += 2.0f * PI * lpf_freq * Ts * (v_beta - e_beta_est); /* 5. 反正切+PLL平滑电角度,输出theta_est和转速 */ theta_raw = atan2f(-e_alpha_est, e_beta_est); pll_err = e_beta_est * cosf(theta_est) - e_alpha_est * sinf(theta_est); pll_freq += pll_ki * pll_err; theta_est += pll_kp * pll_err + pll_freq * Ts; /* 6. 低通滤波相位补偿 + 控制延时补偿 */ theta_comp = theta_est + atanf(pll_freq / (2.0f*PI*lpf_freq)) + pll_freq * delay_s; /* 7. 回到-π/π区间,供Park变换使用 */ theta_elec = wrap_angle(theta_comp);

代码里我特意用 sat() 饱和函数代替符号函数 sign(),这是消除滑模抖振最直接的手段。在误差很小的边界层以内,输出连续变化而不是硬跳变,电流谐波和噪声会明显改善。代价是边界层太大会损失等效反电动势的幅值精度,工程上 boundary 一般取额定电流的 5% 左右,再细调。

3.3 电流环、转速环PI初值计算

SMO 本身是一门需要“喂干净误差信号”的算法,电流环响应太慢、相位裕度不够,观测器看到的电流误差就可能被控制器动态淹没。所以我习惯先把电流环调稳,再调 SMO。电流环 PI 参数可以用内部模型控制方法快速定初值:

Kp = Ls · ωc
Ki = Rs · ωc

其中 ωc 是电流环带宽,单位为 rad/s。对于10kHz PWM,采样周期 100us,电流环带宽取 1000Hz 左右比较合适,也就是 ωc ≈ 6283 rad/s。假设电机参数为 Rs = 0.2Ω,Ls = 0.5mH,可以得到 Kp ≈ 3.14 V/A,Ki ≈ 1256 V/(A·s)。离散 PI 运算时要注意 Ki 要乘 Ts,避免离散化之后积分数值爆炸。

转速环带宽建议取电流环带宽的 1/10 到 1/5。以某电机额定转速 3000rpm、极对数 4、永磁磁链 0.05Wb、转子惯量 1.2e-4 kg·m² 为例,转速环增益可以先按 Kp = J·ωn / (1.5·p·ψf) 估算。选定转速环带宽 ωn = 20Hz = 125.6 rad/s 时,Kp ≈ 0.050 N·m/(rad/s)。实际工程中还要折算成“转速误差对应 q 轴电流指令”的标幺值,但初值的量级就是这样确定下来的。先给这个初值,再在台架上微调,会比用试凑法快很多。

3.4 启动策略与切换逻辑

SMO 在零速和极低速下基本失效,因为它依赖反电动势幅值,而反电动势正比于转速。转速为零时反电动势为零,观察器根本没有有效信息。所以实际工程必须辅以开环启动。我用的是 I/F 强拖策略:给定 q 轴电流幅值,同时让电角度按一定斜率强制递增,电流环自己完成角度追踪,转子被拖着同步旋转起来。

启动流程大致是这样:上电先做转子初始位置对齐,施加一个固定方向的直流矢量,持续 200ms 左右,让转子稳定吸合到零度位置附近,这一步能避免上电瞬间反转。然后 Iq 给定一个合适的电流幅值,电角度按目标加速度斜坡增加,转速逐渐抬升。当转速超过额定转速的 5% 到 10% 时,反电动势已经有足够强度,此时比较估算角度和开环给定角度,如果两者偏差持续在 15° 电角度以内,并维持几十毫秒,就可以平滑切换到 SMO 闭环。

切换瞬间最容易出问题的地方是电流给定突然跳变。开环强拖用的是固定限幅电流,速度闭环要求的是实时负载电流,两者可能相差很大。我的做法是做一个二三十毫秒的斜坡过渡,让 q 轴电流从开环给定值平滑地变成速度环输出值,避免切换瞬间电流冲击触发过流保护。

4. 台架实测:常见故障定位与处理

4.1 启动阶段反转一抖

启动时转子先抖一下甚至直接反向转一下,这个问题我在无感FOC项目里遇到不下三次。最核心的原因通常是上电初始角度对齐没有做好。转子静止在未知角度时,SMO 是睁眼瞎的,如果开环强拖的初始角度和实际角度恰好接近反相,一开始的电流矢量会把转子往相反方向拉,出现“一抖”。

解决方法是把直流对齐时间加长,对齐电流设置为额定电流的 30% 左右。需要确认对齐电流方向与采样相序一致,否则你以为给的是正方向,实际是反方向,问题只会加严重。还有一种情况是机械负载太重,对齐电流产生的电磁转矩不足以克服静摩擦转矩,这时要适当增加对齐电流,或者做两次不同方向的脉冲喷射来定位。

4.2 带载抖动与失步

中速带载时电机出现高频抖动,甚至伴随啸叫,通常有两条排查路径。第一是滑模增益不足,Kslide 取值一定要满足可达性条件,也就是 K 必须大于当前反电动势幅值。反电动势幅值等于 ψf·ωe,转速越高需要的 K 越大。如果 K 是固定值,低速段还好,高速段就可能因为增益不足导致估算角度滞后加重,转速波动越来越明显。经验做法是让 Kslide 随估算电角速度线性增长,再加一个小偏置,即 K = K0 + K1·|ωe|。

第二是低通滤波器截止频率太高。截止频率太高时,滤波后的反电动势信号里残留大量高频切换纹波,这些纹波进入 PLL 后会让角度轻微抖动,进而映射成电流波动。但截止频率太低又会让相位滞后变大。我一般先按电频率上限的 1.5 到 2 倍来设置截止频率,然后观察角度波形,再微调。

4.3 高速失步与角度补偿不足

高速段突然丢同步,是比较让人头疼的故障。现象通常是加速到某个转速之后电机突然声音发闷,电流过冲,然后触发过流或失步保护。这时候别急着怀疑 SMO 本身,先检查角度补偿量是否到位。

前面讲过,一阶低通滤波器的相位滞后会随着电频率升高而快速变大。假设电频率从 100Hz 升到 500Hz,截止频率只有 500Hz 时,滞后角从 about 11° 升到 45°。45° 电角度的定向偏差意味着 q 轴电流很大一部分被分解成了 d 轴电流,转矩输出急剧下降,速度环为了维持转速只能继续加 q 轴电流,最终电流饱和,系统彻底失控。

处理方案是把相位补偿做成随转速变化的前馈查表,并且在高速段监测估算 d 轴电流的均值。d 轴电流均值如果持续明显偏大,说明角度可能偏了,要及时修正补偿量或者降低加斜率。调试时如果手头有编码器,可以把编码器角度和估算角度同时录波,直接在示波器上观察两者差值,一眼就能看出补偿是否足够。

4.4 故障排查速查表

故障现象可能原因快速检查手段修复建议
上电反转一抖转子初始位置未知/对齐不充分录对齐电流波形,看转子是否稳定停位加长对齐时间,增大对齐电流,可做脉冲喷射定位
低速抖动滑模增益太小、LPF带宽过高查看e_alpha/e_beta波形是否干净Kslide随转速自适应,LPF截止频率调低
带载失步角度补偿不足、速度环过激进编码器与估算角度差值录波动态角度补偿,降低速度环带宽
高速电流畸变电流环相位滞后大、采样时序不对查看PWM与ADC采样点对齐情况确保中心对称采样、电流环带宽留裕度
母线电压波动时过流没有做母线电压前馈加速瞬间看母线电压跌落波形电压环加入前馈,电流指令限幅斜坡化

5. 几个值得长期保存的工程经验

5.1 调试顺序与工具习惯

在这类项目里踩过几次坑之后,我总结出一条最重要的经验:调试无感 FOC,顺序比技巧更关键。必须先保证电流环稳定、电流波形干净,再调 SMO 角度观测,最后才调速度环动态。电流环都不稳,后面一切都是空中楼阁。

调试时一定要用好录波工具。不要只看转速和电流的均值,要看瞬时值,尤其在切换瞬间和加减速过程中。我会在软件里预留一个内部变量观测通道,把 eα、eβ估计值、估算角度、开环角度、d 轴电流全部通过调试接口实时上传,然后用上位机录波。很多偶发问题在波形上是有预兆的,比如角度波形上出现毛刺,或者d轴电流在稳态下有缓慢漂移,这些不录波根本发现不了。

5.2 算法之外容易被忽略的硬件细节

SMO 作为一个依赖反电动势的观测器,对采样信号质量非常敏感。硬件上要特别关注电流采样运放的带宽和噪声。有些低成本方案用高倍率运放,带宽不足,高频反电动势分量被运放直接滤掉,观测器在中高速段就会变得“迟钝”。采样电阻的精度、布局引入的寄生电感,也会影响电流波形质量。

此外,PWM 死区时间带来的电压误差对 SMO 影响很大。死区时间造成的输出电压畸变在低速低电压时占比很高,如果不做死区补偿,估算角度会叠加明显的 6 次抖动分量。如果项目预算允许,建议在算法里加入基于电流极性的死区补偿函数,或者至少在硬件上选用死区时间短、互补输出延迟一致的驱动芯片。

还有一个小技巧值得分享:验证观测器性能时,不要一上来就完全去掉传感器。我习惯在开发阶段保留编码器,把编码器角度和 SMO 角度同时送进录波器。这样可以在台架上快速区分“是观测器角度估算问题”还是“电流环/参数问题”,避免排错绕弯路。等到 SMO 在各种工况下都和编码器角度能够稳定贴合,再真正撤掉传感器做整机可靠性验证。

最后再提醒一句,SMO 的 Kslide、边界层、LPF 截止频率、PLL 带宽这四个参数是强耦合的,调任何一个都必须重新跑一遍全工况测试。我在项目中就吃过这个亏,只单独调大了 PLL 带宽,结果低速段角度抖动是改善了,但高速段噪声被放大导致高速带载失步。建议拿一张参数记录表,记录每一组参数在启动、中速、高速、突加减载四个场景下的表现,再做整体权衡。这样做虽然啰嗦,但能让你的调试过程不再“调好一个坑,又冒出一个新坑”。