无感FOC技术落地:滑模观测器与锁相环的工程调试指南
这些年做电机控制调试最经常被问到的就是项目上能不能把编码器拿掉拿掉之后位置和转速用算法从电流电压里“算”出来到底靠不靠谱在诸多无位置传感器方案里基于反电动势的传统滑模观测器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。此时在α-β静止坐标系下电压方程里只有一组统一电感非常干净。如果用的是内置式永磁电机IPMSMd-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。系统一旦进入滑动模态也就是 $S0$ 且 $\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到50HzPLL带宽最好落在两者中间取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是治标不治本把死区补偿补上、让反电动势波形变干净后面的锁相环工作会轻松很多。位置误差的收敛速度是结果前面环节的质量才是原因。