做伺服驱动这几年,只要是碰到负载突变、刚性冲击、低速爬行这一类问题,最后多半都要回到一个点上:你能不能把负载转矩实时、准确地估出来。我在这篇里要聊的,就是一个非常实用的方案——基于降阶负载转矩观测器的永磁同步电机转矩估计及前馈补偿应用。这个方案不是学院派花架子,它在实际驱动项目里可以直接落地,用来解决速度环面对负载扰动时的响应滞后、速度跌落和恢复时间过长等问题。适合刚接触电机控制、被PI参数和扰动整得头疼的开发者,也适合已经在做伺服/主轴驱动产品、想提升动态性能的工程师参考。
1. 为什么非要“先把转矩算出来”再补偿
1.1 速度环面对负载突变时的困局
你去看一个典型的PMSM速度控制系统,最外层是速度环,内层是电流环,标准结构。正常情况下,负载转矩慢慢变,速度环PI通过积分作用就能把静差吃掉,系统没什么脾气。但工业现场根本不是这样。我见过某台设备在运行中突然加载,负载转矩从一个很小的值瞬间跳到额定值的80%,这时候速度环的反应过程是什么?
PI调节器先看到转速误差,然后积分项慢慢累积,电流指令才跟着爬上去。这个链条里每一环都有惯性,结果就是速度先跌下去一大截,然后花几百毫秒甚至更久才拉回来。如果你用的是普通PI,要压住这个动态误差,只能把比例增益和积分增益调大,但调大了又会带来振荡、超调、噪声放大,甚至触发机械共振。这就是纯反馈调节的经典困局:扰动来了你才知道,知道了我才动手,动手还不敢太快。
而前馈补偿的思路完全不同——我先把负载转矩估计出来,知道外部在使劲拽我,我就在电流指令上直接补一块对应的转矩电流,让电磁转矩马上跟上负载,速度还来不及跌多少,系统就已经把它扛住了。这个思路不是替代速度环PI,而是让PI只去处理观测误差和模型误差留下的残余扰动,压力瞬间小了一个量级。
1.2 前馈补偿与反馈调节的分工
很多人第一次接触前馈的时候会问一个问题:速度环积分器本来就能消除静差,我再做前馈补偿,两个东西会不会打架?实际不会。你细想一下:稳态时负载转矩是一个恒定值,前馈补偿直接给了一部分电流指令,速度环的积分器发现误差已经很小,就不会再使劲积分,最终稳态输出只是把前馈没估准的那点残余补上。两者是分工关系,不是竞争关系。
真正要设计好的,是前馈量的来源和路径。来源就是负载转矩观测器的输出,路径则要选在电流环指令处注入。补偿公式也很简单:
[ i_{q_ref}=i_{q_pi}+i_{q_ff},\quad i_{q_ff}=\frac{\hat{T}_L}{K_t} ]
其中 (\hat{T}_L) 是观测器估计的负载转矩,(K_t) 是电机转矩常数。可以看到,这个方案的关键全部压在“转矩估计准不准、快不快”上。估计准了,前馈就是一把精确的刀;估计不准,轻则补偿不足,重则引入新的扰动。所以后面所有的推导和参数整定,都围绕怎么把这个估计器做好。
2. 降阶负载转矩观测器:原理推导
2.1 从机械运动方程说起
要估计负载转矩,首先得有模型。永磁同步电机的机械运动方程是一个一阶微分方程:
[ J\frac{d\omega_m}{dt}=T_e-T_L-B\omega_m ]
这里 (J) 是折算到电机轴上的总转动惯量,(\omega_m) 是机械角速度,(T_e) 是电磁转矩,(T_L) 是负载转矩(包括了外部负载、摩擦力矩、齿槽转矩等),(B) 是粘滞摩擦系数。(T_e) 对于表贴式PMSM可以直接写为:
[ T_e=1.5p\psi_f i_q=K_t i_q ]
所以在一个已知电流指令、已知转速的系统中,机械方程左边、右边的电磁转矩和摩擦项我们都是能算出来的,唯一真正不知道的就是负载转矩 (T_L)。这就是估计问题的核心:从一个带未知输入的微分方程里,把未知量实时辨识出来。
这里有一个很关键的假设:负载转矩在一个控制周期内近似不变。也就是:
[ \frac{dT_L}{dt}\approx 0 ]
这个假设在工程上完全合理。负载突变本质上是一个瞬态事件,但相对于电流环几千赫兹、速度环几百赫兹的带宽,转矩的变化过程可以看成是慢变的,观测器只要带宽足够,就能追上它。
2.2 降阶观测器的设计推导
把机械方程和负载慢变假设组合成一个状态空间模型。取状态量为 (\omega_m) 和 (T_L),其中转速是可测量的,负载转矩是需要估计的:
[ \begin{cases} \dot{\omega}_m=-\frac{B}{J}\omega_m-\frac{1}{J}T_L+\frac{1}{J}T_e\ \dot{T}_L=0 \end{cases} ]
系统的输出方程就是 (y=\omega_m)。这里注意,我们不需要估计转速,因为编码器已经把转速测得很准了。所以问题降阶了:只估计一个状态 (T_L)。这比同时估计转速和转矩的全阶观测器少一维。
降阶观测器设计标准做法是这样的:引入辅助变量 (z=\hat{T}_L+l\omega_m),其中 (l) 是待设计的观测器增益。对 (z) 求导:
[ \dot{z}=\dot{\hat{T}}_L+l\dot{\omega}_m ]
把机械方程代入,并且令观测器动态 (\dot{\hat{T}}_L) 取合适的值,最终可以得到这样的观测器方程:
[ \begin{aligned} \dot{z}&=-\frac{l}{J}z+\left(\frac{l^2}{J}-\frac{lB}{J}\right)\omega_m+\frac{l}{J}T_e\ \hat{T}_L&=z-l\omega_m \end{aligned} ]
这个形式看起来很数学,但你要抓住本质:这个观测器本质上是在做一个带反馈补偿的积分。第一项是自身动态,第二项、第三项是用可测的转速和电磁转矩去修正估计。
观测误差动态可以推出来:
[ \dot{e}=-\frac{l}{J}e,\quad e=T_L-\hat{T}_L ]
这就是这个方案最漂亮的地方——观测器增益只有一个 (l),误差收敛速度由 (l/J) 决定,也就是观测器带宽。只要 (l>0),误差指数收敛,不存在复杂的零极点配置问题。实际调试时,你只需要调一个参数,这对工程人员来说太友好了。
2.3 为什么不用全阶观测器
做过全阶状态观测器的朋友应该知道,全阶观测器要同时估计转速和负载转矩,状态矩阵是二维的,增益矩阵是 (2\times1) 的,其中有两个增益系数要整定,极点配置要算特征多项式,而且还有一个非常尴尬的问题:转速已经被编码器高精度测量了,你再去估计它,等于用一个不那么准的模型去替代一个很准的传感器,纯属给自己找麻烦。全阶观测器模型里任何一点参数误差,都会直接污染转速估计,进而影响转矩估计。
降阶观测器则完全没有这个问题。它直接把可测的转速当作真实值用,只把模型用于转矩这一路的状态估计。好处不仅仅是结构简单、参数少,更重要的是对模型误差的鲁棒性更强。在实际MCU上实现,降阶观测器只需要两三行C代码,占用几微秒的中断时间,全阶观测器要做的矩阵运算、饱和处理、状态耦合处理,算力开销至少翻倍。
还有一个工程角度的对比。有人可能会说,我用最简单的方法行不行:把机械方程变形,直接对 (T_e-J\dot{\omega}_m-B\omega_m) 做低通滤波,不就得到 (\hat{T}_L) 了?这想法没毛病,但实现起来有一个痛点——你要对转速做微分。编码器量化噪声一进来,微分后的噪声会被放大到没法看,低通滤波一加,相位滞后又来了,观测响应就慢了。降阶观测器在推导上其实等价于一种更聪明的滤波结构,它不直接做微分,而是通过辅助变量的方式把微分隐含在积分动态里,天然对噪声更友好。这一点在后面的噪声分析里还会体现。
3. 参数整定与数字化实现
3.1 观测器增益 l 怎么选
带宽决定了观测器的响应速度和噪声抑制能力。一组典型的参数关系是:观测器带宽取速度环带宽的3到5倍。速度环带宽通常在100到200 rad/s,那么观测器带宽取300到1000 rad/s比较合适。
在Simulink里做第一版仿真验证时,我用过这样一组电机参数,你可以直接拿去参考:
| 参数 | 符号 | 数值 | 单位 |
|---|---|---|---|
| 额定功率 | (P_N) | 750 | W |
| 额定转矩 | (T_N) | 2.39 | N·m |
| 转动惯量 | (J) | 1.2e-4 | kg·m² |
| 粘滞摩擦系数 | (B) | 1.0e-4 | N·m·s/rad |
| 极对数 | (p) | 4 | - |
| 定子磁链 | (\psi_f) | 0.075 | Wb |
| 转矩常数 | (K_t) | 0.45 | N·m/A |
| 电流环带宽 | - | 2000 | rad/s |
| 速度环带宽 | - | 200 | rad/s |
| 观测器带宽 | - | 600 | rad/s |
增益计算很简单:
[ l=\omega_{obs}\cdot J=600\times1.2\times10^{-4}=0.072 ]
注意 (l) 是有量纲的,单位是 kg·m²/s,不是无量纲数。很多人调试时把这个量纲搞混,拿一个看起来很小的数去试,发现观测器反应慢得像蜗牛,然后怀疑算法有问题。实际上带宽 (\omega_{obs}=l/J) 才是你该盯住的量。
整定经验我总结一下:如果观测器响应慢,负载突变时 (\hat{T}_L) 跟不上,前馈补偿不足,速度跌落改善不明显,那就增大 (l)。如果观测波形毛刺大,控制噪声明显,那就减小 (l)。一般先按速度环带宽的3倍起步,看波形再往上加,不要一步到位拉到5倍,否则噪声和机械振荡很容易一起来。
3.2 离散化公式与代码级实现
在MCU上是离散实现的,控制周期通常是100微秒或125微秒。观测器方程用一阶欧拉离散足够了,因为动态本身是一阶的,欧拉法的精度和相位误差在观测器带宽范围内完全够用。离散公式:
[ z(k+1)=z(k)+T_s\left[-\frac{l}{J}z(k)+\left(\frac{l^2}{J}-\frac{lB}{J}\right)\omega_m(k)+\frac{l}{J}T_e(k)\right] ]
[ \hat{T}_L(k)=z(k)-l\omega_m(k) ]
C代码实现非常短,我贴一个我在某个伺服项目里用过的版本:
#define TS (1.0e-4f) /* 控制周期 100us */ #define OBS_L (0.072f) /* 观测器增益 l = w_obs * J */ #define OBS_J (1.2e-4f) /* 转动惯量 kg*m^2 */ #define OBS_B (1.0e-4f) /* 粘滞摩擦 N*m*s/rad */ static float z_state = 0.0f; float load_torque_observer(float wm, float te) { float invJ = 1.0f / OBS_J; float dz; /* 辅助变量微分 */ dz = -(OBS_L * invJ) * z_state + (OBS_L * OBS_L * invJ - OBS_L * OBS_B * invJ) * wm + (OBS_L * invJ) * te; /* 欧拉积分 */ z_state += TS * dz; /* 输出估计负载转矩 */ return z_state - OBS_L * wm; }然后在前馈路径里调用:
float tl_hat = load_torque_observer(mech_speed, te_ref); float iq_ff = tl_hat / KT_CONST; if (iq_ff > I_FF_LIMIT) iq_ff = I_FF_LIMIT; if (iq_ff < -I_FF_LIMIT) iq_ff = -I_FF_LIMIT; iq_ref = iq_pi_out + iq_ff;这里有几个实现细节要特别提醒。第一,(T_e) 不要用电流指令代,最好用实际电流反馈算,因为指令和实际之间还有电流环的动态差距,加载瞬间实际电流跟不上指令,用指令算 (T_e) 会让观测器偏高。第二,限幅一定要做,而且限幅值要跟电流环最大输出匹配,否则过流保护直接触发。第三,初始化时把 (z) 设为 (l\cdot\omega_m),这样 (\hat{T}_L) 初始为0,避免启动瞬间观测器跳变。
3.3 前馈量注入与限幅配合
补偿量注入到电流环 (i_q) 指令,是最推荐的做法。理由有两个:一是电流环带宽远高于观测器带宽,前馈量经过电流环几乎不产生额外相位滞后;二是电流环指令处可以做统一的限幅和过流保护,安全逻辑不用散落在多处。
注入之后,你会发现速度环PI的输出明显变小了。这是好现象,说明前馈承担了主要负载。但要注意,如果速度环积分器之前已经积累了很多积分值,切换前馈的瞬间可能出现积分“吐出来”的现象,造成电流指令突变。稳妥的做法是前馈生效后再把速度环积分器的输出限制在一个较小的范围内,或者做积分分离,让PI的积分只在低速误差较大时投入。这个细节直接影响切换冲击,很多初次调试的开发者会在这里被吓一跳。
前馈限幅还可以做成可配置的。工业设备在不同工况下允许的补偿力度不一样,比如刚性主轴允许大补偿,柔性传动系统补偿太大反而会激发扭振。我一般会在驱动器里加一个“前馈补偿百分比”参数,默认80%,现场根据机械情况调节,这比在代码里硬改限幅值实用得多。
4. 工程调试中的常见问题排查
4.1 观测波形噪声大怎么办
这是被问得最多的一个问题。噪声来源主要有三个:电流采样毛刺、编码器量化噪声、以及逆变器开关干扰。观测器带宽本身比较高,会把一部分噪声直接放大。如果发现 (\hat{T}_L) 波形毛刺大,不要急着怀疑算法,先做三件事。
第一件,确认观测器带宽没有过度设计。检查 (\omega_{obs}),如果超过1000 rad/s,大概率是过冲了,先降回600以内试试。第二件,检查电流采样。(T_e) 输入里的高频毛刺会被观测器积分器累积,表现为转矩估计的低频漂移和微小振荡。可以在观测器输入端对 (T_e) 做一次50微秒平均滤波,或者用电流环的滤波结果。第三件,转速信号。如果采用M法测速,低速时量化噪声显著,建议低速段用M/T法或者对速度环反馈值做平滑处理,但不要滤波太狠,否则相位滞后会让观测器性能下降。
还有个经验:在前馈补偿通道上可以单独加一阶低通滤波器,截止频率取观测器带宽的一半。观测器本身带宽高是为了让误差收敛快,但前馈补偿并不需要这么高的带宽,加一级低通能把高频噪声挡在电流环指令之外,对系统稳定性只有好处。代价是前馈相位滞后一点点,实测下来影响很小。
4.2 参数失配的影响与离线辨识
观测器公式里有两个电机参数最关键:转动惯量 (J) 和转矩常数 (K_t)。(J) 直接出现在增益项里,影响实际观测器带宽。如果铭牌给的 (J) 偏小,实际增益比设计值高,噪声变大;如果偏大,实际带宽降低,响应变慢。(K_t) 则直接决定前馈电流换算,偏小则补偿不足,偏大则过补偿,速度会出现反向超调。
我见过的最离谱案例,是某项目直接把铭牌惯量填进去用,结果负载突变时速度不仅没稳住,反而因为过补偿冲高了一截。后来用加减速试验重新辨识 (J) 才发现,负载折算后的实际惯量是电机本体的3倍多。所以一定要做离线辨识,方法很简单:给定恒定的电流指令,让电机匀加速,记录加速度,反推:
[ J=\frac{T_e-B\omega_m}{\dot{\omega}_m} ]
多测几组电流、速度点取平均,误差可以控制在5%以内。(K_t) 可以用堵转或空载低速测试标定,拿力矩传感器直接测,没有条件的话也可以用额定值加温升修正,工业现场一般够用。
4.3 低速、零速与摩擦转矩的干扰
低速段是最容易翻车的工况。这时候摩擦转矩不再恒定为粘滞项,而是包含库仑摩擦、Stribeck效应、静摩擦等非线性成分。观测器会把这些全部算进 (\hat{T}_L),于是你看到的是一个随速度变化剧烈波动的“负载转矩”,但其实里面很大一部分是摩擦力。前馈把这些跟着速度抖动的摩擦转矩也补进去,结果就是低速爬行、抖动,甚至极限环。
处理办法有两种。第一种,在观测器模型中把摩擦模型做细,在 (T_e) 输入端减去已知的摩擦转矩估计值,只让观测器去估计真正的外部负载。第二种,工程上偷懒一点但很有效的办法:低速时降低前馈补偿百分比,或者设置一个速度阈值,低于阈值时前馈增益按速度线性减弱,避免摩擦项主导补偿量。我在实际项目里用的是第二种,配合低速段积分分离,系统表现很干净。
还有一个零速保持的工况,比如伺服锁轴。观测器在零速时退化成纯积分,(\hat{T}_L) 会缓慢漂移,前馈反而推着电机跑。解决办法是零速时冻结观测器输出,直到速度指令变化或检测到外力矩超阈值再解冻。这个逻辑在电液伺服和直驱转台项目里非常有用。
4.4 仿真验证与台架实测对比
做仿真验证时,建议用Simulink搭一个完整的双闭环模型,电流环PI、速度环PI加前馈,电机用库里现成的PMSM模型,负载用一个阶跃信号模拟突变。重点对比三组波形:无前馈、有前馈、有前馈但观测器带宽调低。
我在做某实验平台时,用750W电机测过一版数据,结果非常有说服力。负载从0.2 N·m阶跃到2.0 N·m,无前馈时速度跌落约180 rpm,恢复时间约450 ms,这还是在速度环PI调得不错的条件下。加上降阶观测器前馈后,同样工况下速度跌落降到约50 rpm,恢复时间缩短到80 ms以内。效果非常明显,而且是可复现的。
台架调试时要注意,示波器采 (\hat{T}_L) 波形时,先确认观测器稳态输出与实际负载对得上,再去看动态过程。如果稳态都偏了,优先检查 (K_t) 和摩擦模型;如果稳态准但动态跟不上,优先调观测器带宽。一步步来,不要同时动多个参数,这是所有观测器调试的基本准则。
5. 一点个人体会
我在几个项目里用这套降阶负载转矩观测器做前馈补偿,前后踩过不少坑,最深的体会是:方案本身的数学并不复杂,难的是把它放进真实的电流环、速度环、限幅逻辑、保护逻辑里还能保持干净的动态。建议新手不要一上来就追求复杂的自适应观测器或者滑模观测器,先把降阶观测器在一个双闭环系统里跑通,把增益、离散化、滤波、限幅这些工程细节吃透,你已经能解决80%的负载扰动问题。而且后续往EPR(扩展状态观测器)或者扰动观测器方向走的时候,你会发现原理都是相通的,只是在处理“可测状态”和“未知扰动”的拆分方式上做文章。项目如果需要快速见效,照着上面的参数和代码搭一版,台架上测一轮阶跃负载,你会回来感谢我的。