资讯动态

Simulink下Boost PFC电流环LQR最优控制设计实战

发布时间:2026/10/20 17:00:19 来源:尧图企业网站定制
有十年电源控制和电机驱动经验的人大概都经历过这种场景Simulink里Boost PFC的双闭环调了十几个版本电压外环还好说电流内环的PI参数总让你觉得差一口气。跟踪慢了输入电流畸形跟得太快开关噪声又把波形搅得一团糟。PI整定的时间经常比搭模型的时间还长。这篇不打算讲教科书上的LQR而是聊聊我实际折腾“基于Simulink的LQR最优PFC电流跟踪设计”这件事的完整过程LQR怎么进入PFC电流环、状态方程怎么搭才对、Q/R矩阵怎么给才能不崩以及仿真里那些让我摔了好几跤的边界问题。适合正在用平均电流模式控制做功率因数校正、被电流环PI参数折磨的朋友也适合刚接触最优控制、想找个真实工程场景练手的新手。1. 整体设计思路为什么选LQR来跑PFC电流环1.1 常规电流控制方案的边界在哪里功率因数校正的电流环最常用的方案是平均电流模式控制核心就是电流内环加电压外环。电流内环的参考信号是整流桥出来那半个正弦波或者说是电网电压同相位的正弦电流指令控制器输出给PWM发生器最终让电感电流跟随这个指令。理论上PI都能干这件事但实际你有没有这种感觉Kp给大了电流过零附近会抖Ki给小了正弦波尾部跟不齐THD直接掉到个位数以下就不动了。原因是PFC电流环同时要满足好几个互相打架的指标第一带宽要足够高不然电流指令在50Hz/100Hz正弦变化时会产生相位滞后的跟踪误差第二谐波要小系统对高频纹波和开关噪声要有足够抑制第三占空比不能大幅抖动不然磁性元件啸叫电磁兼容也过不去。PI调来调去就是在这三个目标之间找平衡每次挪一个参数另外两个地方就出事。我试过把电流环PI带宽推到上千赫兹结果波形确实跟上指令了但占空比饱和、过零毛刺、甚至个别工频周期丢脉冲问题一个接一个。后来就动了歪脑筋既然PI的参数本质上是“手调权重”那为什么不用LQR这种直接在代价函数里把权重写清楚的方法呢1.2 LQR切入电流环的正确姿势LQR全称Linear Quadratic Regulator线性二次型调节器。它做的事情很简单给一个线性系统状态空间模型给一个代价函数JJ里对状态偏差和控制量分别加权然后自动解出最优状态反馈增益矩阵K让闭环系统在这个代价函数意义下达到最优。这里有个关键认知LQR本身是调节问题就是把状态拉回零点。但PFC电流环要的是跟踪问题跟踪一条随电网周期变化的参考电流。直接把LQR套上去是会有稳态误差的因为正弦稳态需要持续的非零控制量而纯状态反馈给不出来。所以我的做法是“增广状态LQR”的组合。把电流误差的积分当成一个新状态加进去系统矩阵里多一列然后对这个增广系统做LQR。这样控制器就同时具备状态反馈和积分消除稳态误差的能力本质上比“PI状态反馈”更优雅因为所有增益都是同一套优化框架算出来的不存在谁和谁打架的问题。选择Boost PFC而不是Buck或Flyback一方面是因为Boost拓扑结构简单电感和输出电容的状态方程好写另一方面Boost PFC的CCM模式下电感电流可以直接做状态被反馈LQR的占便宜之处就在这——很多控制对象的状态是不完全可测的但PFC电流环里你至少能拿到电感电流和输出电压两个量剩下的都能推出来。2. 建模与核心公式PFC状态空间怎么搭LQR怎么解2.1 功率级状态方程以Boost PFC为例Boost PFC在CCM模式下的状态方程我习惯用电感电流iL和输出电容电压VC作为状态变量输入量选开关管占空比d电网电压vg作为外部输入。电感回路方程L·(diL/dt) vg − (1−d)·VC输出电容节点方程C·(dVC/dt) (1−d)·iL − VC/R你看这个方程里d和VC、iL之间全是乘积项这说明它是非线性系统。LQR要求线性系统所以必须先做小信号线性化。做法是找静态工作点设定输入电压幅值Vg输出目标电压Vref负载电阻R先求出稳态占空比D和稳态电感电流IL。D 1 − Vg/VrefIL ≈ Vref² / (Vg·R)忽略损耗时然后定义扰动量d D d̃iL IL ĩLVC Vref ṽC代入原方程忽略二阶小量就能得到线性小信号状态方程d/dt [ĩL; ṽC] A·[ĩL; ṽC] B·d̃其中矩阵A是A [ 0 −(1−D)/L (1−D)/C −1/(R·C) ]矩阵B是B [ Vref/L −IL/C ]注意B矩阵第二行是负号占空比增大后平均电感电流增加但通过二极管往输出电容充能的等效电流会下降输出电容电压在瞬态上反而是被拉低的趋势。很多人在这里正负号搞反后面LQR和仿真模型对不上多半就是从这开始出问题的。这个状态方程只是建立起来了还要做一个可控性检查。我给一个建议在MATLAB里直接用ctrb命令算可控性矩阵绝大多数正常工作点都是可控的但如果你选的状态变量组合不太合适比如只拿输出电压一个状态那电感电流就不可观那LQR解出来的K可能没有实际意义。2.2 增广状态法让LQR从调节问题变成跟踪问题如上所述LQR直接用于跟踪会有稳态误差。标准解法是增广法把跟踪误差的积分引入状态向量。我定义误差量e ĩL − ĩL_ref。对于功率因数校正电路这里的参考电流其实是从电压外环来的电导系数乘以瞬时输入电压的波形。为了做小信号LQR可以把它当成一个外部给定信号。增广后的状态向量选为z [ ĩL ṽC e_int ]其中e_int ∫e·dt也就是电流跟踪误差的积分。增广系统的状态方程为d/dt z A_aug·z B_aug·d̃其中A_aug [ A 0 −C_i 0 ]这里的C_i是电流输出矩阵对于电感电流直接可测的情况C_i [10]。也就是说增广系统后三行是电流误差积分这一行反映的是“过去累计了多少跟踪偏差”。B_aug [ B 0 ]因为积分状态不直接受控制量驱动它只受误差累加驱动。为什么选误差积分而不是选正弦内模这里我做过一个对比。内模法的理论性能更好在网频偏移时依然能精确跟踪但状态阶数高而且对参数敏感误差积分增广简单直接配合电压环的低带宽输出实测在50Hz±0.5Hz范围内没有任何工程上可见的性能差异。所以除非你要做宽频带适应性极强的高端电源否则增广积分就是最划算的方案。2.3 权重矩阵Q和R的选择方法论LQR的求解依赖优化问题J ∫ (zᵀ·Q·z R·d̃²) dt其中Q是状态权重矩阵R是控制权重。解出代数黎卡提方程就能得到反馈增益矩阵K_aug [k1 k2 k3]最终控制率为d̃ −k1·ĩL − k2·ṽC − k3·e_int完整的占空比再叠加静态工作点d D d̃Q和R怎么选这是最玄乎的部分也是新手最容易卡住的地方。我分享一下我自己在几个项目中用过的一套经验方法不一定最优但收敛很快踩过的坑也少。第一步先把R固定成1然后只给电流状态权重q1一个初始值比如设q1 1其余状态权重设为0。解一次LQR看增益量级把q1从小到大试直到闭环电流跟踪速度达到你想要的带宽。判断标准很简单给定一个阶跃电流参考看iL上升时间是否达到预期。第二步加入输出电压状态的权重q2。这时候你不光看电流响应还要看输入电压扰动下输出电压的波动。q2如果过小输出电压纹波偏大q2如果过大电流环会和电压环耦合得很严重输入电流会出现低频振荡通常q2的量级要比q1小一到两个数量级。第三步调误差积分权重q3。这个权重的意义是消除稳态跟踪误差它越大稳态误差越快收敛到零但太大之后会让闭环系统出现“谐振峰”尤其在电流过零附近会引发不必要的超调振荡。经验公式是先把q3设为q1的10倍左右然后逐次减半观察稳态误差和THD变化。我常用的初始区间q1在1到100之间q2在0.001到0.1之间q3在q1的5到20倍之间R固定为1或0.1强调一下权重不是越大越好。你如果把q1拉到一万LQR算出来的k1会巨大真实系统里占空比早就饱和限幅了反而控制质量恶化。所以仿真的时候务必在控制输出后面加饱和模块不然你看到的波形可能是“数学上最优、工程上不可用”的典型代表。3. Simulink仿真搭建与调参实录3.1 模型整体结构怎么组织Simulink模型我建议至少分四个大块这样排查问题的时候一目了然不用像传统那样一坨线拉得乱七八糟。第一块是功率主电路用Simscape Electrical里的器件搭交流电压源、整流桥、Boost电感、MOSFET、二极管、负载电阻、直流母线电容。信号域和物理域之间的连接用Simulink-PS Converter和PS-Simulink Converter来转。开关管可以用MOSFET或者理想开关模型最稳定的是MOSFET加门极驱动信号不要用理想开关直接吹不然仿真步长会被强行拉得非常小。第二块是采样与信号处理。实际控制器不能直接拿到连续状态要用零阶保持器模拟ADC采样。我一般把采样频率设成和PWM频率一致100k的PWM就100k采样。把电感电流、输出电压、输入电压采样之后再过一遍滤波器。特别注意输出电压的采样要滤除开关纹波你可以用二阶低通截至频率放在开关频率的二十分之一以下。第三块是控制器核心。这里有两种实现方式一种是把LQR增益算好后在Simulink里用Gain模块搭成状态反馈加积分的结构另一种是用MATLAB Function模块每次触发时算一次占空比。我强烈推荐前者因为Gain模块的结构更透明调试时你随时可以断线看中间信号。核心结构就是三个Gain分别对应k1、k2、k3一个积分器对应误差积分一个加法器把前馈占空比D加上来。第四块是PWM生成模块。Simulink自带的PWM Generator在Simscape电路里可以直接用但如果你是纯信号控制可以用比较器加三角载波。注意占空比调制方式这个细节Boost PFC通常需要的是固定频率PWM所以载波频率固定调制波就是控制器的占空比输出。还有一个容易被忽视的点是载波相位多相交错PFC里这是核心问题但单相Boost就无所谓了只要保证时序对齐。3.2 LQR控制器模块的实现细节控制器模块里最关键的是积分器初始化。电流误差积分的初值如果你设了零那么仿真刚开始的几百微秒会有一个明显的建立过程因为误差是从零开始积的控制量不够电感电流建立比较慢。我后来都是把积分器初值设为参考电流的大小相当于预置了一个偏置启动过程会快很多。还有一个细节是积分器的限幅。误差积分状态在物理上对应的是PFC电流环的直流偏置能力如果你完全不限幅电网电压突然跌落的时候积分器会疯狂累积等电压恢复之后电流会出现一大段过冲。所以我给积分器输出加了限幅上限取额定电流的20%下限取−20%。这个限幅值不是随便拍的它是根据系统允许的最大静态占空比偏差推出来的。再说说LQR离散化和连续化的选择。如果你在MATLAB里用的是lqr命令那是连续系统设计求出来的K适用于连续系统。但Simulink仿真你是离散控制器所以要么用c2d把连续系统离散化后再用dlqr设计要么直接把连续K用零阶保持器离散化之后放进仿真。两种方式我都试过结果有细微差别但工程上都能接受。值得注意的一个坑是Simulink仿真时控制器和控制对象会形成代数环。因为输出占空比会同时影响采样值采样值又立即反馈到控制器如果你没有在回路里放一个单位延迟模块仿真器会报出代数环警告严重时甚至计算解不出来。解决方法是占空比信号先过一个单位延迟然后再给PWM发生器这样等效于实际的数字控制滞后一拍代价是系统稳定性会略降一点但这是任何真实数字控制都躲不掉的。我用的一段参考MATLAB脚本可以放在模型初始化里% 系统参数 L 2e-3; % 电感 C 470e-6; % 母线电容 R 120; % 负载电阻 Vg 311; % 输入电压幅值 Vref 400; % 输出电压 % 静态工作点 D 1 - Vg/Vref; IL Vref^2 / (Vg * R); % 线性化矩阵 A [0, -(1-D)/L; (1-D)/C, -1/(R*C)]; B [Vref/L; -IL/C]; % 增广误差积分状态 C_i [1, 0]; A_aug [A, zeros(2,1); -C_i, 0]; B_aug [B; 0]; % 权重初始值 Q diag([10, 0.01, 100]); R_w 1; % LQR求解 K_aug lqr(A_aug, B_aug, Q, R_w); k1 K_aug(1); k2 K_aug(2); k3 K_aug(3);这段代码跑下来K_aug会直接输出三个反馈增益。你只要把k1k2k3填到Gain模块里就行。顺便说一句lqr函数的求解过程会自动检查系统是否可控和是否满足Riccati方程的解存在条件如果报错先别怀疑算法回去检查你的A_aug和B_aug正负号。3.3 调参顺序与输入输出验证我调试的时候遵循一个固定顺序从不乱跳因为乱跳之后波形不对你根本不知道是谁引起的。第一步把电压外环断开直接给电流参考信号一个固定直流电平用LQR电流内环跑看电感电流能不能无静差跟踪一个直流阶跃。LQR设计正常情况下这个环节非常漂亮几乎没有超调上升时间可以做到1毫秒以内。如果连直流阶跃都跟踪不好回过去检查权重和积分器限幅。第二步给电流参考加上50Hz正弦波形这时候看跟踪误差。重点观察正弦波过零段这里电流小占空比反馈的灵敏度很低。如果过零段有明显畸形多半是积分器限幅太大或者电感电流采样噪声被LQR的高增益放大我通常的做法是把k1减小三分之一波形立刻改善。第三步把电压外环接上。电压环我习惯用传统PI带宽设得非常低大概10到20赫兹只负责慢速调整电流幅值指令不让它参与动态响应。接上之后再测输入电流THD我的目标通常是满载时THD低于5%在90%以上的典型工况LQR都能做到。第四步做动态测试。给负载电阻突降一半看输出电压跌多少、电流环能不能把输入电流重新拉回接近正弦。这是LQR的强项因为状态反馈把输出电压和电感电流的动态耦合在一起了负载突变之后电流响应会比纯PI快很多实测电压跌落的恢复时间能缩短百分之三十以上。还有一个验证习惯不要只看Simulink的波形图把仿真数据导出到MATLAB用fft函数算一次输入电流的频谱图直接看2次、3次、5次谐波分量。很多人用波形上的正弦形状来判断THD那是完全不可靠的波形看起来再正弦谐波也可能超标。实际算过才知道LQR调出来的波形如果是干净的谐波指标通常会很漂亮。4. 常见问题与排查技巧实录4.1 电流跟踪为何有稳态静差如果你发现LQR控制下的PFC电流怎么都跟踪不上指令先别怀疑权重调得不好先检查你是否真的做了增广误差积分。我最初的一个测试版本直接把连续LQR搬到电流回路上没加积分状态结果输入电流的波形虽然大概跟着正弦走但每一个周期都比参考滞后一点幅值也偏低这就是典型的纯状态反馈无法无静差跟踪正弦外部输入。处理办法就是回到2.2节补上误差积分状态同时把参考电流信号也导入控制器。还有一个小细节误差积分的参考要取“瞬时参考值”而不能取“幅值包络”不然相位信息丢掉了跟踪出来的东西相位全乱。如果在Simulink里看到积分器模块输入连的是幅值常数而非实时波形那一定是你接错了线。另一个容易被忽略的静差原因是采样时钟不同步。当ADC采样率高、控制频率等于载波频率时如果采样点落在开关周期的不同相位电流信号里会混入开关纹波LQR的状态反馈会把纹波当成真实状态来回推等效于引入了一个较小的偏置。解决办法是把采样触发设成PWM周期中心点对齐这样采集到的电流基本是纹波平均值跟踪静差会小得多。4.2 Q权重与占空比饱和的冲突LQR的数学解没有物理约束它不知道你实际能输出的占空比上限是多少。我用权重q1100时解出过k10.8表面上看状态反馈很快但实际仿真中占空比输出一过了0.9就开始削顶电感电流波形变成梯形跟正弦完全脱相。反而是q1设置在10附近时占空比稳定在0.3到0.7之间波形质量好得惊人。怎么看占空比是不是饱和了在Simulink里加一个Scope接在PWM调制波输出上然后在Scope里打开Y轴限幅设成0到1。如果调制波波形贴着限幅边界走那就说明权重重了。我还有一个小诀窍在控制输出后面加一个Saturation模块同时加一个饱和检测逻辑一旦占空比连续几个开关周期超过0.95就把误差积分器的输出直接清零。这个防饱和反推补偿器在LQR控制器里其实比在PI控制器里更需要因为LQR增益矩阵各状态之间互相耦合积分器一旦卷绕解耦恢复的时间会很长。4.3 离散化、仿真步长和模型失配的坑连续的LQR设计完成后直接丢进Simulink离散仿真器里是有风险的。理论上需要一个零阶保持器把连续LQR输出离散化同时把采样周期写进c2d变换。我踩过一次很典型的坑在连续域里设计的K_aug性能很好仿真步长设成1微秒也没问题但实际控制器代码的采样时间是10微秒直接挪用K_aug之后系统变成临界稳定。正确的做法是如果你要模拟真实的离散控制器就先用c2d把连续设备离散化再用dlqr设计离散LQR这样解出来的K矩阵和你的控制周期是匹配的。如果只做仿真验证那就在模型里用单位延迟模拟一拍控制延迟同时把采样保持时间设成PWM周期一致。两种方法我都推荐做一遍至少可以对比出离散化损耗了多少相位裕度。另一个问题是Simulink的仿真步长。我希望你千万不要图省事就用变步长默认设置跑这种PWM电路因为MOSFET开关瞬间没有固定步长仿真器会为了捕捉边沿把步长缩到几十纳秒整个仿真慢到让人想砸电脑。我个人的经验是固定步长开关频率100kHz时设置步长0.2微秒也就是每个PWM周期采样500个仿真点既保证波形精度又不会太卡。如果你只想看电流环的低频行为可以用平均模型跑快十倍但没法评估纹波。4.4 过零畸变与启动瞬态的终极处理PFC还有一个经典噩梦是输入电压过零附近电流畸变。LQR在这种场景下有什么特殊表现我观察到LQR由于包含输出电压的状态反馈在过零附近会同时看到输入电压塌陷和输出电压纹波的影响它确实会比PI更早产生反向补偿但如果增广积分器限幅还叠加了这个时刻的参考指令波形还是可能有一个短暂的小台阶。我的处理办法有两个第一在电流参考生成端加一个过零消隐取消过零前后10微秒内的积分累积给电感电流一个自然的续流窗口第二在LQR指令叠加端加一个低通滤波把过零引起的控制尖峰抹平。这两个办法组合起来会让输入电流在过零附近变成一个非常平滑的凹谷而不是一个尖刺THD数据也会明显变好。启动瞬态是最容易翻车的环节。你在Simulink里一开机就给400V阶跃LQR的反馈增益会把占空比压到极低然后电流建立不起来积分器一路累积到底。我的启动方式是“斜坡递增”电流参考幅值从零开始每毫秒提升额定值的5%一直到满载。这样LQR的每一条轨迹都在小信号范围内不会触发饱和也正好能发挥最优控制的线性特性。结尾把这些都做完之后我自己最大的感受是LQR做PFC电流环真正的门槛不在求解黎卡提方程而在于你得理解你正在控制的是一个实际物理系统。权重矩阵该设多大取决于你的器件额定值取决于采样频率甚至取决于你仿真步长选了多少——这些在教科书里都不会讲。如果你也正在折腾类似的东西我的建议是从一个已有的Boost PFC开环模型起步别一上来就搭完整的闭环。先把开环占空比加到合适工作点看电感电流和输出电压是否落到设计范围再切入LQR闭环。这样你手里有一个基准后面任何参数变动你都知道到底改变了什么物理行为。这套“基于Simulink的LQR最优PFC电流跟踪设计”的路子我已经用在了不止一个模拟项目里每次都比PI整定省下至少一半时间波形质量还有富余。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑