做永磁同步电机无感FOC的同行,应该都遇到过这种尴尬:空载跑得挺顺,一带上负载,启动瞬间转速砸下去一大截,突加负载的时候速度环吭哧吭哧半天才拉回来。电机的电磁时间常数是毫秒级,可机械时间常数是百毫秒甚至秒级,纯靠转速PI去扛负载扰动,本质上就是“先犯错、再纠错”,动态性能的天花板摆在那里。
这篇文章要讲的,就是把负载转矩前馈补偿加进无感FOC的控制框架:用龙伯格观测器实时算出负载转矩,然后直接折算成q轴电流前馈项,抢在转速掉下去之前把转矩补上。方案的核心有三块:龙伯格负载转矩观测器的设计与整定、前馈补偿路径和速度环的配合、以及无感位置转速估算与整套系统的联调。适合正在做PMSM无感FOC项目、或者被突加负载动态响应指标折磨的工程师和研究生参考。我按从原理到台架的完整脉络写,中间的参数计算和调试顺序都能直接抄。
1. 无感FOC为什么需要负载转矩前馈补偿
1.1 速度环的两难处境
先看传统速度环在负载突变时的行为。转速PI的输出是q轴电流指令,当负载转矩突然加大,转速先往下掉,速度误差e变大,PI输出才跟着往上加。这个过程本质上是被动纠错:系统必须先承受一次转速跌落,然后靠积分项慢慢把转矩补回来。
问题在于,速度环的带宽通常只有十几到几十赫兹,机械时间常数又大,这个“跌下去再拉回来”的周期往往要几百毫秒。我实测过一台额定转速1500rpm的永磁同步电机,在额定负载阶跃下,纯PI控制转速跌了将近120rpm,恢复时间接近600ms。如果负载是周期性突变的,比如压缩机、往复式泵、关节电机,转速就会一直处于波动状态。
有人会说,那把PI调激进一点不就行了。调高Kp确实能减小跌落深度,但增益上去了,噪声和机械谐振就会进来,电流环饱和的风险也变大。更麻烦的是,无感FOC本身还有估算延迟,速度反馈本身就有滞后,增益到头就只剩下震荡。结论很清楚:速度环PI只能解决“事后补偿”,想提高动态响应,必须走前馈这条路。
1.2 转矩前馈在PMSM里怎么落地
永磁同步电机的电磁转矩和q轴电流在id=0控制下是线性关系,这一点是前馈能成立的根本原因。表贴式电机下:
Te = 1.5 · p · ψf · iq
其中p是极对数,ψf是永磁磁链。只要电流环够快,给定多少iq,电磁转矩几乎是立刻建立起来的。于是问题被简化了:如果我能实时知道负载转矩TL,直接让iq指令里多出一项TL / (1.5·p·ψf),电磁转矩当场就能抵消掉负载,转速根本不该掉。
这个思路等价于在机械方程里做前馈解耦。忽略摩擦时的机械方程为:
J · dω/dt = Te − TL
前馈一旦把Te补偿到接近TL,dω/dt就趋近于零,转速自然稳住了。整个过程不依赖速度误差,所以不存在延迟。剩下来的唯一问题,就是怎么“知道”TL——负载转矩通常没有传感器直接测,这就是龙伯格观测器登场的理由。
1.3 什么场景最值得做这套方案
不是所有项目都需要转矩前馈。我自己的经验是,下面这几类场景收益最大:
- 恒速带载且负载突变频繁的场合,比如提升设备、牵引系统、搅拌机,这类系统对转速跌落和恢复时间有硬指标。
- 带载启动和低速重载工况,速度环在低速时本来就不好调,纯PI启动大惯量负载很容易憋停。
- 某些动辄几十公斤级转动惯量的设备,机械时间常数大到PI怎么调都发肉,前馈几乎是救命稻草。
反过来,如果是空载为主的测试台、风机水泵这类负载平稳的设备,做转矩前馈性价比就不高,一个调好了的PI就够了。方案选型先想清楚需求,别为了用观测器而用观测器。
2. 龙伯格观测器:怎么“看”到看不见的负载
2.1 观测器的基本思想
“观测器”三个字听着唬人,内核其实很朴素:把已知的数学模型和可测的物理量结合起来,推算那些测不到的状态。这里可测的是机械转速ω,测不到的是负载转矩TL,那干脆把TL也当成一个“状态变量”,用模型去估计它。
直接用机械方程是不行的,因为方程里有两个未知量:TL和摩擦项。但只要把转速误差当成反馈,让估计值不断被修正,TL就能被“逼”出来。打个比方,你闭着眼根据油门踏板的力度估计车身现在受力多少,但不知道路面坡度——不过你能感觉到车速在掉,于是可以反推坡度有多大。观测器干的活就是这个。
为了让负载转矩可估计,通常假设它在短时间内近似不变,即dTL/dt约等于0。这不是说负载真的恒定,而是说负载变化的频率远低于观测器带宽,在这个时间尺度上把它当作缓变量处理。工程上这个假设绝大多数时候都成立。
2.2 状态方程与观测器推导
写一下完整推导,后面整定参数要用。结合机械方程和扩展状态,系统可以写成:
dω/dt = (Te − B·ω − TL) / J
dTL/dt = 0
写成矩阵形式就是:
dx/dt = A·x + B·u
y = C·x
其中:
x = [ω, TL]^T
A = [−B/J, −1/J; 0, 0]
B = [1/J, 0]^T
C = [1, 0]
u = Te
龙伯格观测器的结构是:先用模型算一步预测,再用实测转速和预测转速的误差去修正:
dω̂/dt = (Te − B·ω̂ − T̂L) / J + l1·(ω − ω̂)
dT̂L/dt = l2·(ω − ω̂)
这里的l1和l2就是观测器增益,决定了修正强度。和传统状态观测器一样,观测器自身的收敛速度由误差动态的极点决定。把误差eω = ω − ω̂、eTL = TL − T̂L代进去,可以得到:
de/dt = (A − L·C)·e
特征方程为:
s² + (B/J + l1)·s + l2/J = 0
这就是后面整定增益的理论基础。
2.3 增益怎么算
工程上常用二阶系统来对标,设期望极点为阻尼比ζ和自然频率ωn,把特征方程配成:
s² + 2·ζ·ωn·s + ωn² = 0
于是:
l1 = 2·ζ·ωn − B/J
l2 = J·ωn²
注意观察l2的表达式:它和转动惯量J直接相关。如果J标定不准,l2给的是“假增益”,观测器的带宽和阻尼都会变形。B如果相对ωn很小,可以忽略,但低速摩擦比较明显时最好把它在模型里带进去,否则稳态会出现偏置误差。
举一组我调过的参数。某台测试电机J大约0.0008 kg·m²,B约0.0001 N·m·s/rad,机械转速范围0到1500rpm。取ζ=1(临界阻尼,不超调)、ωn=2π·50≈314 rad/s,算出来:
l1 = 2·314 − 0.125 ≈ 627.9
l2 = 0.0008·314² ≈ 78.9
观测器响应约20ms,比速度环快五六倍,又远低于电流环的开关噪声频率,这个配置在我的项目里很稳。记住一个原则:观测器带宽必须显著高于速度环带宽,否则前馈本身就带滞后,但又不能高到把转速反馈里的噪声全放进来。
2.4 离散化与代码实现
数字控制器里按周期离散执行,最常用的一阶欧拉法就够了。控制周期T一般是电流环周期,比如100微秒到1毫秒。核心代码很简洁:
// 龙伯格负载转矩观测器,机械角速度单位rad/s,转矩单位N·m // 输入:Te(电磁转矩)、w_mech(机械角速度)、T(控制周期) // 状态:w_hat(转速估计)、TL_hat(负载转矩估计) float w_hat, TL_hat; void luenberger_update(float Te, float w_mech, float T) { float w_err = w_mech - w_hat; float dw = (Te - B * w_hat - TL_hat) / J + l1 * w_err; float dTL = l2 * w_err; w_hat += dw * T; TL_hat += dTL * T; }两点实操提醒。第一,单位必须统一,很多表格里J是kg·m²、转速是rpm,直接代入公式会差一个2π/60的系数,算出来观测器要么发散要么迟钝。我强烈建议内部统一用SI单位(rad/s和N·m),只在界面层做转换。第二,速度反馈在无感FOC里用的是估算转速,本身带有观测噪声,最好先做一阶低通滤波再进龙伯格观测器,否则l2会把噪声放大,抖得没法看。
3. 前馈补偿路径与速度环的配合
3.1 前馈指令的生成和限幅
观测器算出TL_hat后,前馈电流为:
iq_ff = T̂L / (1.5 · p · ψf)
最终q轴电流指令:
iq_ref = iq_pi + iq_ff
pi输出和前馈相加,这个动作放在速度环输出处。每个控制周期都需要做限幅,不能让合成的iq_ref超过电流环允许的最大值。实际项目里有两点容易踩坑。
一是方向问题。负载转矩是有符号的,正转时负载是阻力,反转时可能是助力。如果你不做符号判断,把前馈绝对值直接加进去,反转工况下就是帮倒忙。我一般会按当前转速的方向和给定方向做一个符号逻辑,至少保证前馈方向和稳态转矩方向一致。
二是前馈通道上建议加缓动处理。观测器输出虽然有滤波,但阶跃瞬间还是会有比较陡的变化,直接怼进电流环会在转矩里留下冲击。我在前馈路径上加了斜坡限幅,限制每周期前馈电流的变化率,代价是响应慢几个毫秒,但换来的是整个系统的平顺性,对机械冲击大、齿轮间隙明显的负载很值得。
3.2 防积分饱和和去饱和联动
加了前馈之后,速度环PI的负担大幅减小,但饱和问题依然要管。这里有个常见的误区:以为前馈到位了PI输出小,就不用管抗饱和了。其实不是,在突加负载瞬间,如果前馈响应还不够快,PI仍然可能短暂顶到限幅,积分项会在这段时间快速累积;等负载恢复,积分需要时间退出来,转速回落就慢。
所以我保留了两层保护。第一层是常规的积分限幅,限制积分项本身不超过某个值。第二层是回算型的抗饱和,当PI输出进入限幅时,把实际输出和限幅值的差按比例反馈回积分项,动态吸收多余积分。实测下来,这两层配合前馈,负载阶跃后的转速超调量和收敛时间都能控制在纯PI方案的1/3以内。
3.3 与无感位置估算的耦合问题
无感FOC里最麻烦的是转速信号本身不可测,用的是软估算。滑模观测器加PLL给出的转速,在中高速还算干净,一到低速就全是噪声。而龙伯格观测器的输入之一就是转速,转速噪声直接决定了你能把观测器开多大带宽。
我在实际项目里处理这个耦合,用了两个办法。一个是在低速段动态降观测器带宽,让l1、l2跟转速联动,低速时增益调小,防止噪声主导;另一个是把龙伯格观测器自己估计的转速ω_hat当作速度环反馈,而不是直接用PLL的输出。这相当于做成了一个闭环套闭环,龙伯格转速估计本身有滤波特性,速度环拿到的是一个平滑得多的信号。实测在30rpm以上,这个结构都稳定,速度环带宽还能略微调高。
不过要提醒一下,用ω_hat做反馈有一个前提:观测器模型里的J和B必须足够准。如果J偏差超过15%,ω_hat会带稳态误差,反而比直接用PLL更糟。所以参数标定一定不能偷懒,后面第五章专门讲这个。
4. 无感FOC的位置转速估算与启动策略
4.1 常用估算方案的选型
转矩前馈做得再好,也得建立在无感FOC本身稳的基础上。先简单对比一下几种主流的转子位置/速度估算方案:
| 估算方案 | 适用速度段 | 优点 | 主要短板 |
|---|---|---|---|
| 滑模观测器SMO + PLL | 中高速 | 鲁棒性强、参数依赖小、实现简单 | 低速反电动势信噪比差 |
| 磁链观测器 | 中高速 | 波形平滑、谐波小 | 对磁链参数敏感 |
| 模型参考自适应MRAS | 中低速 | 收敛性好 | 参数依赖大、启动困难 |
| 高频注入 | 零速/低速 | 能实现真正的零速控制 | 需要电机凸极性、噪声大 |
我的项目以额定转速1500rpm、最低工作到30rpm为目标,选了SMO加PLL,结构简单、不依赖电机凸极性,把低速段的启动交给I/F强迫换相来处理。如果要求零速带载、甚至堵转保持转矩,那就得考虑高频注入或者直接上带编码器的方案,纯软件无感在近零速做高动态本来就是生意外的。
4.2 I/F强迫启动与闭环切换
纯无感FOC没法在零速自启动,因为零速时反电动势为零,SMO给不出有效位置。通用的做法是I/F强迫启动:先给一个固定的电流幅值,按预设的斜坡让电流角度匀速旋转,把电机“拖”到一定转速。这时电机处于人为的开环状态,转矩角会自动调整来平衡负载。
I/F阶段和闭环阶段的切换是最容易出事的环节。我用的切换逻辑是:转速达到预设阈值,比如50rpm,同时估算位置和给定位置的角度误差连续若干个周期小于30度,才允许从I/F切到SMO闭环。角度误差这个判据特别关键,如果只凭转速阈值就切,负载大、惯量大时角度误差可能还有几十度,切换瞬间会出现电流冲击,转速直接往下砸。
4.3 启动阶段前馈怎么配合
I/F阶段龙伯格观测器最好从一开始就使能运行。虽然没有闭环位置,但转速估计可以用给定转速替代,观测器照样能收敛出TL_hat。带载启动时,等I/F牵引到闭环切换速度,TL_hat已经基本跟着真实负载了,切换成功后前馈立刻投入,能在第一拍就把负载转矩补掉大半。
我做过对比,不带前馈的启动切换后,转速会经历一次明显的回落再爬升;带上观测好的前馈,切换瞬间转速几乎只是轻微波动一下就稳住。对于提升类设备,这个区别体感非常明显——一个像是“吊起来又松了半下”,另一个像是“稳稳地接住了”。启动阶段前馈的投入时机建议放在切换确认后的第二个控制周期,给切换逻辑一个稳定时间,避免判据误触发。
5. 从仿真到台架:整定流程与实测记录
5.1 转动惯量怎么实测
前面强调过,龙伯格观测器的增益l2正比于J,J标错整个观测器都会变形。仿真里J是给定的,到了台架上不能靠猜,最实用的方法是加速度法:给电机一个恒定的阶跃转矩指令,在转速线性上升段测斜率。
J = ΔTe / (dω/dt)
实际操作时注意几点:一是避开低速摩擦区,从额定转速的20%开始测量到80%,摩擦影响小;二是正反两个方向各测几次取平均,抵消重力负载等单向干扰;三是采样的转速一定要用滤波后的值,否则dω/dt算出来的J全是噪声。实测一个物流分拣项目的电机,铭牌上是0.6kW、额定3000rpm,我用这个方法测出来J约0.00075 kg·m²,和仿真初值差了将近两成,如果直接拿仿真值去调观测器,效果会差很多。
5.2 各环路带宽怎么搭配合适
整个系统从内到外是电流环、龙伯格观测器、速度环,再加最外面的位置环或者转矩限幅逻辑。我个人的推荐经验和配合关系如下:
| 控制环 | 推荐带宽 | 说明 |
|---|---|---|
| 电流环 | 1kHz ~ 2kHz | 由PWM开关频率和电流采样决定 |
| 龙伯格观测器 | 50Hz ~ 100Hz | 高于速度环带宽5倍以上,低于电流环噪声频段 |
| 速度环 | 10Hz ~ 30Hz | 受机械谐振和噪声限制 |
核心原则是观测器要比速度环快一个数量级以上,这样前馈对速度环来说才近似是即时补偿。如果观测器只比速度环快两三倍,前馈本身就带滞后,补偿效果就大打折扣。我遇到过有人直接把观测器带宽调到和速度环一样,结果速度跌落只改善了一点点,还多了高频抖动。
5.3 台架实测怎么看波形
调完参数,重点看三个信号:转速指令与实际转速、TL_hat波形、iq指令波形。突加负载时,理想情况下TL_hat应该在5到20毫秒内跳到接近真实负载值,转速跌落深度比纯PI小一个数量级,iq指令里的前馈分量能明显看到和负载阶跃同步的台阶。
拿我调试的某台模拟泵负载的电机举例,额定负载阶跃下,纯PI的转速跌落大约是110rpm、恢复时间500ms;加入前馈后,跌落压到了25rpm,恢复时间80ms左右。这个改善幅度不算惊艳,但关键是无论负载怎么突变,转速波动都被压缩到了正负1.5%以内,客户要的“恒速带载”指标就这么过了。
还要提醒看一个细节:稳态时TL_hat和手算负载转矩的对账。如果对不上,往往不是观测器问题,而是Kt = 1.5·p·ψf用的磁链值不准。测功机稳态负载是能算出来的,用它校准ψf,比查手册靠谱。
6. 常见问题与排查技巧实录
6.1 问题速查表
调试过程中我总结了一份比较通用的排查表,贴出来给大家参考:
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
| TL_hat发散或大幅震荡 | 增益过大、J设置偏差过大 | 降ωn重新算增益,核对J实测值 |
| TL_hat响应慢、相位滞后 | 观测器带宽太低、转速滤波太深 | 适当提高ωn,减小滤波时间常数 |
| 稳态前馈量和手算不符 | Kt计算不准、静摩擦未补偿 | 用稳态负载标定ψf,加静摩擦前馈项 |
| 低速TL_hat噪声大 | SMO/PLL在低速信噪比差 | 低速降观测器带宽,优化PLL带宽 |
| 突加负载仍掉速明显 | 前馈强度不足、观测器滞后 | 核对前馈限幅,提高观测器带宽 |
| 启动切换瞬间电流冲击 | 切换判据不严、TL_hat未收敛 | 加角度误差判据,延长预观察时间 |
第一项要展开说。TL_hat发散十有八九不是代码问题,而是参数问题。J偏大时观测器增益虚高,实际带宽被放大,噪声跟着进来;J偏小时收敛变慢,但又可能因为速度误差持续较大而出现持续的修正震荡。所以先核对J再动增益。
6.2 推荐的调试顺序
我建议按下面这个顺序来,能少交叉很多坑:
- 电流环闭环跑通,电流阶跃响应调到无超调、上升时间小于1ms。
- 用加速度法实测J,标好B摩擦系数。
- 开环状态下跑观测器,只观察不投入前馈,确认TL_hat能跟随手动加载不震荡。
- 速度环闭环带上前馈,从小幅负载阶跃开始,观察TL_hat响应和转速跌落。
- 逐步加大负载阶跃幅值和变化速率,确认前馈限幅和抗饱和逻辑正常。
- 最后做I/F启动切换联调,确认切入前馈的时机和切换判据配合正确。
每一步都要确认波形符合预期再往下走。我见过最快的翻车方式就是前馈还没调稳就急着去调启动,结果两个环节互相干扰,哪里都说不清。
6.3 前馈没效果时的自查套路
如果完成了上述步骤,转速跌落却没有明显改善,别急着怀疑观测器,先做一个最简单的实验:给iq指令直接加一个和负载同步的固定偏置,看转速是不是立刻好了。如果这种“手动前馈”都不见效,问题多半在前馈投入路径,比如限幅没放开、前馈符号反了、或者前馈项叠加的位置写错了。如果手动前馈见效但观测器前馈不行,那再回头查观测器带宽、输入信号质量和J的准确性。这个自查套路帮我排掉过不少乌龙,比如有一次是速度反馈误接了电气角速度,单位差了极对数倍,观测器估计出来的负载转矩自然全错。
我自己的体会是,转矩前馈补偿这套东西,理论推导半天,真正决定成败的全在参数标定和单位一致性上。观测器算法本身不复杂,复杂的是你信不信它给出的数。把J标准、把转速信号弄干净、把带宽匹配好,剩下的就交给时间。最后再分享一个小技巧:调试阶段把TL_hat和速度环PI输出的比值打出来盯着看,正常情况下稳定工况前馈占比应该在60%以上,如果PI还在出大力,说明前馈没真正接管,系统的动态性能就没榨干。这个比值比看单条波形直观得多,推荐大家都试试。