做电机控制这几年,滑模观测器是我在无感FOC项目里用得最多的位置估计方案。它原理不复杂,但很多朋友拿到代码之后调不明白,问题往往出在只看了公式,没吃透公式背后的思路。这篇文章我把滑模观测器的原理推导完整走一遍,从PMSM的数学模型说起,一直到怎么从开关噪声里把转子角度捞出来,再结合FOC应用的工程细节,聊聊低通滤波、相位补偿、参数整定这些坑是怎么踩过来的。如果你正准备入门无感控制,或者正在调试滑模观测器但角度总是乱飘,这篇文章应该能省你几天时间。
1. 滑模观测器到底在“观”什么
1.1 无感控制的核心困境
做永磁同步电机(PMSM)矢量控制,正常情况下得时刻知道转子在哪。有编码器或旋变的时候这不是问题,但工业上很多场合装不了传感器,或者想省成本、提高可靠性,就必须走无感路线。无感控制的核心任务,是只靠母线电压和相电流,实时估计出转子的电角度和电转速。这两个量一旦估计偏了,电流矢量就会落在错误的d-q轴上,轻则力矩抖动,重则失控飞车。
滑模观测器是解决这个估计问题的一套经典方案。它在电机控制里被用得最广,一个关键原因是它不依赖电机的凸极率,对参数偏差也有不错的鲁棒性。也就是说,只要电机在中高速段运行,它都能给出相对稳定的角度估计。对很多刚切入无感控制的人来说,第一个能调通的位置观测器,多半就是滑模观测器。
1.2 为什么滑模的“脾气”适合做观测器
滑模控制的基本思路,用一句话概括:构造一个误差状态,再用一个不连续的切换控制律,把这个误差强制“拍”到一个预设的滑动面上,让系统状态沿着这个面滑行到零。它的特点是控制律和系统参数关系不大,输入只按误差符号来回切换,所以对外部扰动和内部参数变化有很强的抑制作用。
把滑模控制的思路用在观测器里,就是拿电流的真实测量值和观测值之间的误差来设计切换项。因为电流是我能测到的量,而反电动势和它耦合在同一个方程里,一旦把电流误差滑到零,切换项的平均效果就等价于反电动势,反电动势里又藏着转子角度。所以我总爱说,滑模观测器其实是在“利用”抖动,而不是“害怕”抖动——抖动的包络均值里,恰好带着位置信息。这个思路是后面整个推导的核心。
2. 推导前的数学准备:PMSM模型与反电动势
2.1 静止坐标系下的电压方程
无论什么观测器,推导第一步都从电机模型开始。PMSM在α-β静止坐标系下的电压方程是:
u_α = R·i_α + L·di_α/dt - ψ_f·ω_e·sin(θ_e)
u_β = R·i_β + L·di_β/dt + ψ_f·ω_e·cos(θ_e)
其中R是相电阻,L是相电感(这里按表贴式电机处理,认为L_d = L_q = L),ψ_f是转子磁链,ω_e是电角速度,θ_e是转子电角度。
把方程中不含电流导数的项整理出来,定义成反电动势:
e_α = -ψ_f·ω_e·sin(θ_e)
e_β = ψ_f·ω_e·cos(θ_e)
于是电压方程可以改写成电流导数显式的形式:
di_α/dt = (u_α - R·i_α - e_α) / L
di_β/dt = (u_β - R·i_β - e_β) / L
这个改写非常关键。它说明:电流变化率由三部分决定——电压、电阻压降、反电动势。如果能用一个观测器重构这条电流动态方程,反电动势就成了方程里的“未知输入”,需要被估计出来。
2.2 反电动势是位置信息的载体
看反电动势的两个分量,正弦和余弦正好对应同一个角度θ_e。也就是说,转子电角度被编码在了反电动势两个分量的比值里。得到反电动势后,位置可以直接用反正切算出:
θ_e = atan2(-e_α, e_β)
同时反电动势幅值等于ψ_f·ω_e,和转速成正比,所以转速也能还原:
ω_e = √(e_α² + e_β²) / ψ_f
到这里,问题就很清晰了:无感控制的本质,变成如何准确估计反电动势的两个分量。而滑模观测器就是专门干这件事的。电角速度和机械转速之间还差一个极对数换算,具体实现时别忘了除一下极对数p,不然调试时会发现转速怎么都对不上。
3. 核心推导:从电流误差到转子角度
3.1 观测器方程怎么搭
既然电流动态方程已知,我就可以构造一个“影子系统”。把反电动势项替换成一个待设计的切换输出v_α、v_β,得到观测器方程:
dî_α/dt = (u_α - R·î_α - v_α) / L
dî_β/dt = (u_β - R·î_β - v_β) / L
这里的关键点是,切换输出v要设计成电流观测误差的函数。当电流观测值和实际值完全一致时,v必然等于真实的反电动势。反过来,只要把误差调节到零,我就能从v里拿到反电动势信息。
定义电流观测误差:
s_α = î_α - i_α
s_β = î_β - i_β
用观测器方程减去真实方程,得到误差动态方程:
ds_α/dt = (-R·s_α + e_α - v_α) / L
ds_β/dt = (-R·s_β + e_β - v_β) / L
注意,这个误差方程里已经不含电压u了,它只受反电动势e和切换输出v控制。这给后面的设计省了很多麻烦。从物理意义上理解,电流观测误差的来源就是“未知的”反电动势没有被正确建模,而我用切换项v去“顶替”这个未知量,剩下的工作就是确保这个顶替是收敛的、稳定的。
3.2 滑模面设计与可达性验证
滑模设计的第一个任务是选滑动面。这里最自然的选择就是让电流误差为零,即:
s_α = 0,s_β = 0
切换控制律取符号函数形式:
v_α = k·sign(s_α)
v_β = k·sign(s_β)
接下来必须验证,这个控制律能不能把系统状态“推”到滑动面上。我习惯用李雅普诺夫函数验证。取V = (s_α² + s_β²) / 2,求导得到:
dV/dt = s_α·ds_α/dt + s_β·ds_β/dt
= (-R·(s_α² + s_β²) + e_α·s_α - k·|s_α| + e_β·s_β - k·|s_β|) / L
第一项永远小于等于零,后面每一项要求e·s - k·|s| < 0。要使不等式恒成立,只需k > |e|。也就是说,只要滑模增益k大于反电动势峰值,dV/dt就严格为负,系统状态一定进入滑模。这就是为什么滑模增益不能太小——它不是靠积分凑出来的,是靠“大力出奇迹”把误差压到零。
这里还要补充一点:上面的李雅普诺夫验证是在连续时间域做的,数字实现时虽然结论不变,但k需要留足裕量,因为离散化会带来延迟,理论上k > |e| 只是必要条件,实际中我通常留20%到50%的裕量。
3.3 等效控制:抖动的信号里藏着什么
进入滑动模态后,电流误差被强制保持为零。此时从平均意义上讲,切换输出必须“恰好替代”反电动势的位置。用等效控制的概念来描述:令误差动态方程等于零,解出v:
v_eq = e
这里的v_eq指的是切换信号在滑动面附近的等效平均值。也就是说,反电动势等于符号函数输出经过低通滤波后的结果:
ê_α = LPF(k·sign(s_α))
ê_β = LPF(k·sign(s_β))
这个式子就是整个滑模观测器的“成品公式”。符号函数产生的是高频开关信号,低通滤波器把开关频率分量滤掉,剩下的低频分量就是反电动势。我经常跟人开玩笑说,滑模观测器是把反电动势藏在“开关噪声”里,再用滤镜把它找出来。这里有个容易混淆的概念:不是切换信号本身光滑,而是它在一个PWM周期内的平均作用等于反电动势,低通滤波只是把平均作用物化出来而已。
3.4 转子位置和转速的最终提取
拿到反电动势估计值ê_α、ê_β之后,最直接的位置提取方式是用atan2:
θ̂_e = atan2(-ê_α, ê_β)
转速则用幅值法:
ω̂_e = √(ê_α² + ê_β²) / ψ_f
不过工程上我更推荐用锁相环(PLL)方式提取,而不是直接atan2和幅值法。原因有两个:一是atan2对噪声敏感,反电动势估计值里有一点毛刺,角度就会跳;二是用atan2算转速还需要额外求幅值和微分,噪声会被二次放大。PLL把角度误差经过PI调节器直接输出转速,再积分出角度,相当于一个闭环跟踪器,滤波效果更好。
PLL的实现思路是这样的:构造参考向量与估计角度的叉乘作为误差信号。实际操作中,我会先把估计角度θ̂旋转回d-q系,计算q轴反电动势分量e_q,当θ̂逼近真实角度时e_q趋近于零。用公式表达就是:
e_q = -ê_α·sin(θ̂) + ê_β·cos(θ̂)
当θ̂ ≈ θ_e时,e_q ≈ |e|·sin(θ_e - θ̂) ≈ |e|·(θ_e - θ̂),这个信号可以直接送给PI调节器,PI输出就是电角速度ω_e,ω_e积分得到连续的角度θ̂。PLL的带宽要单独整定,带宽太高会引入噪声,太低会动态滞后。我一般取电机电频率的五分之一到十分之一,兼顾跟踪速度和滤波效果。
4. 应用到FOC之前,必须处理的三个工程细节
4.1 低通滤波一定会带来相位滞后
理论推导里,反电动势是从低通滤波器输出端拿到的,但低通滤波器会引入相位滞后。一阶低通滤波器的相频特性是:
φ = atan(ω_e / ω_c)
其中ω_c是滤波器截止角频率。如果截止频率取1kHz,电频率是200Hz,相位滞后就是atan(200/1000),大约11.3度。对FOC来说,角度误差超过几度,力矩效率都会明显下降,所以这个滞后必须补偿。
补偿的方法是在估计角度上加上滞后角:θ_comp = θ̂_e + φ。由于滞后角随电频率变化,最好的做法是实时查表或者用公式计算。很多简化方案固定补偿一个角度,这在窄调速范围里能用,宽范围就很勉强。实际调试中我一般把截止频率取在额定电频率的3到5倍,滞后角用当前估计转速实时算,效果明显比固定补偿好。还要注意,如果滤波器用二阶或更高阶,相位滞后公式要相应变化,二阶滤波器在穿越频率附近的滞后接近两倍,这一点容易被忽略。
4.2 滑模增益k的选择逻辑
滑模增益k的选择遵循两条原则:一是必须大于反电动势峰值,否则滑模面不可达,等于白做;二是不能过大,否则切换信号幅度大、抖振严重,还容易放大电流采样噪声。
反电动势峰值的估算很简单:ψ_f·ω_e_max。工程上常用两种做法:一种是根据额定转速和磁链常数算出固定值,再加20%裕量;另一种是做成自适应k = k0 + k1·|ω̂_e|,低速时增益低一些,高速时增益自动抬高。自适应方案在宽调速范围项目中非常值得用,能兼顾低转速下的噪声抑制和高转速下的收敛性。但自适应引入了一个隐患:转速估计本身有延迟,如果负载突变引起转速骤变,k的更新速度跟不上,短时间内可能出现滑模面不可达的情况。所以实际工程里我会给k做一阶低通平滑,再参与计算。
需要强调一点:k太小会出现“滑不起来”的现象,电流误差收敛不到零,反电动势估计值幅度偏小,角度会跟着不准。这个坑我踩过不止一次,调k的时候一定要用示波器或调试器观察电流误差波形,而不是只看最终角度。
4.3 用饱和函数消除高频抖振
教科书里的符号函数,理想情况下是完美的,但数字实现时切换频率受PWM频率限制,符号函数会产生大幅高频抖振,这些抖振经过反电动势提取后会污染角度信号。工程上几乎都用饱和函数代替符号函数:
v = k·sat(s/φ)
其中φ是边界层厚度。当误差s在[-φ, φ]范围内时,输出是连续的线性比例值;超出范围才变成符号函数。边界层越厚,抖振抑制作用越强,但等效控制精度会下降,相当于把滑模面“软化”了。这个软化的本质是把理想滑动面换成了实际上的准滑动面,系统状态在边界层内做不到严格为零,而是围绕零附近做小幅度波动,波动幅度和φ直接相关。
边界层厚度的选取要和电流采样噪声匹配。我常用的经验值是让φ大致等于电流采样噪声幅值的2到3倍,再用仿真或者实测微调。边界层太小,饱和函数基本等于符号函数,抖振没有改善;边界层太大,反电动势估计值会出现明显比例偏差,角度会整体偏移。总之,这是个在抖振和精度之间找平衡的参数,没有绝对标准,得在具体平台上摸。
5. 实测调试经验与常见坑
5.1 调k的完整流程
先把PI参数和角度提取部分屏蔽,直接观察电流误差s_α、s_β和反电动势估计值ê_α、ê_β。运行时给电机一个固定转速,逐渐增大k,直到电流误差波形变成一条窄带,并且ê_α看上去像干净的正弦波。如果ê_α波形失真,多半是k不够或者饱和函数边界层太小。k再继续增大,波形会开始出现明显毛刺,说明增益过头了。这个临界点附近取1.2倍左右,就是比较合适的k。
然后整定低通截止频率。截止频率越高,相位滞后越小,但反电动势里的开关纹波越明显;截止频率越低,滤波越狠,但滞后越大。我的习惯是先按额定电频率的5倍设初值,再看角度波形抖动情况适当下调。调完这两个参数,最后才去动PLL带宽。顺序不能反,因为PLL带宽会掩盖前面环节的问题,一旦后面换了电机或者运行工况,老问题又会冒出来。
5.2 低速段的启动策略
滑模观测器有个天生短板:反电动势幅值与转速成正比,转速越低,信噪比越差。到了几十转以下,反电动势被采样噪声和死区效应淹没,滑模观测器基本失效。所以实际系统通常不会让滑模观测器从零转速一直干到高速,而是用其他方式启动。
常见的启动方案是I-f启动。让电流矢量以固定幅值旋转,强制电机旋转到一定转速,再平滑切换到滑模观测器控制。切换时要注意两点:一是切换时刻电流相位要与估计角度对齐,否则会出现力矩冲击;二是增益不要突变,最好在几百毫秒内渐变,让观测器平滑接管。还有一种更简单但体验一般的方式是强制定位后再进入闭环,低速段扭矩优势不明显,但很多低成本项目也在用。不管哪种方式,启动段和运行段之间的过渡逻辑一定要做成状态机,明确划分定位、加速、切换、正常运行几个阶段,否则现场很容易在临界转速附近反复振荡。
5.3 常见问题速查表
| 现象 | 可能原因 | 处理思路 |
|---|---|---|
| 角度整体偏大或偏小 | 低通滤波相位滞后未补偿 | 实时补偿atan(ω_e/ω_c) |
| 角度抖动、电流噪声大 | k过大或边界层过小 | 降低k、加大φ |
| 启动阶段飞车 | 切换时相位不对齐 | 对齐电流相位、渐变过渡 |
| 高速时角度误差增大 | 截止频率固定导致滞后变化 | 用估计转速计算实时补偿角度 |
| 反电动势波形有六次谐波 | 逆变器死区效应 | 加死区补偿或相应滤波 |
| 估计转速波动大 | 幅值法受噪声影响 | 改用PLL提取转速 |
| 轻载时角度漂移 | 反电动势幅值太小 | 降低k下限、提高采样精度 |
| 满载时失步 | k裕量不足 | 按峰值反电动势加50%裕量 |
5.4 我踩过的几个坑
第一,电机参数必须准确。滑模观测器号称鲁棒,但R和L不准会导致电流观测误差方程里混入额外项。我遇到过一次电机相电阻随温度漂了大约30%,低速端角度明显偏移,排查了很久才发现是参数问题。工程上至少要保证磁链常数ψ_f和相电感L的精度,这两个参数直接决定反电动势幅值和解算结果。如果现场没法做离线参数辨识,至少要在软件里留出参数标定接口,用自整定方法在线测一遍。
第二,采样同步很关键。电流采样必须在PWM中心时刻对准,否则噪声会直接进入电流误差。我见过不少案例,滑模观测器参数怎么调角度都抖,最后发现是电流采样窗口没对准,和PWM的中心对齐差了半个周期。这个坑很容易被忽视,因为波形看上去只是“有点噪声”,不会明显报错。
第三,PLL的比例增益不能太大。调PLL时很多人习惯用大P快速收敛,结果就是高频噪声全部通过,角度抖动。我的经验是PLL带宽取电机电频率的十分之一左右,动态和滤噪比较平衡。这一点尤其在低开关频率的平台上更敏感,IGBT大功率驱动器开关频率只有几kHz,PLL带宽如果整得过高,谐波会直接把角度带偏。
我个人在实际操作中的体会是,滑模观测器调稳之后,整台电机的控制手感会完全不一样。调试时最难的不是公式推导,而是把示波器上看到的每一个异常波形都能对应到具体环节里。别急着上复杂算法,先把增益、滤波、补偿这三样调干净,这套方案能应付绝大多数中高速应用。这个思路后续还可以向变速趋近律、低速注入融合的方向扩展,有机会我把这两块也展开聊。