这些年做电机控制调试,最经常被问到的就是:项目上能不能把编码器拿掉?拿掉之后位置和转速用算法从电流电压里“算”出来,到底靠不靠谱?在诸多无位置传感器方案里,基于反电动势的传统滑模观测器(SMO)加锁相环(PLL)的组合,是我个人最推荐先吃透的一条技术路线。它没有卡尔曼滤波那么重,也没有高频注入那么复杂,在中高速段性能扎实,对电机参数误差还有一定鲁棒性,非常适合表贴式永磁同步电机(SPMSM)的无传感器FOC项目落地。下面把这条链路拆开讲清楚:滑模观测器到底在观测什么、锁相环为什么比反正切好用、参数怎么调、从仿真挪到台架又会踩哪些坑。
1. 为什么无传感器控制选了传统滑模观测器这条路
1.1 去掉编码器要付的代价,和换来的东西
编码器这类位置传感器带来的麻烦,干过驱动的人都有体会:成本高、接线繁琐、端子振动损坏、温度漂移、电磁干扰误码,还会占用控制器资源。去掉它是降成本、提可靠性最直接的一步。但问题也很现实:PMSM的FOC需要转子电角度才能做Park变换,角度没了,转矩控制就无从谈起。无传感方案的思路是,利用电机本身的电气模型,从电流、电压里在线重构转子位置和转速。
市面上可选的路子不止一条:磁链观测器、模型参考自适应(MRAS)、扩展卡尔曼滤波(EKF)、高频信号注入、滑模观测器。真到了工程选型的时候,每个方案都有自己的脾气。我个人的判断是:如果项目对象是表贴式电机、运行范围集中在中高速、硬件主频和成本又卡得死,传统SMO加PLL是最稳的选择。它本质上是把“反电动势是转子位置的函数”这个物理事实用足,结构简单,计算量小,一个普通的MCU中断里跑完毫无压力。
下面是几种方案放在一起对比的感觉:
| 方案 | 适用速度段 | 复杂度 | 参数敏感性 | 主要短板 |
|---|---|---|---|---|
| 传统SMO | 中高速 | 低 | 较低 | 零低速失效、抖振 |
| 磁链观测器 | 中高速 | 低 | 高 | 纯积分漂移严重 |
| MRAS | 中高速 | 中 | 中 | 自适应律稳定性要反复调 |
| 扩展卡尔曼 | 全速域名义上 | 高 | 高 | 矩阵运算重、协方差难调 |
| 高频注入 | 零低速 | 高 | 低 | 额外损耗、噪音、带载能力受限 |
EKF看起来更“高级”,但工程上协方差矩阵的调参让人怀疑人生;高频注入要求电流采样带宽足够高,还要额外考虑高频损耗和电磁噪音。传统SMO在绝大多数低成本驱动器里反而是活得最久的那个。
1.2 传统SMO适合什么电机:先分清SPMSM和IPMSM
很多人把SMO拿去驱动凸极机,结果怎么调都不对,然后怀疑算法不行。这其实是电机模型没对上。传统SMO有个隐含前提:电机的交直轴电感近似相等,也就是表贴式电机(Ld = Lq = Ls)。此时在α-β静止坐标系下,电压方程里只有一组统一电感,非常干净。
如果用的是内置式永磁电机(IPMSM),d-q轴电感差别明显,电压方程里会多出交直轴电感差产生的耦合项。这时候直接用统一电感的传统反电动势模型,观测器会把那一部分耦合项当成扰动处理,位置误差就会偏大。所以做IPMSM无传感,要么走扩展反电动势(EEMF)的路子,把凸极效应折进反电动势里,再套用滑模思想;要么干脆用高频注入。本文后面的内容,如果没特别说明,默认讨论的是SPMSM。
2. 从电压方程到反电动势还原:滑模观测器在算什么
2.1 α-β静止坐标系下的PMSM电压方程
先摆模型。表贴式PMSM在α-β静止坐标系下的电压方程可以写成:
$$ u_{\alpha} = R i_{\alpha} + L_s \frac{d i_{\alpha}}{d t} + e_{\alpha} $$
$$ u_{\beta} = R i_{\beta} + L_s \frac{d i_{\beta}}{d t} + e_{\beta} $$
其中,$u_{\alpha}$、$u_{\beta}$ 是定子电压在α、β轴的分量,$i_{\alpha}$、$i_{\beta}$ 是定子电流分量,$R$ 是定子电阻,$L_s$ 是等效电感。这里的 $e_{\alpha}$、$e_{\beta}$ 就是反电动势,它才是我们真正想要的东西:
$$ e_{\alpha} = -\psi_f \omega_e \sin\theta_e $$
$$ e_{\beta} = \psi_f \omega_e \cos\theta_e $$
$\psi_f$ 是永磁体磁链,$\omega_e$ 是电角速度,$\theta_e$ 是转子电角度。反电动势的幅值正比于转速,相位里直接装着转子角度。所以问题的关键就变成:怎么从可测的电流和已知的电压里,把这两个反电动势分量给抠出来。
2.2 观测器构造:副本电流方程加滑模修正项
滑模观测器的做法很朴素。我把上面的电压方程搬一份出来,做一个“假电机”当副本,副本里的反电动势先用0代替,再额外加两个修正项 $v_{\alpha}$、$v_{\beta}$ 强迫副本电流去跟踪真实电流:
$$ \frac{d \hat{i}{\alpha}}{d t} = \frac{1}{L_s} \left( u{\alpha} - R \hat{i}{\alpha} - v{\alpha} \right) $$
$$ \frac{d \hat{i}{\beta}}{d t} = \frac{1}{L_s} \left( u{\beta} - R \hat{i}{\beta} - v{\beta} \right) $$
定义电流误差为滑模面:
$$ S_{\alpha} = \hat{i}{\alpha} - i{\alpha}, \quad S_{\beta} = \hat{i}{\beta} - i{\beta} $$
修正项 $v_{\alpha}$、$v_{\beta}$ 的使命,就是让滑模面收敛到0。系统一旦进入滑动模态,也就是 $S=0$ 且 $\dot{S}=0$,副本电流和实际电流完全一致,此时修正项的平均值就等于反电动势。这就是滑模理论里“等效控制”的概念。
电流误差的动态方程写完整一些是:
$$ \frac{d S_{\alpha}}{d t} = -\frac{R}{L_s} S_{\alpha} + \frac{1}{L_s} (e_{\alpha} - v_{\alpha}) $$
到了滑模面上,第一项因为 $S_{\alpha}=0$ 直接消失,剩下 $v_{\alpha} = e_{\alpha}$,$v_{\beta} = e_{\beta}$。所以滑模修正项里就藏着反电动势的信息。
2.3 到达条件与切换增益选择
修正项 $v_{\alpha}$、$v_{\beta}$ 通常取为:
$$ v_{\alpha} = K \cdot \operatorname{sign}(S_{\alpha}) $$
$$ v_{\beta} = K \cdot \operatorname{sign}(S_{\beta}) $$
$K$ 是切换增益。要让系统能到达滑模面,$K$ 必须压得住反电动势扰动,一般取:
$$ K > \max|\psi_f \omega_e| + \text{裕量} $$
如果 $K$ 取得太小,大负载一上来反电动势峰值一顶,滑模面就离开边界,观测器直接丢步。如果 $K$ 取得太大,sign函数的高频切换会带着抖振跑满整个系统,电流谐波、声音噪音、位置波动全来了。实际工程里,我先按额定转速下的反电动势峰值估算,再乘1.2到1.5的安全系数,上机以后再微调。
2.4 工程化改进:边界层饱和与低通滤波
直接用sign函数,离散系统里抖振特别明显。工程上第一件事就是把sign换成带边界层的饱和函数:误差在边界层内时,输出随误差线性变化,相当于一个高增益;误差超出边界层,再回到开关特性。边界层宽度 $\delta$ 一般取额定电流的2%到5%。
修正项经过低通滤波器之后,才会得到光滑的反电动势估计值。一阶低通的离散形式简单,实时性好:
$$ \hat{e}{\alpha}[n] = \hat{e}{\alpha}[n-1] + \omega_c T_s \left( v_{\alpha}[n] - \hat{e}_{\alpha}[n-1] \right) $$
$$ \hat{e}{\beta}[n] = \hat{e}{\beta}[n-1] + \omega_c T_s \left( v_{\beta}[n] - \hat{e}_{\beta}[n-1] \right) $$
注意,这个低通滤波器是有相位滞后的,后面调高速的时候会专门提它。
下面是这套核心逻辑在中断里跑的伪代码框架,方便你对照:
// SMO + LPF + PLL 核心伪代码,Ts为控制周期 float smc_sat(float err, float delta) { if (err > delta) return 1.0f; if (err < -delta) return -1.0f; return err / delta; } // 1. 电流采样经过Clarke变换后得到 i_alpha, i_beta // 2. 电压指令经过死区补偿后得到 u_alpha, u_beta // 滑模电流误差 float err_alpha = i_hat_alpha - i_alpha; float err_beta = i_hat_beta - i_beta; // 滑模修正项 float v_alpha = K_smo * smc_sat(err_alpha, delta); float v_beta = K_smo * smc_sat(err_beta, delta); // 电流观测器状态更新(前向欧拉) i_hat_alpha += Ts / Ls * (u_alpha - R * i_hat_alpha - v_alpha); i_hat_beta += Ts / Ls * (u_beta - R * i_hat_beta - v_beta); // 低通滤波提取反电动势 e_alpha += w_lpf * Ts * (v_alpha - e_alpha); e_beta += w_lpf * Ts * (v_beta - e_beta); // 锁相环提取角度和转速 float eps = -(e_alpha * cosf(theta_hat)) - (e_beta * sinf(theta_hat)); w_hat += ki_pll * Ts * eps; theta_hat += Ts * (w_hat + kp_pll * eps); // 相位补偿,w_lpf为一阶低通截止角频率 float theta_comp = theta_hat + atan2f(w_hat, w_lpf);这只是一个最小可运行框架,实际项目里还要有归一化、限幅、角度回绕处理,这些下面接着讲。
3. 锁相环如何把反电动势变成位置和转速
3.1 反正切法为什么不够用
拿到反电动势估计值之后,最直觉的做法是:
$$ \hat{\theta}e = \operatorname{atan2}(-\hat{e}{\alpha}, \hat{e}_{\beta}) $$
反正切算出来确实能用,但工程体验很差。一是反电动势信号经过低通滤波后本来就有相位滞后,反正切跟着滞后,高速时转矩直接打折;二是反正切对噪声敏感,反电动势稍微带点谐波,角度就来回跳;三是转速还得另外对角度微分或者再套一个低通,微分放噪声,低通又添延迟,系统阻尼很难把握。反正切适合快速验证算法逻辑,不适合做量产的性能指标。
锁相环的好处在于它是一个闭环跟踪器,角度和转速是同时解出来的,转速不再需要单独求导,角度也不会因为单个反电动势点的畸变而跳变,整体对噪声的抑制能力强得多。
3.2 锁相环的误差信号推导
锁相环的第一步,是构造一个误差信号,它要能反映估计角度和真实角度的差。利用前面反电动势的形式:
$$ \hat{e}{\alpha} = -\psi_f \omega_e \sin\theta_e, \quad \hat{e}{\beta} = \psi_f \omega_e \cos\theta_e $$
定义误差:
$$ \varepsilon = -\hat{e}_{\alpha} \cos\hat{\theta}e - \hat{e}{\beta} \sin\hat{\theta}_e $$
代入化简:
$$ \varepsilon = \psi_f \omega_e \sin(\theta_e - \hat{\theta}_e) $$
当估计角度接近真实角度时,$\sin(\theta_e - \hat{\theta}_e) \approx \theta_e - \hat{\theta}_e$,误差信号就近似正比于相位差。把这个误差送进PI调节器,PI的输出作为估计转速 $\hat{\omega}_e$,再对 $\hat{\omega}_e$ 积分得到估计角度 $\hat{\theta}_e$,就形成了一个完整的闭环。
核心状态方程可以写成:
$$ \dot{\hat{\omega}}_e = k_i \varepsilon $$
$$ \dot{\hat{\theta}}_e = \hat{\omega}_e + k_p \varepsilon $$
这样PI调节器负责把相位差压到零,积分器负责把转速解出来。
3.3 PLL参数设计与归一化
闭环传函是一个典型的二阶系统,特征方程可以写成:
$$ s^2 + k_p \psi_f \omega_e \cdot s + k_i \psi_f \omega_e = 0 $$
注意这里误差信号里天然带着 $\psi_f\omega_e$ 这个系数,也就是反电动势幅值。正因为有这个系数,PLL的增益实际上是随转速变化的:转速高,误差信号大,环路带宽不自觉拉高;转速低,误差信号小,环路带宽又不自觉压低了。很多人在仿真里随便填一组PI参数,转速一变就发现位置波动变大,根源就在这里。
工程上两个处理办法。一是归一化,把误差信号除以当前反电动势幅值的估计值(或者除以 $\psi_f \hat{\omega}_e$),让误差变成纯相位误差,PI参数就和转速无关。二是按额定转速下的反电动势幅值折算好PI参数,同时把转速变化范围考虑进去,但这样低速段的动态性能会差一些。我个人推荐归一化,虽然低速时除法会放大噪声,但只要给估计转速加一个下限保护,比如最低按5%额定转速来除,实际效果就很好。
环路带宽 $\omega_n$ 怎么选?电流环带宽一般在1kHz到3kHz,速度环带宽通常在10Hz到50Hz,PLL带宽最好落在两者中间,取300到600 rad/s比较常见。阻尼比按0.707设计,那么:
$$ k_p = 2\zeta\omega_n = 1.414\omega_n $$
$$ k_i = \omega_n^2 $$
注意这是在误差信号归一化之后的系数。如果没有归一化,还要把反电动势幅值 $E = \psi_f\omega_e$ 折算进去,具体实现换算一下就行。
PLL和反正切法的差异,总结成一张表更直观:
| 对比项 | 反正切法 | 锁相环 |
|---|---|---|
| 角度连续性 | 噪声干扰时容易跳变 | 闭环跟踪,平滑连续 |
| 转速输出 | 需微分再加滤波,噪声大 | 直接由PI输出,天然平滑 |
| 对反电动势幅值变化 | 基本不敏感 | 需归一化处理 |
| 参数设计 | 无额外参数 | 需要按带宽、阻尼设计 |
| 工程调参难度 | 低 | 中 |
| 抗干扰能力 | 弱 | 强 |
4. 低速启动与开环-闭环切换:无传感工程化第一道坎
4.1 为什么零速和低速是SMO的禁区
前面反复提到,反电动势幅值 $E = \psi_f\omega_e$,它正比于转速。转速为零时,反电动势为零,位置信息彻底消失;转速很低时,反电动势只有零点几伏,被电流采样噪声、逆变器死区电压误差一淹,信噪比极差。强行在零低速跑SMO,结果就是角度抖来抖去,电流环跟着抖,电机根本稳不住。
对传统SMO方案,必须接受一个现实:零速低速阶段要另想办法,通常是开环启动,转速起来以后再切换进SMO闭环。
4.2 I/F开环启动的常用套路
我最常用的启动方法是I/F强制电流导向。思路是:给定一个幅值可设、相位按设定斜坡旋转的定子电流矢量,通过电流环强制实际电流跟着这个设定矢量走,转子会被定子磁场“牵着”转起来。
和V/F开环比,I/F多了一个电流环闭环,能主动压住电阻压降、反电动势变化带来的电流波动,启动时不容易过流,抗负载扰动也稍好。具体操作分三步:
- 初始位置对齐:给定一个固定方向的电流矢量,幅值取额定电流的30%到50%,保持几百毫秒,让转子被吸到已知方向,避免初始角度未知导致启动失败。
- 斜坡加速:以设定的角加速度,把电流矢量的相位从0开始平滑旋转,转子跟着电流矢量同步加速。电流幅值在启动阶段可以保持一个较大值以保证同步转矩,转速达到切换点后再逐步撤掉。
- 到达切换阈值:一般切到SMO闭环的转速阈值选在额定转速的5%到10%。太低,反电动势信噪比不够;太高,开环运行时间太长,负载扰动下容易失步。
4.3 如何平滑切到SMO闭环控制
开环切闭环,最容易翻车的就是切换瞬间角度突变和电流冲击。我自己的经验是:滑模观测器在开环阶段就一直在工作,让它持续用真实电压电流跑估计,只是不把估计角度送给FOC。这样等转速慢慢爬上来,观察估计角度和开环给定角度之间的差,当角度差稳定在几度以内时,才有资格谈切换。
切换时的具体动作要讲究顺序。先把速度环切入,速度指令保持当前设定转速;然后把Park变换使用的角度从开环给定角平移到观测角,这个平移不要一步到位,用200到500毫秒的斜坡窗平滑过渡;最后再把电流指令从I/F阶段的强制电流矢量逐步切换成速度环的输出。三个动作错开,冲击会小很多。
还要给切换条件加一点滞回。比如切到闭环的阈值是10%额定转速,切回去的条件可以设在8%甚至更低,防止负载波动让系统在阈值附近反复横跳。带载情况下,尤其不要在切换瞬间给满转矩,开关管、电流环、观测器都容易扛不住。
5. 从仿真搬到台架:调参顺序与三个真实坑
5.1 一套可复用的调参顺序
仿真里跑得风生水起,搬上台架就露馅,这是常态。不是算法不对,而是仿真模型太理想,没有死区、没有采样噪声、没有离散延迟。我建议按这个顺序调台架参数:
- 先把电流环闭环调好,这是所有工作的地基。电流环抖,后面全白搭。
- 求滑模切换增益 $K$:按 $K = (1.2 \sim 1.5) \times \psi_f \omega_{e,max}$ 做初值,再根据实际电流谐波微调。
- 定低通滤波器截止频率:工程上常取最大电频率的3到5倍。太高滤波效果差,太低相位滞后大。
- 设计PLL参数:按归一化误差和三倍于速度环带宽的原则计算初值。
- 最后做相位补偿,在转速上升到中高速时对比估计角度和编码器角度,把差值摊到相移公式里。
5.2 坑一:高速位置偏差大的根源是低通滤波器相位滞后
一阶低通滤波器带来的相位滞后近似为:
$$ \Delta\theta = \arctan\left(\frac{\omega_e}{\omega_c}\right) $$
$\omega_c$ 是低通截止角频率,$\omega_e$ 是当前电角频率。转速越高,滞后越大。如果这个角度不补,位置估计就会落后真实位置,转矩角被拉偏,输出转矩下降,高速时还可能进入失控边缘。补偿的办法很直接:用估计转速实时算相位滞后,加在PLL输出角度上。还有一部分相位滞后来自控制周期里的计算延迟和PWM更新延迟,这个可以按半个到一个控制周期折算成角度补进去。
5.3 坑二:切换增益K调大抖振、调小丢步
这是最磨人的一对矛盾。曾经在某台架上,我把 $K$ 收小想压抖振,结果带载一上来滑模面直接飞了,电机咣当一下失步;把 $K$ 调大,空载低速时电机嗡嗡响,电流里全是高频毛刺,位置波形也毛。
诊断方法:把滑模修正项 $v_{\alpha}$、$v_{\beta}$ 拉出来看。如果修正项里明显是高频方波,说明是 $K$ 太大或者边界层不够;如果修正项平均幅度接近反电动势峰值但又偶尔“削顶”,说明裕量不足。处理手段是先确保边界层 $\delta$ 用上,再调 $K$;如果还抖,考虑用sigmoid代替饱和函数,或干脆上高阶滑模算法,把抖振压到更低水平。记住一个原则:$K$ 首先是保证滑模面存在的,其次才是考虑代价,不能为了安静牺牲稳定。
5.4 坑三:PLL直接套公式导致带宽漂移
有一次我在项目里给PLL按二阶系统算好了 $k_p$、$k_i$,低速试转的时候位置反馈挺干净,转速一拉高,位置噪声反而变大。排查了半天发现就是没做归一化。低速时反电动势幅值小,误差信号 $\varepsilon$ 也小,环路实际带宽被拉得很低,位置噪声被环路本身滤掉了;高速时反电动势幅值变大,误差信号变大,环路带宽被抬高,噪声全跟着进来了。位置在固定转速指令下有规律地“做操”,就是典型症状。
把误差信号按反电动势幅值归一化之后,带宽基本稳定,这个问题就消失了。这也是为什么我在第3.3节反复强调归一化。
5.5 台架调试信号与典型现象对照
给一组常见症状和排查方向的速查表:
| 症状 | 可能原因 | 排查方向 |
|---|---|---|
| 低速电流噪声大、位置抖动 | K过大、边界层太小、死区未补偿 | 减K、增delta、补死区 |
| 高速转矩下降、位置落后 | LPF相位滞后未补偿、离散延迟大 | 动态相位补偿 |
| 带载突然丢步 | K裕量不足、切换阈值过低 | 加K、抬高切换点 |
| 切闭环瞬间电流冲击 | 开环角度到观测角跳变 | 角度斜坡过渡 |
| 位置存在周期性波动 | PLL带宽受E影响漂移 | 误差信号归一化 |
6. 参数变化、死区影响与后续扩展
6.1 电阻和电感漂移的影响
电机运行温度升高,定子电阻阻值可能漂移百分之几十;铁芯饱和和磁链变化会让电感在重载时打折。传统SMO对参数失配有一定容忍度,因为滑模等效控制把不少模型误差当成扰动压掉了,但低速时电阻压降在电压方程里占比大,电阻不准,反电动势估计就会偏;高频时电感不准,电流误差动态模型就不准,观测器极点会偏离设计点。如果产品需要跑很宽的温度和负载范围,就得考虑在线电阻辨识或者把电阻做成温度查表模型,把参数误差的影响压下去。
6.2 逆变器死区与电压采样偏移
死区效应是台架和仿真差异的一大来源。每个开关周期那几百纳秒的死区时间,折算出来的平均电压误差近似一个与电流方向相关的阶梯波。这个误差在低速时和反电动势量级相当,观测器把死区误差也当成反电动势的一部分去估计,位置就会带出六脉波形式的误差。常见做法是加简单死区补偿:根据三相电流方向和逆变器参数,给电压指令叠加一个补偿电压;或者用一个平均补偿模型,把死区造成的压降前馈补掉。电压采样和PWM中断时序也要尽量对齐,采样点放在PWM中心,能躲开大部分开关噪声。
6.3 往凸极机和高频注入方向的扩展
如果项目要从表贴机换到内置式凸极机,传统反电动势SMO的直接移植会碰壁。这时候要用扩展反电动势(EEMF)的思路,把凸极引起的交直轴电感差项折算进反电动势模型,再套用滑模观测框架,本质上还是同一套思想。如果产品要求零速堵转也能带载启动,那就要上高频信号注入,利用凸极效应在零低速辨识位置,再把高频注入和SMO在合适速度段衔接起来。这是后话,先把传统SMO加PLL这条链路吃透,再去扩展会更顺手。
最后分享一个调试小技巧:调PLL之前,先看滑模修正项经过低通之前的波形。如果修正项里明显带有死区形成的六脉波包络,说明底层电压模型不准,这时候调PLL是治标不治本,把死区补偿补上、让反电动势波形变干净,后面的锁相环工作会轻松很多。位置误差的收敛速度是结果,前面环节的质量才是原因。