ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LLC电压闭环:PI与自抗扰ADRC仿真对比全解析

LLC电压闭环:PI与自抗扰ADRC仿真对比全解析 给全桥LLC谐振变换器搭电压闭环控制的时候很多人第一反应就是配一个PI环。我之前也这么干仿真里额定点波形漂亮到可以当教材可一旦把负载从满载拉到半载、再给输入电压来一个阶跃PI的表现就开始拉胯。后来我在同一个仿真模型里把自抗扰控制ADRC也跑了进去做对比才算把问题看清楚LLC的增益曲线会随负载和参数在整个工况范围内移动是一个强非线性对象拿固定工作点整定出来的PI去覆盖全工况本质上是在赌模型没变。这篇文章就是记录我做这两组电压闭环控制仿真对比的全过程控制对象、采样方式、负载场景完全一致区别只在于控制器用了PI还是线性ADRC从设计思路、参数整定到仿真发散排查都摊开讲给正在做LLC样机或者准备做LLC仿真对比的朋友一个可以直接下手的参考。1. 为什么LLC的电压闭环比想象中难缠1.1 增益曲线一张随负载和参数移动的“非线性的脸”LLC谐振变换器的核心是谐振腔由谐振电感Lr、谐振电容Cr和励磁电感Lm构成。用基波近似法FHA去看它的直流电压增益并不是恒定常数而是关于归一化频率fnfnfs/fr和品质因数Q的函数。Q又由等效交流负载电阻决定满载时Q大增益曲线在谐振点附近爬升和下降都更陡轻载时Q小曲线就变得平缓几乎成一条横线。这一点对电压闭环设计的影响非常大。变频控制本质上就是沿着增益曲线找输出电压对应的工作点想要压住输出电压就得实时调整开关频率。但因为这条曲线会随着负载移动同一个开关频率在满载和轻载下对应的输出电压会差出一大截。我仿真里按400V输入、24V输出的额定点设置了谐振参数满载用110kHz能稳住24V同一频率挂空载输出电压直接就冲到28V多这个开环差异就已经超出了大多数PI的纠偏能力范围。更麻烦的是谐振参数还有制造公差。Lr、Cr稍有偏差谐振频率就跟着漂移增益曲线整体的平移会让原本整定好的闭环参数全部失效。这是LLC比普通BUCK、反激麻烦很多的地方你面对的不是一根静态的增益线而是一张会移动的曲面。PI是按“对象是线性定常模型”假设设计的在这个场景下起点就不利。1.2 线性模型假设下的PI为什么总在赌工作点要给PI配参数得先把控制对象简化为一个小信号传递函数。LLC的小信号模型不是没有但它的状态变量多谐振网络里既有储能又有相位变化不同负载点下小信号传递函数的增益和相位都差很远。额定工况下你测得穿越频率3kHz、相位裕度50°到了一个较重负载点再测增益曲线带宽和相位特性全变了之前那套相位裕度可能只剩20°甚至更差再深一点就直接振荡。PI控制器本身没有模型补偿机制。比例项看当前误差积分项慢慢累计误差它完全不知道眼前这个系统的工作点已经换了一根增益曲线。遇到负载突变这种大幅扰动积分环节需要好几个周期甚至几十个周期去慢慢修正动态响应自然快不起来。你如果试图加大Ki换恢复速度在增益曲线陡峭的区间又很容易引发振荡因为相位储备早就被吃光了。我自己喜欢用一个开车的类比PI控制就像司机只盯仪表盘上的速度误差去踩刹车或油门误差大就深踩误差持续得久就继续加力但他完全不知道前面的坡度有多大。ADRC的思路不一样它先实时估计出当前坡度然后直接把对应的油门补偿量算进去。同样是下长坡一个是事后纠正一个是事前补偿动态性能自然拉开差距。2. 自抗扰控制落地方案二阶近似、LESO离散化与b0标定2.1 把电压环拆成二阶形式要在仿真或者工程上落地ADRC第一步是把被控对象写成ADRC要求的形式。LLC全桥的电压闭环里控制量我选开关频率fs被控量是输出电压Vout。输出电压经过输出滤波电容后从控制频率到输出电压本质上是两阶动态频率变化先改变谐振腔传递到副边的电流电流再给电容充放电形成电压。所以可以忽略内部高频谐振细节把对象等效写成二阶微分方程y f(y, 负载电流, 输入电压, 参数摄动) b0·u其中y是输出电压u是开关频率控制量b0是控制增益的粗略估计值f这项把模型误差、负载扰动、输入电压变化、谐振参数漂移全都打包成“总扰动”。ADRC的核心思想就是这个不去精确建模每一项扰动来源而是用扩张状态观测器ESO把f实时估计出来然后在控制律里把它补偿掉。b0的标定是这里最容易被忽略的环节。理论上b0可以从电路参数推算但实际谐振变换器里影响增益的因素太多我更推荐在仿真里做开环阶跃标定固定频率100kHz跑稳然后一次性把频率跳到101kHz记录输出电压的初始变化斜率结合输出滤波电容值折算到二阶模型里就能得到一个初始b0。我在自己的模型上标出来的数量级在2.5e5附近单位是V/s²/Hz这个数不同电路会差不少但标定流程是通用的。2.2 LESO离散化与一版能直接抄进仿真里的代码线性扩张状态观测器LESO是三阶的状态z1跟踪输出电压z2跟踪输出电压变化率z3跟踪总扰动f。连续域的观测器方程如下e z1 - y z1 z2 - β1·e z2 z3 - β2·e b0·u z3 -β3·e用带宽参数化取β13ωoβ23ωo²β3ωo³ωo就是观测器带宽。实际仿真里必须离散化我用最朴素的前向欧拉每个控制周期Ts更新一次。为了避免代数环控制量输入用的是上一拍实际发出的频率值u_prev。function [z1, z2, z3, u] adrc_step(y, r, Ts, wo, wc, b0, u_prev) persistent z1 z2 z3 if isempty(z1) z1 0; z2 0; z3 0; end e z1 - y; % 扩张状态观测器更新 z1 z1 Ts * (z2 - 3 * wo * e); z2 z2 Ts * (z3 - 3 * wo^2 * e b0 * u_prev); z3 z3 Ts * (-wo^3 * e); % 控制器输出 u0 wc^2 * (r - z1) - 2 * wc * z2; u (u0 - z3) / b0; % 限幅放在函数外面做频率下限80kHz上限150kHz end这段代码直接嵌在Simulink的MATLAB Function模块里就可以跑。关键点是u_prev必须是上一拍锁存的频率值不能是当前拍实时值否则采样点和PWM更新时序就会自纠缠。z1和z2的初始值最好在启动时用实际状态赋值我后面第5节会专门说初始值踩过的坑。2.3 控制律、带宽参数与b0试凑原则控制律看起来很简单但参数整定还是有不少讲究。线性ADRC就三个参数要定控制器带宽ωc、观测器带宽ωo、控制增益b0。控制器带宽决定了闭环响应速度u0 ωc²·(r-z1) - 2ωc·z2相当于一个临界阻尼的二阶期望动态。观测器带宽决定ESO跟踪总扰动的速度经验上取ωo 3~10倍的ωc。在100kHz开关频率的LLC电压环上我建议ωc先按2π×1000到2π×3000量级去试换算成穿越频率大概1~3kHz这个量级和PI整定的带宽差不多对比才公平。ωc太小动态肉太大则会放大量测噪声和开关纹波ESO的z3会高频抖动控制量也被带得来回跳。b0的试凑原则是“从小到大”。b0偏小ESO会把部分真实动态当成扰动去估计补偿力度不到位系统响应慢b0偏大控制器像在开环放大一个增益不准的对象很容易在负载切换时来回震荡。我的做法是在额定点标定出初始值后上下各扩5倍扫描一遍负载突变仿真选恢复时间平滑且控制量没有高频抖动的值。注意b0最终不可能完全精确ADRC容错能力强也恰恰体现在这里只要量级对剩下的偏差都会进f项被估计掉。3. 对照组PI不被诟病的整定套路3.1 用额定点小信号频率特性给PI画底线做控制器对比最怕的是给PI随手丢一组参数然后结论写着“PI不行”。要让人信服PI必须是认真整定过的至少保证它在额定工况的性能正常。我的办法是在Simulink里用线性化工具直接在额定工作点输入400V、满载300W、频率110kHz提取从频率控制量到输出电压的小信号传递函数然后按典型频域指标来配。电压环穿越频率我取3kHz左右大约是开关频率的3%这样既留出了足够的开关噪声衰减空间也不至于把谐振网络的相位拖垮。相位裕度目标设在45°到55°之间。LLC在这个工作点附近的幅频特性虽然有点谐振峰但控制器带宽远低于谐振频率时可以近似按一阶惯性加延迟处理用PI去补增益、稳相位。在我这台模型上按这个流程算出来的一组参数大约是Kp0.02频率调节量/电压误差量纲Hz/VKi300量纲Hz/(V·s)。注意这个数值只对这套主电路参数有效换个功率等级或者谐振参数必须重新线性化。我不建议直接抄参数抄整定流程才有意义。PI里我加了积分限幅防止启动阶段积分饱和把频率甩到下限。3.2 同一组PI参数在负载突变和输入跳变下的真实表现把PI配好后先在额定点空载到满载阶跃效果还不错超调在8%左右恢复时间约5ms算是能看的工程水平。但这组PI的价值恰恰体现在离开额定点之后。做负载切换测试时满载跑到50%负载再拉回满载PI控制的输出电压会出现明显的电压凹陷和凸起最大偏差能到0.6V以上恢复回1%误差带大概要12ms左右。再做输入电压阶跃从400V直接跳到350V输出会先跌掉近1V才慢慢拉回。原因是显而易见的负载变了等效品质因数Q变了增益曲线变了额定点整定的那点相位裕度被消耗得差不多了PI只能靠积分慢慢磨。这里我要强调这并不意味着PI在LLC上完全不能用。很多量产LLC电源照样用PI只是往往要配合分段参数、前馈补偿甚至查表增益校正。但如果你希望用一个统一控制器去覆盖全工况PI要做的工作量非常大。ADRC在仿真里替代PI之后同样的负载和输入扰动场景输出的最大偏差和恢复时间都明显更好控制量也更平滑这份对比数据支撑起了最终选型的方向。4. 全桥LLC主电路建模与六种对比场景4.1 主电路参数与仿真环境选择为了对比有参照主电路我按一块300W全桥LLC样机的参数建模。输入400V直流输出24V/12.5A谐振频率设计在100kHz。变压器变比n取8.3:1谐振点在额定输出时增益约等于1。具体参数如下表参数数值说明输入电压Vin400V DC测试时阶跃到350V输出电压Vout24V闭环目标值额定功率300W负载突变在50%~100%间谐振频率fr100kHzLr与Cr串联谐振点谐振电感Lr22μH用EE磁芯自行绕制谐振电容Cr115nF薄膜电容低ESR励磁电感Lm110μH约5倍Lr变压器变比n8.3:1原边副边输出滤波电容Cout470μF电解薄膜并联等效死区时间200ns防止全桥直通仿真环境我用了PLECS跑主电路因为PLECS的开关模型在固定步长下更稳跑100kHz谐振不容易数值发散PWM生成也更直接。当然SimulinkSimscape Electrical也能做步骤基本一样但求解器建议用固定步长步长设到50ns左右一个开关周期10μs能采到200个点谐振电流波形才平滑。如果你只跑控制环验证不管波形细节可以用平均模型来加速但做ADRC和PI的暂态对比我还是推荐带开关的电路模型能真实反映ESO噪声来源。4.2 控制环离散化、采样点与PWM更新时序两个控制器的采样和控制更新帧率保持一致才有对比意义。我把控制周期Ts设为10μs也就是每个开关周期更新一次频率给定。输出电压用均值采样采样时刻选在PWM周期中段避开桥臂开关动作的尖峰。ADRC和PI的离散格式都按零阶保持处理控制器输出经过限幅后进入压控PWM发生器范围限制在80kHz到150kHz。有一个细节需要特别提PWM生成器的频率给定更新必须延迟一拍。也就是说第k个控制周期采到的电压算出来的频率值在第k1个PWM周期才真正生效。这样做的目的是切断采样输出与控制输出之间的代数环并且完全模拟数字控制器“采样-计算-更新”的真实时序。PI和ADRC都在同一套一拍延迟下工作不影响公平性。ADRC代码里的u_prev就是这一拍锁存值。4.3 对比场景、量化指标和一组典型仿真数据我设计了四组对比场景每组都同时跑PI和ADRC软启动结束后闭环切入观察启动超调负载从100%切换到50%保持5ms后再切回100%输入电压从400V阶跃到350V观察输出跌落将Lr参数从22μH调到24.2μH模拟谐振参数漂移10%重跑负载切换量化指标我重点记录四样输出电压超调量、扰动后恢复到1%误差带的时间、稳态误差、以及控制频率量的变化斜率反映控制动作是否粗暴。下面是一次典型仿真的记录不是理论推导具体数值会随模型细节浮动但趋势有参考价值指标PI控制自抗扰控制启动超调8.2%6.5%满载→半载恢复时间12ms4ms输入阶跃最大跌落0.9V0.35V参数摄动后满载恢复时间15ms4.2ms稳态误差±0.05%±0.05%控制量最大变化斜率较高有明显阶跃平滑有缓坡两组控制器的稳态误差表现相当这符合预期因为ESO的补偿本质上也让ADRC具备了积分作用。拉开差距的全在动态过程上PI是事后纠偏型ADRC是事前补偿型。负载突变和输入阶跃这类扰动ESO只需要几个控制周期就能把总扰动f估计出来并前馈补偿掉PI还在等积分慢慢爬。参数摄动场景更明显相当于整个增益曲线平移了PI完全蒙在鼓里ADRC几乎不受影响。5. 仿真发散复盘步长、代数环、ESO初值的连锁反应5.1 仿真发散的高频元凶清单LLC仿真发散几乎每个做这块的人都会碰到我用一个表把最常见的原因和特征列出来方便排查时对号入座发散原因典型表现处理办法固定步长过大谐振电流波形毛刺、尖峰不收敛步长缩到开关周期的1/100以内即100ns以下代数环控制器输出和PWM更新同拍纠缠仿真直接报错或剧烈振荡采样输出加ZOH或Memory块控制更新延迟一拍b0取值过大控制频率在上下限之间来回跳输出电压抖成锯齿减小b0回开环阶跃重新标定ESO带宽过高z3跟踪到大量开关纹波控制量高频抖动ωo降到ωc的3~5倍采样前增加均值滤波PI积分饱和启动阶段频率顶到限幅输出大幅超调后振荡给积分单独限幅软启动阶段降低PI增益死区时间过大或过小桥臂换流异常电流突变按谐振电流换流时间重新设200ns附近微调列完之后你会发现大多是控制器实现了但时序和数值鲁棒性没跟上跟控制算法本身反倒没关系。ADRC和PI在仿真里都因为上面这些原因发过散不是ADRC就一定不会出问题。5.2 从开环到闭环的排查顺序我自己的排查顺序固定为五步每步都有明确目的。先跑开环定频固定fs110kHz跑够十个谐振周期检查谐振电流是否对称、输出电压是否落在理论值范围。如果这一步发散问题一定在主电路参数、死区时间或者求解步长跟控制器无关别急着调控制参数。第二步跑PI闭环但把Ki设成0只保留比例项Kp从0开始缓慢增大观察输出是否出现自激。这一步能快速定位是否采样时序和一拍延迟有问题。第三步跑ADRC时先不接z3/b0补偿只让ESO跟着输出电压走把z1和真实输出电压放到同一个scope里看重合度。ESO都跟不上实际状态就去调ωo或者初始值这时候强行闭环必炸。第四步才把补偿量z3/b0接入控制律同时把限幅打开。每次改变参数只跑一个场景不要一口气同时改三个参数否则发散了你根本不知道是谁造成的。第五步上述四步全通了再拉到负载切换、输入阶跃、参数摄动这些大扰动场景去压这时候出的问题基本就是真实的控制带宽取舍问题了数值发散反而少。5.3 我踩过的坑ESO初值与软启动切换ADRC仿真最容易让人栽跟头的地方是ESO初值。Simulink里一开机输出电压从0爬升但ESO的z1初始化为0倒还好z2初始化为0就麻烦因为启动时输出电压变化率其实很大。z3初始化为0更是问题启动阶段真实总扰动几百几千观测器要花不少周期才能追上去追上之前补偿量是错的控制频率可能被甩到限幅上整个启动过程变成失控状态波形一片乱七八糟。我的解决办法是把启动流程拆成两段。第一段用开环软启动给定频率从110kHz开始沿斜坡向下扫到接近额定工作点让主电路自己把输出电压拉到额定值附近期间ADRC的ESO照常运行、跟踪当前输出电压和变化率但不参与控制。第二段等Vout稳定到24V之后手动把ESO的z1赋成当前输出电压采样值把z2赋成当前电压变化率估计值软启动段持续运行一个短期的差分器就能拿到z3保持0然后再切入闭环控制。这么做之后启动切换几乎无缝ADRC控制量没有突变这个细节论文里很少写但在仿真和样机上都是保命的一步。还有个小技巧也要提一下控制周期里更新顺序必须固定先更新ESO再计算控制量而且ESO的输入电压y必须是本次采样周期的新电压不能拿上一拍的旧值否则相位滞后会额外增加真实硬件里ADRC性能会比仿真差很多。把这些时序细节处理干净之后我的对比仿真才算真正跑得又稳又可信最终数据才敢用来支撑控制器选型结论。就目前手里的项目来说下一版样机基本就是按这套ADRC参数去推了b0会再结合实测功率级重新标一遍。如果这篇文章能帮你在自己的仿真里少炸几次示波器那就值得了。
返回列表