ARTICLE DETAIL

资讯详情

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

开关电源环路稳定实战:PID与零极点配置全解析

开关电源环路稳定实战:PID与零极点配置全解析 我到现在还记得第一次调UC3843反激电源的情形。板子通电后输出不是一条干净的12V而是一串锯齿波叠加在直流上频率不高大概几kHz看着像台心电图机。当时我以为是滤波电容容量不够拼命加大电容结果纹波一点没变。后来才明白环路自激振荡了。我讲这个开头是想说一件事开关电源的“环路稳定”不是一个玄学问题也不是把PID参数随便凑一凑就能解决的事。标题里那串词——PID、零极点配置、控制环路翻译成人话就是你往反馈回路里放的每一颗电阻电容都在决定电源是安静稳压还是原地抽搐。这篇文章想把从零构建控制环路的完整路径理一遍先搞清楚环路在稳什么再给功率级建模然后把PI D和零极点对应起来最后用一个12V转5V/3A的Buck实例从头算到尾并把实测调试、数字PID这些坑也一并填上。适合谁看如果你调过电源见过输出莫名其妙地抖或者你刚接触开关电源手里拿着《开关电源设计第三版》想找一条能复现的路径这篇文章应该都能帮上忙。1. 别急着调PID先看懂环路为什么会震荡1.1 你看到的震荡其实是增益和相位问题很多人第一次接触环路补偿时第一反应是“我加个PID输出不是就稳了吗”但在电源里这个思路往往带来反效果。你加了一组Kp、Ki、Kd示波器上的波形可能更乱了因为你不清楚电源回路里真正在发生什么。负反馈环路的核心其实很简单输出电压升高了反馈采样就让占空比变小输出电压降低了占空比就变大。问题出在“从采样到调节”这条链路里每一级都有延迟。分压电阻有延迟吗几乎没有但误差放大器有带宽限制光耦有传输延迟PWM比较器有响应时间功率级的LC滤波器更是天然地把相位往后拖。你把这些延迟全部加起来频率越高总相位滞后就越大。当总相位滞后达到180°时负反馈就变成了正反馈。此时如果开环增益还大于1环路就不需要外界激励自己会持续振荡下去。这就是你在示波器上看到锯齿波、方波、甚至低频呼吸波的根源。判断是否稳定不能光看输出波形“好像还行”要回到控制理论里那个经典判据开环传递函数的幅频曲线穿过0dB时的频率称为穿越频率fc在这个频率点上相位离-180°还剩多少度称为相位裕度PM。穿越频率决定了动态响应速度相位裕度决定了稳定性。两者必须一起看。1.2 穿越频率和相位裕度怎么设才合理开关电源里穿越频率不是一个可以随便拍的数字。它受开关频率的硬约束。PWM调制器和采样环节天然引入约1.5个开关周期的等效延迟。频率越高这个延迟带来的相位滞后越严重。所以实际工程里穿越频率一般取开关频率的1/10到1/20。比如100kHz的开关频率穿越频率就放在10kHz附近反激或正激这种延迟更大的拓扑取1/20甚至更低。相位裕度我个人的习惯是至少45°目标60°。45°能用但动态响应会有明显振铃60°左右比较舒服过冲可控恢复时间也短。增益裕度也要留10dB以上。别小看这个指标有些环路相位裕度看着够了但增益曲线在某个频率又反弹回0dB以上照样会振荡。提示调环路前先把示波器探头的地线夹减到最短用接地弹簧替代。否则你测到的“震荡”可能只是探头地线太长拾取的开关噪声不是真正的环路自激。2. 功率级才是主角占空比到输出的传函里藏着什么2.1 Buck的小信号模型和LC双极点补偿器设计的关键是知道你正在补偿的“被控对象”长什么样。对电源来说被控对象就是从占空比到输出电压之间的传递函数。以电压模式Buck为例忽略寄生参数时这个传递函数可以写成Gvd(s) Vin * (1 s/ω_ESR) / (1 s/(Q·ω0) (s/ω0)^2)这个式子的物理含义很清楚占空比扰动先经过一个LC低通滤波器再变成输出电压扰动。LC谐振点是这对双极点的位置f0 1 / (2π·√(L·C))问题就出在这对双极点上。二阶LC网络在谐振点附近的相位下降非常快接近-180°。也就是说你什么都不做的话功率级本身就已经把相位消耗得差不多了。补偿器的作用就是在这个基础上“增加零点垫相位、增加极点压高频增益”把环路重新塑造成一个越过0dB时还有足够相位余量的样子。很多入门者喜欢把精力花在计算电感电流纹波、MOS管损耗上到了环路设计这里就随便从别人原理图抄一个RC网络。但恰恰是这组电阻电容决定了你的电源是稳定还是振荡。2.2 ESR零点一颗电容就能改变环路性格LC双极点之后还有一个容易被忽略的成员输出电容的等效串联电阻ESR会引入一个零点。f_ESR 1 / (2π·ESR·Cout)零点的作用是给相位“加分”所以在某些拓扑里ESR零点刚好落在穿越频率附近反而帮你稳定了环路。这也是为什么老一代电源设计里喜欢用ESR比较大的电解电容来“压住”环路。你用一颗ESR只有几毫欧的MLCC陶瓷电容可能容值很大、纹波也很小但ESR零点被推到了上百kHz原本能帮上忙的相位提升没了环路反而需要更强的补偿才能稳住。这背后有一个非常反直觉的结论单纯从输出纹波角度我们喜欢低ESR电容但从环路稳定角度低ESR电容往往更难补偿。我在实际选型时会先找出电容的ESR零点频率。如果它落在穿越频率的1/3到3倍区间内环路设计要简单很多如果它远高于穿越频率那就要做好用Type III补偿来自己提供足够相位的准备。2.3 反激和正激的右半平面零点Buck不会遇到的麻烦反激和正激会遇到。连续导通模式CCM下反激变换器从占空比到输出的传递函数里有一个右半平面零点RHPZ。右半平面零点这个名字很吓人但它的物理故事其实不复杂。占空比突然增大意味着初级电感储能时间变长但次级二极管导通时间变短输出在短时间内反而会先掉下去等到储能释放后输出才慢慢升上来。这种“先反向、再正向”的响应特征在频域里体现为一个右半平面零点。麻烦的地方在于右半平面零点不提供相位提升反而贡献相位滞后而且这个问题没法用补偿零点抵消。你只能在设计时把穿越频率压低通常压到右半平面零点频率的1/3以下。反激电源之所以“感觉很难调”很多时候不是补偿参数算得不对而是穿越频率目标一开始就定高了。这也是为什么很多反激方案直接用UC3843这类电流模式控制芯片。电流模式内环把电感的“坏脾气”驯服了功率级从二阶变成一阶右半平面零点的影响也要小很多。代价是峰值电流模式在占空比超过50%时需要斜率补偿否则会看到一种独特的“隔一个周期跳一个脉冲”的次谐波振荡。2.4 电流模式控制为什么比电压模式好补偿电流模式控制的本质是在电压外环的内部加了一个电流内环。这个内环把电感变成了受控电流源对外的表现是外环看过去不再需要面对LC双极点的巨大相位跌落功率级的传递函数退化成只有一个主极点的一阶系统。一阶系统的好处非常明显相位变化平缓补偿起来不需要那么多零点一个Type II补偿器就够用。所以很多厂家方案里反激用电流模式光耦TL431补偿网络做得很简不是因为他们偷懒而是拓扑本身就降低了补偿难度。但这个由内向外的好处是“有条件”的。内环的电流采样增益、斜率补偿深度、开关周期延迟都会影响实际等效模型。有些时候你按一阶系统设计好补偿却发现实际环路相位裕度比预期差很多大概率是内环的寄生延迟没有被充分建模。3. 补偿网络的零极点配置PID在电源里长什么样3.1 教科书PID和电源补偿器的对应关系先摆一个观点电源环路里你确实可以写PID代码但等你真正做模拟补偿器时更常见的说法是“Type II补偿器”“Type III补偿器”而不是“PID”。这两个概念并不矛盾它们说的是同一件事系统需要积分项消除稳态误差需要零点来提升相位需要高频极点来抑制噪声。对应关系是这样的控制概念电源补偿器中的实现典型网络元件比例项P中频段增益电阻比值积分项I原点极点积分电容微分项D零点相位提升电阻电容串联低通滤波高频极点并联小电容我记得自己第一次对照这组映射时有种豁然开朗的感觉。以前在电机调速里写PIDKp给大了超调Ki给大了低频抖动Kd给大了噪声全进来了。到电源里这些现象一一对应到补偿器的零极点位置和增益设置上只不过表达方式从“三个数”变成了“几个电阻电容的位置”。有个细节值得注意电源补偿器很少直接做纯微分项。开关电源的高频噪声极其丰富纯微分在频域里是高频增益无限抬升会把开关噪声放大到崩溃。所以电源里用零点来垫相位同时在更高频段用极点把增益压下去本质上是一个“带低通滤波的PD”只是这个低通滤波的位置很高通常放在开关频率附近。3.2 Type II与Type III选型逻辑Type II补偿器简单说就是“一个原点极点 一个零点 一个高频极点”。它能提供的最大相位提升小于90°。这种结构适合两类场景第一类电流模式控制下功率级是一阶系统不需要太多相位补充第二类输出电容ESR较大ESR零点本身就在穿越频率附近帮忙垫相位。Type III补偿器是“两个零点 两个高频极点 一个原点极点”。两个零点可以抵消功率级的双极点理论相位提升接近180°这是电压模式Buck的标准解。选型逻辑其实就一句话看控制到输出的传递函数里在穿越频率附近存在几个“需要被抵消”的极点。只有一个主极点用Type II有LC双极点用Type III。很多初学者问我既然Type III那么强为什么不干脆都用Type III因为Phase boost越大系统对噪声越敏感高频极点位置也越难摆。Type III的相位提升会带来更高的中频增益如果周围有一点点寄生耦合很容易在某个高频点激励出振荡。能用Type II解决的问题我不会轻易上Type III。3.3 K因子法把相位裕度变成可计算的数零极点配置听起来很玄但有一个非常实用的工具叫K因子法它的核心思想是把你想要的穿越频率fc和相位裕度PM换算成一组关于fc对称放置的零点和极点。对于Type III常见的做法是把两个零点放在同一个频率fz两个极点放在同一个频率fp让它们围绕fc几何对称fz fc / √K fp fc · √KK值越大零点和极点分得越开在穿越频率处能提供的相位提升越大。如果需要在穿越频率处让补偿器提供φ度的相位提升可以这样算单对零极点提供的提升φ_single φ/2然后用√K tan(45° φ_single / 2)这个公式的好处是你不用去查一大堆波特图拿计算器就能把零极点位置敲出来。实际设计时我会在此基础上留10°左右的裕量因为功率级模型、反馈分压网络、光耦传输都会引入额外相移算得正好等于60°上板往往只有50°不到了。4. 手算一个完整例子12V转5V/3A Buck控制环4.1 确定功率级参数和穿越目标空谈理论没有用我习惯把数字摆出来算一遍。这里用电压模式Buck做例子因为它的双极点特性最能体现零极点配置的价值。设计规格参数数值输入电压12V输出电压5V负载电流3A开关频率100kHz电感33µH输出电容220µF陶瓷ESR约5mΩ先算功率级的关键频率。LC谐振点f0 1 / (2π·√(L·C)) 1 / (2π·√(33µH · 220µF)) ≈ 1.87kHzESR零点f_ESR 1 / (2π·ESR·Cout) 1 / (2π·0.005Ω · 220µF) ≈ 145kHzESR零点远高于我们即将设定的穿越频率所以指望不上它需要Type III补偿器自己提供足够的相位。穿越频率取开关频率的1/10也就是10kHz。4.2 计算补偿器目标零极点在10kHz处功率级增益和相位是多少因为10kHz远高于LC谐振点、又远低于ESR零点功率级近似为二阶衰减段。占空比到输出的直流增益约为输入电压12V在谐振以上增益按-40dB/dec下降|Gvd(fc)| ≈ Vin · (f0 / fc)^2 ≈ 12 · (1.87k / 10k)^2 ≈ 0.42转换成dB就是约-7.6dB。相位方面LC双极点已经把相位拉到接近-180°ESR零点在145kHz还没怎么生效所以在10kHz处功率级相位大约-176°。目标是整个环路在10kHz穿越相位裕度60°。那么环路总相位在穿越点要达到-120°。功率级已经贡献了-176°补偿器需要额外提供相位移需求 (-120°) - (-176°) 56°用K因子法。Type III有两个零点和两个极点所以56°由两对零极点分担每对需要提供28°的提升√K tan(45° 28°/2) tan(59°) ≈ 1.664所以K≈2.77。零点位置fz fc / √K 10kHz / 1.664 ≈ 6.0kHz极点位置fp fc · √K 10kHz · 1.664 ≈ 16.6kHz也就是说补偿器的目标传递函数可以写为Gc(s) Kc · (1 s/(2π·6.0kHz))^2 / ( s · (1 s/(2π·16.6kHz))^2 )其中Kc由“在10kHz处提供约2.4倍增益”来确定具体算出来约5.4×10⁴ rad/s。这个传递函数就是我们要用Type III RC网络去逼近的目标。量级和位置都有了下一步就是仿真验证。4.3 仿真验证环路和负载阶跃手算只能作为起点必须要用仿真验证一遍。我习惯用MATLAB或Python的control库把功率级传递函数和补偿器传递函数乘起来画开环Bode图。如果你用Python核心代码大概长这样import control as ct import numpy as np fc 10e3 wz 2*np.pi*6.0e3 wp 2*np.pi*16.6e3 Kc 5.4e4 # 功率级Buck Gvd近似模型 num_p [0.005*220e-6, 0.005, 12] # 略这里只示意 den_p [33e-6*220e-6, 33e-6/0.005, 1] # 补偿器 num_c [Kc, Kc*2*wz, Kc*wz**2] den_c [1, 2*wp, wp**2, 0] loop ct.feedback(ct.tf(num_c, den_c) * ct.tf(num_p, den_p), 1)仿真结果应该看到穿越频率落在9~10kHz相位裕度55°~60°。然后加载一个0.5A到3A的阶跃观察输出电压波形。相位裕度60°左右时恢复过程应该只有轻微振铃大概振荡1到2个周期就收敛。这一步非常关键。我没见过哪个电源能完全靠手算一把过仿真相当于给你一个“预排雷”的机会把寄生参数、采样延迟、光耦带宽这些影响因素先用理想模型跑一遍。等仿真结果正常了再上板实测才有底气。5. 实物调试与数字环路从零极点回到PID5.1 实测环路需要用到的设备和步骤仿真做得再漂亮最终也要在板子上见真章。最可靠的方法是用网络分析仪或频率响应分析仪比如Bode 100在反馈环路里注入一个小信号扰动扫频测出环路增益和相位。注入点通常选在反馈电阻分压点和误差放大器之间用隔离变压器把信号注入进去然后在注入点两侧分别用两个探头测输入和输出信号分析仪就能算出环路的伯德图。没有专业设备的土办法也有至少能做大致的稳定性判断用电子负载给电源加一个阶跃观察输出电压的恢复波形。相位裕度低的系统恢复过程会有明显的振铃振铃超过3个周期基本可以断定相位裕度严重不足。这个方法精度不高但能帮你快速筛查是不是环路问题。实测时特别要注意小信号注入幅度。注入信号太大会让环路进入非线性区测出来的相位裕度虚高注入信号太小又会被噪声淹没。一般取输出电压的1%~2%左右电流模式反激电源还要更低一点。5.2 常见震荡现象的排查思路我把实际调试中遇到的振荡现象整理成一个快速对照表方便你上板时按图索骥震荡现象频率特征最常见原因输出叠加高频锯齿波与开关频率一致测量方法问题、地弹、探头地线过长输出呈方波状跳跃约半个开关频率峰值电流模式次谐波振荡需斜率补偿输出低频呼吸式波动远低于开关频率环路相位裕度不足补偿太激进轻载才震荡模式切换处电流断续/连续模式切换时环路增益突变重载加载瞬间跌得极深动态响应慢穿越频率太低或反激右半平面零点限制排查的第一原则是先排除测量问题再怀疑环路问题。我见过很多次所谓“环路震荡”最后发现是探头地线太长、示波器带宽不够、或者探头接在了电感正上方。把这些外部因素都排除后再动补偿参数。5.3 用STM32做数字PID时要注意什么把模拟补偿器换成数字PID设计目标并没有变还是穿越频率和相位裕度。但数字环路多出两个麻烦采样延迟和PWM更新延迟。ADC采样输出电压CPU算PID再把占空比更新到PWM寄存器整个过程至少消耗1个开关周期再加上PWM本身的对齐方式等效延迟通常在1.5个开关周期左右。这个延迟在低频下无关紧要但随着穿越频率升高相位惩罚会越来越明显。所以数字电源的穿越频率设置要更保守一些一般不超过开关频率的1/15。增量式PID是电源里很常用的一种实现方式因为它天然不容易产生大的突变。离散公式是u(k) u(k-1) Kp·[e(k) - e(k-1)] Ki·e(k) Kd·[e(k) - 2e(k-1) e(k-2)]对应的C代码骨架static float e_prev, e_prev2, u_out; float pid_update(float ref, float fb) { float e ref - fb; float delta_u; delta_u Kp * (e - e_prev) Ki * e Kd * (e - 2.0f * e_prev e_prev2); u_out delta_u; if (u_out UMAX) u_out UMAX; if (u_out UMIN) u_out UMIN; e_prev2 e_prev; e_prev e; return u_out; }这里Ki、Kd都是处理过采样周期和开关周期的折算系数不是随便拍的。ADC的采样时刻尽量对准PWM的开关中点这样可以采到电感电流平均值附近的输出电压减小开关噪声对采样值的污染。积分限幅一定要做否则负载突然变化时PID输出会长时间饱和恢复时间变得很长。从控制的角度看数字PID里的积分项对应模拟补偿器的原点极点微分项对应零点。如果你想复现前面Type III补偿器的效果就需要在两个零点位置配置好Kp、Ki、Kd之间的关系必要时再加一个数字低通滤波器来模拟高频极点。殊途同归。5.4 一点个人调试经验最后说点掏心窝子的话。我在调试电源环路上的几个体会第一一次只改一个参数。很多人喜欢同时调三四个电容电阻然后看“好像好了一点”但根本不知道是谁起的作用。这个习惯必须改。每次只改一个元件记录波形改回来了再动下一个。第二手算、仿真、实测三者要互相印证。手算给出方向和目标仿真验证零极点摆放是否合理实测确认最终结果。如果仿真和实测差得远不要急着改补偿先检查功率级的寄生参数、PCB布局、探头接地大多数差异都来自模型没建准。第三不要怕把穿越频率往低调。很多震荡问题不是补偿不够是你想要的响应速度超出了物理极限。给环路留出足够的相位裕度比追求一个“很快但毛刺很多”的动态响应重要得多。我做电源这些年最深的体会是控制环路并不是一块单独的知识碎片它是功率级模型、元件寄生参数、布线寄生、采样延迟这些所有问题的汇聚点。你在示波器上看到的每一次抖动背后都是一整套物理过程在说话。听懂了就好调了。
返回列表