做电源这行的人一天里能念上几十遍“BUCK电路”。它是最基础的降压型开关电源拓扑一颗高边开关管、一个续流元件、一颗电感和一颗输出电容凑在一起就能把 12V 压到 5V、把 24V 压到 3.3V效率还常常能压在 90% 以上。别看结构简单真要把 BUCK 电路做稳、做凉、做便宜里面的门道足够写一本书——环路会不会振荡、轻载效率掉不掉、上电会不会炸管、EMI 能不能过几乎每一个问题背后都能追溯到选型和布局的某一个细节。这篇东西我打算按我自己带项目时的思路讲先把拓扑和工作波形掰开揉碎再把参数计算落到具体数字上然后走一遍从仿真到 PCB 再到实测的完整流程最后把这些年踩过的坑整理成一份速查表。适合刚入行想快速上手的硬件工程师也适合做了几年模拟电路、第一次真正独立扛 BUCK 项目的人。1. BUCK电路到底是什么从拓扑到工作波形1.1 一个开关加两个储能元件凭什么能把电压降下来很多人第一次看 BUCK 电路会懵开关管一会儿通一会儿断电感两端的电压一会儿是 Vin-Vo、一会儿是 -Vo输出怎么就变成一条平直的直线了关键在于电感电流不能突变。电感是个“电流惯性”元件你想让它电流变大得给它加正向电压一段时间你想让它变小得给它加反向电压一段时间。BUCK 电路干的事情说白了就是高边开关导通时把 Vin 接到电感左端电感电流线性上升同时给负载供电、给输出电容充电高边开关关断时电感左端电压被拉低续流元件二极管或低边 MOS导通电感储存的能量继续给负载供电电流线性下降。电容在这中间扮演的角色是“水库”。开关频率通常是几百 kHz 到几 MHz负载根本感知不到这个频率的波动它只看到电容上被抹平的那个平均值。我把这个过程比作拧水龙头你用手以每秒几千次的频率拧开又关上水龙头出水是脉冲式的但下面接一个大水桶再往外放水出水就是连续均匀的。电感就是那个“水流的惯性”电容就是那个“桶”。理想情况下稳态时电感的平均电压必须为零——这是伏秒平衡也是理解所有开关电源的第一把钥匙。高边导通期间电感承受的电压是 Vin - Vo持续时间是 D·Ts关断期间承受的是 -Vo忽略二极管压降持续时间是 (1-D)·Ts。两者面积相等(Vin - Vo)·D·Ts Vo·(1-D)·Ts两边一约就得到那个所有人都背过的公式Vo D · Vin这里 D 是占空比。这意味着 BUCK 的输出电压永远小于等于输入电压占空比 D 永远落在 0 到 1 之间。反过来如果你想做升压就得换 BOOST 拓扑如果输入可能高于也可能低于输出那就得上 BUCK-BOOST 或者四开关的升降压电路这也是为什么“buck boost”这个词在搜索里总跟“buck 电路”绑在一起出现。实际工程中这个公式要打折。高边开关有导通电阻 Rds(on)电感有 DCR续流路径也有压降所以真实占空比会略大于 Vo/Vin。做 12V 转 5V 时理论 D 41.7%实测往往在 44%~46% 之间多出来的部分就是在补偿这些损耗。你在调试时如果发现占空比比理论值高出一大截八成是有额外的串联电阻或者开关速度太慢导致的。1.2 连续导通和断续导通CCM 与 DCM 的分界线在哪电感电流在整个开关周期内都不降到零这叫连续导通模式CCM如果电流在中途降到零并且保持为零一段时间就是断续导通模式DCM。这两种模式的传递函数、环路特性、输出电压调整率完全不同做设计时必须清楚你的电路工作在哪个区间。电感电流的纹波峰峰值是ΔIL (Vin - Vo)·D / (fsw · L)定义纹波率r ΔIL / Io。CCM 和 DCM 的临界点就是 r 2也就是电感电流峰值刚好触到零。换句话说临界电感是Lcrit Vo·(1-D) / (2 · Io · fsw)实际设计里我一般把满载时的纹波率 r 控制在0.3~0.4之间绝不会让它贴着 1 甚至更高。原因有两个一是纹波率太大电感峰值电流高、饱和风险大、输出纹波也大二是纹波率太小电感量就得做大体积和成本都上去了而且环路会变得更难补。0.3 到 0.4 是我自己试下来比较舒服的区间。有一点必须提醒即使你按满载设计成 CCM轻载时电路一定会进入 DCM。因为 Io 变小了ΔIL 是不变的只要 D 不变r ΔIL/Io 就会往上飙。异步 BUCK 进入 DCM 后二极管反向截止输出电压会略微抬升同步 BUCK 如果低边管允许反向导通强制 CCM那它就不会进 DCM但会在轻载时出现电流倒灌、效率下降的问题。这就是为什么很多同步 BUCK 芯片都有“省电模式”或者“脉冲跳跃模式”的开关——本质上是在轻载时把低边管关掉主动进入 DCM。注意DCM 下 BUCK 的传递函数会从二阶变成一阶相位裕度看起来更漂亮但增益随负载变化剧烈负载跳变响应会变差。如果你的应用会在大范围负载下工作建议按最恶劣的工况通常是最小负载但仍在 CCM 边界上方校核环路。1.3 同步 BUCK 和异步 BUCK差的那个二极管到底值不值异步 BUCK 用肖特基二极管续流同步 BUCK 用一颗低边 NMOS 代替二极管。单看器件成本肖特基二极管可能只要几分钱MOS 加上驱动可能要几毛但为什么现在几乎所有的中低压大电流场合都换成了同步方案核心原因是损耗结构不一样。异步 BUCK 的续流损耗是 VF · Io · (1-D)肖特基 VF 一般 0.3~0.5V。12V 转 5V、3A 输出、D 0.45 的情况下光二极管这一项就是 0.4 × 3 × 0.55 0.66W。同步 BUCK 换成 Rds(on) 10mΩ 的 MOS损耗是 Io² · Rds(on) · (1-D) 9 × 0.01 × 0.55 0.05W。差了 13 倍。只要输出电流超过 1A这个差距就足以让同步方案在效率上全面胜出。但同步方案也有代价。第一是死区时间高边关断和低边导通之间必须插入死区否则上下管同时导通会直接短路炸管死区期间体二极管导通损耗比二极管方案还高体二极管 VF 更大。第二是驱动复杂度低边是浮地的源极跟随器需要自举或者隔离驱动多了一套自举电路。第三是轻载效率低边管可双向导通轻载时会从输出抽电流反向充到输入产生额外环流损耗。我自己的经验是输出电流 1A 且对成本敏感用异步输出电流 2A无脑上同步。中间的区间看你对轻载效率的要求。如果是电池供电、待机时间敏感的场景即使电流不大也建议同步但一定要选支持 PFM/省电模式的控制器。1.4 关键波形与伏秒平衡把示波器探头放对位置调试 BUCK 的时候有几处波形是必须看的SW 节点电压、电感电流、输出纹波、输入电容电流。SW 节点是最有信息量的一个点——它的上升沿和下降沿能告诉你开关速度、有没有振铃、死区是不是合适高电平是不是干净的 Vin低电平是不是干净的地一眼就能看出布局有没有问题。电感电流没法直接看通常用电流探头夹在电感引线上或者在低边管源极串一个采样电阻。我更习惯用电流探头因为它不影响电路。看电流波形时重点看三件事一是波形是不是三角波如果看到平顶说明电感饱和了二是平均电流是不是等于负载电流三是轻载下是不是出现了零电流平台说明进了 DCM。输出纹波要看两个成分ESR 引起的方波分量和电容充放电引起的三角分量。很多新手拿到示波器一看纹波是个方波就以为电容容量不够拼命堆电容结果纹波一点没降——因为那个方波是 ESR 造成的堆容量没用得换更低 ESR 的电容或者在电容上并联 MLCC。实测技巧测输出纹波一定要用“靠测法”——示波器探头的地线弹簧直接夹在输出电容的两个焊盘上不要用鳄鱼夹那根长地线。长地线会引入环路把开关噪声和辐射噪声全部耦合进来测出来的纹波能虚高一倍以上。我见过太多人因为这个问题误判白白换了好几轮电容。2. 核心参数计算与元件选型把公式落到具体数字上2.1 电感选型纹波率、饱和电流与 DCR 的三角权衡电感是 BUCK 里最贵、最占面积的元件选型要同时盯住三个参数电感量、饱和电流、直流电阻。电感量由纹波率决定L (Vin - Vo)·D / (r · Io · fsw)拿一个具体的例子Vin 12VVo 5Vfsw 500kHzIo 3A取 r 0.35。D 5 / 12 0.4167 ΔIL 0.35 × 3 1.05A L (12 - 5) × 0.4167 / (1.05 × 500000) 2.917 / 525000 ≈ 5.56µH所以选 5.6µH 或者 6.8µH 都可以。选 6.8µH 纹波率会降到 0.286纹波更小但电感体积大一点选 4.7µH 纹波率升到 0.41动态响应更快。这就是一个典型的取舍。饱和电流是最容易翻车的地方。稳态峰值电流是 Io ΔIL/2 3 0.525 3.525A。但你不能按这个值选 Isat因为还有上电浪涌和负载跳变。我的习惯是Isat 至少留 30% 余量也就是选 4.5A 以上的电感。如果输出会接容性负载上电瞬间电流可能冲到 2~3 倍额定值那还得再往上留。还有一个容易忽略的点电感的饱和电流通常是在 25℃ 测的温度升高后 Isat 会下降。铁氧体电感还好金属粉芯一体成型电感的 Isat 温降能到 20%~25%。高温环境下工作的电源Isat 要按 85℃ 或者 105℃ 的曲线去查。DCR直接决定效率。电感上的铜损是 I_L(rms)² × DCR。3A 输出、DCR 20mΩ 时铜损约 0.2W。如果换成 DCR 5mΩ 的一体成型电感铜损降到 0.05W效率能提升 1.5 个百分点。但低 DCR 意味着更粗的线或者更大的磁芯成本和体积都上去了。DCR 在几十毫欧这个区间通常是效率和成本平衡得最好的地方。2.2 输出电容ESR、容量与环路稳定性的三方拉扯输出纹波由两部分组成ΔVo(pp) ≈ ΔIL × ESR ΔIL / (8 · fsw · Cout)前面那项是 ESR 贡献的后面那项是电容充放电贡献的。用 2.1 里的例子ΔIL 1.05A目标纹波 50mV如果 ESR 10mΩESR 项贡献 10.5mV剩下 39.5mV 归电容1/(8 × 500000 × Cout) 0.0395 → Cout ≈ 6.3µF。注意只需要 6.3µF。那为什么实际电路里都放 47µF 甚至 220µF因为环路。输出电容的 ESR 会在传递函数里制造一个零点容量和电感构成一个双极点。双极点的 Q 值是Q 1 / [ω0 · (ESR·C L/RL)]其中 ω0 1/√(LC)。用 L 6.8µH、C 100µF 算一下√(LC) √(6.8e-6 × 100e-6) 2.61e-5 → ω0 38.3k rad/s → f0 ≈ 6.1kHz ESR·C 0.01 × 100e-6 1e-6 s L/RL 6.8e-6 / 1.67 4.08e-6 s Q 1 / [38344 × 5.08e-6] ≈ 5.1Q 5 意味着一对共轭极点会在 f0 附近形成一个大约 14dB 的增益尖峰如果不加补偿环路在这里很容易把相位裕度吃光。ESR 零点在fz 1/(2π·ESR·C) 1/(2π × 1e-6) ≈ 159kHz这个零点能给相位带来正向贡献所以一定量的 ESR 是有好处的。用全 MLCC 的电路 ESR 极小1~2mΩ零点被推到 800kHz 以上根本来不及补偿相位环路就会在 LC 谐振点附近振荡。这就是为什么很多老工程师会故意在输出端串一个很小的电阻或者在 MLCC 上并联一颗钽电容或者电解电容——不是不懂 MLCC 好是在给环路“留活路”。经验值12V→5V、500kHz 这个量级的设计输出电容我一般取 47µF~220µF 的 MLCC 组合再并一颗 100µF/6.3V 的聚合物电容提供中频段 ESR。实测纹波能压到 20mV 以内环路也能调得比较舒服。2.3 高边开关管的驱动为什么一定要有自举电路同步 BUCK 的高边管是 NMOS源极接在 SW 节点上。要让 NMOS 导通栅极电压必须比源极高出一个 Vgs(th) 以上的电压。可 SW 节点在开关最高会到 Vin你怎么给栅极提供一个比 Vin 还高的电压答案就是自举电路一颗自举二极管加一颗自举电容。原理很直白低边管导通的时候SW 节点被拉到地这时候自举二极管从 VCC一般 5V 或者 3.3V通过二极管给自举电容充电电容上端充到 VCC等到低边管关断、高边管要开的时候驱动芯片把自举电容下端的参考点切到 SW电容上端的电压就变成了 SW VCC比 Vin 高出 VCC足够把高边管完全打开。自举电容的容量按这个公式估Cboot ≥ Qg / ΔVbootQg 是高边管的总栅极电荷ΔVboot 是允许的自举电压跌落。取 Qg 20nC允许跌 0.2V那 Cboot ≥ 100nF。实际取值一般在这个基础上放大 5~10 倍也就是 470nF~1µF因为还要考虑电容的 DC 偏压降容、自举二极管的反向漏电和驱动芯片静态电流。注意一定要选 X7R 或 X5R 材质的陶瓷电容Y5V 在直流偏压下容量能掉 80%会造成驱动不足、开关损耗飙升。自举电路还有一个隐藏的坑最小占空比限制。如果占空比太小、高边导通时间太短低边导通的时间虽然长但 SW 被拉到地的时间可能不够自举电容来不及充满高边驱动电压就会慢慢往下掉最后掉到 Vgs(th) 以下高边管进入线性区瞬间过热烧毁。所以如果你的应用需要很低的占空比比如 48V 转 1.8V一定要确认驱动芯片支持“低占空比自举刷新”或者干脆用外置的隔离驱动电源。2.4 输入电容和 LC 谐振被忽视的噪声源头输入电容的作用不是稳压是给开关管提供一个就近的低阻抗电流源。高边管导通瞬间电流从输入电容而不是从输入电源线取这样就不会把几百 kHz 的脉冲电流灌到输入线上产生辐射。输入电容的 RMS 电流是Icin(rms) Io · √[D(1-D)]D 0.4167 时√(0.4167 × 0.5833) 0.493Icin(rms) 1.48A。这个电流不能按 3A 或者 1.5A 的“平均值”去选电容的纹波电流额定值必须按 RMS 值来而且还要乘上温升降额系数。我一般要求电容的额定纹波电流至少是计算值的 1.5 倍。输入端的第二个大问题是LC 并联谐振。输入线缆的寄生电感几 µH 到几十 µH和输入电容会构成一个 LC 谐振网络谐振频率通常在几十 kHz。如果这个谐振频率落在电源环路的带宽附近就会和 BUCK 的负输入阻抗相互作用产生振荡。这就是Middlebrook 准则说的为了让系统稳定输入滤波器的输出阻抗必须在所有频率上都远小于电源的输入阻抗。抑制方法有几条一是在输入电容上串一个小的 RC 阻尼典型值 1Ω 10µF直接给谐振点降 Q二是用大容量的电解电容配合 MLCC利用电解电容的 ESR 天然阻尼三是把输入电容尽量靠近开关管缩短高频回路。一个我踩过的坑曾经做过一款 24V 输入的板子空载时输出纹波正常一加负载到 50% 就开始有 20kHz 的低频振荡。查了半天环路最后发现是输入端一根 30cm 的线加上 10µF 的输入电容形成的谐振频率刚好 17kHz。在输入电容旁边加了一组 1Ω 22µF 的阻尼网络立刻干净了。这个经验后来救了我好几次。3. 手撕 BUCK 实操从仿真到 PCB 再到实测3.1 用 LTspice 搭一个 12V 转 5V/3A 的模型仿真是最便宜的试错方式LTspice 免费而且收敛性好是我用得最多的工具。下面这份网表可以直接跑起来把上面的参数全部落地* 12V - 5V / 3A synchronous buck, fsw 500kHz V1 in 0 12 Cin in 0 22u M1 in sw hs sw NMOS_H M2 0 sw ls sw NMOS_L L1 sw vo 6.8u Cout vo 0 100u Resr vo vo2 10m Cout2 vo2 0 100u Rload vo2 0 1.667 Vgh hs 0 PULSE(0 5 0 5n 5n 800n 2u) Vgl ls 0 PULSE(0 5 0 5n 5n 800n 2u) .model NMOS_H NMOS(Vto2 Kp40 Cgs1n Cgd0.1n) .model NMOS_L NMOS(Vto2 Kp40 Cgs1n Cgd0.1n) .tran 0 1m 0.8m 10n .backanno .end这里故意把死区时间设为 0是为了先看理想波形。实际仿真时要在 Vgh 和 Vgl 之间插入 20~50ns 的死区否则上下管会同时导通电流会冲到几百安培仿真直接报错或者给你一个假的漂亮结果。具体做法是把 Vgl 的延迟改成 820n、脉宽改成 780n。仿真跑完之后先别急着看输出波形按顺序检查这几项稳态占空比是不是接近 41.7%。如果明显偏大检查 MOS 的导通电阻是不是设得太高。电感电流是不是在 2.48A 到 3.53A 之间线性三角波纹波是不是 1.05A 左右。输出纹波是不是在 50mV 以内形状是不是 ESR 方波叠加三角波。SW 节点有没有超过 Vin 0.3V 的过冲——如果有说明寄生电感太大实际布线必须压缩功率回路。效率用积分算一下输出功率除以输入功率。LTspice 里可以直接在输出端加一个 .meas 语句自动算平均功率。仿真里最容易被忽略的是寄生参数。理想仿真的效率能到 97%实际板子可能只有 88%。差的那 9 个点全在寄生参数上MOS 的 Coss 充放电损耗、栅极驱动损耗、电感的磁芯损耗、PCB 铜箔电阻、死区期间体二极管的导通损耗。想让仿真靠得住就得把这些都补进模型特别是 Coss 和磁芯损耗前者影响开关损耗后者在大电流下能占 1~2 个百分点。3.2 从原理图到 PCB功率回路最小化怎么落地BUCK 的 PCB 布局有一条铁律把输入电容、高边管、低边管围成的高频环路面积压到最小。这个回路里的电流变化率 di/dt 极高几百 kHz 的方波电流回路面积大一倍辐射就大一倍SW 节点的过冲也会明显增加。具体操作上我一般这样做输入电容的接地端直接打在低边管的源极焊盘旁边中间不要经过任何过孔或走线。高边管、低边管、输入电容三个器件放在同一面尽量排成一排让电流走一个“U”型的小回路而不是绕一大圈。SW 节点是噪声源铜皮只留够载流的宽度就好不要为了散热铺一大片。铺大了就是一块天线。电感下面不要走任何信号线尤其是反馈线。电感的漏磁场会在下方的走线上感应出开关频率的噪声。反馈分压电阻就近放在芯片的 FB 引脚旁边采样点从输出电容的焊盘直接引用 Kelvin 连接的方式绕开大电流路径。这一点极其重要我见过至少三次因为反馈采样点取在了电流路径上、导致输出精度差 3% 以上的案例。地平面的处理是个永恒争论的话题。对于单层或者双层的低成本板我倾向于用单点连接的方式把功率地和信号地分开两个地通过一个 0Ω 电阻或者一个窄桥连在一起位置选在输出电容的负极。对于四层板直接用完整的地平面做主参考功率地和信号地通过过孔就近连通到第二层地平面反而比强行分割效果更好。分割地平面是上一代的做法在现代多层板里经常适得其反容易造成回流路径不连续引入更大的共模噪声。3.3 上电调试顺序、工具和几条不能省的动作第一次上电绝对不能直接给满载。我的标准流程是这样的第一步空载限流。把输入电源的电流限流设到额定值的 20%比如 3A 输出的板子先把限流设到 0.6A。用示波器盯着输入电流和输出电压慢慢把输入电压从 0 升到额定值。这一步能拦住绝大多数焊接不良和短路问题。第二步看空载输出。空载时同步 BUCK 大概率进 DCM 或者跳周期输出纹波会比较大甚至有点不规则这是正常的。如果空载时输出是 0V先查使能引脚和软启动电容。第三步加 10% 负载。用电子负载拉 0.3A看输出是不是稳在 5V。这个点还在 DCM纹波会比较大。如果这时候电压明显偏低检查反馈电阻的比值和基准电压。第四步加 50% 和满载。同时用热像仪扫一遍重点看 MOS、电感、输出电容的温度。我的经验值是在 25℃ 环境下满载跑 30 分钟MOS 结温不超过 100℃电感表面温度不超过 80℃这样才有足够的余量应对高温环境。第五步负载跳变。电子负载设成 10% 到 90% 的方波跳变频率 100Hz~1kHz用示波器看输出电压的下冲和过冲。12V→5V、3A 这个量级我一般要求下冲不超过 250mV、恢复时间不超过 100µs。如果下冲太大说明环路带宽不够如果恢复过程有振铃说明相位裕度不足。第六步测效率曲线。从 5% 负载一直测到满载画一条效率曲线。这条曲线能告诉你很多东西轻载效率低说明静态电流大或者还在强制 CCM满载效率明显下滑说明导通损耗偏大中间某个点出现效率凹陷通常是环路在两个模式之间切换造成的。3.4 手撕 BUCK 的另一种玩法用运放和比较器自己搭市面上有大量的集成 BUCK 控制器但如果你想真正搞懂环路我强烈建议用分立器件自己搭一次。经典的方案是一颗运算放大器做误差放大和补偿一颗比较器做 PWM 调制再加上驱动电路。这就是热搜里“手撕 buck”的意思——不用集成控制器从零搭出来。这么做的好处是每一个节点你都能测、每一个参数你都能改。比如你想看补偿网络的零点对相位裕度的影响直接换个电容就能看到阶跃响应的变化比在黑盒芯片上调参数直观一百倍。缺点是分立方案的静态功耗、驱动能力和保护功能都很难做到集成芯片的水平所以适合学习和验证不适合量产。如果你用运放做误差放大器注意几个细节一是运放的带宽要足够至少是穿越频率的 5 倍以上否则运放自身的相位延迟会吃掉你辛苦补偿出来的裕度二是运放的输入失调电压要小因为它会直接变成输出电压的直流误差三是运放的输出摆幅要能覆盖 PWM 比较器的输入范围轨到轨运放会比较省心。4. 环路与传递函数为什么你的 BUCK 会振荡4.1 功率级传递函数两个极点和两个零点BUCK 的控制到输出传递函数CCM 下长这样Gvd(s) Vin · (1 s·ESR·C) / [1 s/(Q·ω0) (s/ω0)²]分子上有一个由输出电容 ESR 产生的零点分母上是一对共轭极点LC 谐振和一个由负载电阻决定的阻尼项。如果考虑电感的 DCR 和负载还会多一个低频零点在 1/(2π·L/DCR) 附近不过 DCR 一般很小这个零点频率很高可以忽略。从幅频特性上看这条曲线的形状是低频段平坦增益等于 Vin约 21.6dB到 f0 附近出现一个尖峰峰值高度由 Q 决定Q 5 时大约 14dB过了 f0 之后以 -40dB/dec 的斜率下降到 ESR 零点之后斜率变成 -20dB/dec同时相位开始回升。理解这条曲线的意义在于你的补偿网络要做的事情就是把这条曲线“掰”成一条以 -20dB/dec 穿过 0dB 的线并且在穿越频率处留出足够的相位裕度。所有环路补偿的设计本质上都是在做这件事。如果用数字控制你会看到另一条路径BUCK 的 PID 闭环控制。数字方案里功率级是连续时间系统采样和计算引入延迟所以数字环路的带宽通常比模拟方案低一般是开关频率的 1/10 到 1/20。这个额外延迟会让相位裕度在同样的穿越频率下掉 10°~20°设计时必须留够余量。这也是很多人从模拟转到数字时翻车的原因——照搬模拟的参数结果振荡了。4.2 Type II 补偿网络三个元件怎么算出来用跨导型误差放大器gm 型做 Type II 补偿网络就三个元件Rc、Cc、Ccp。设计步骤我一般按这个顺序走。第一步定穿越频率 fc。一般取开关频率的 1/10500kHz 就取 50kHz。取太高达不到因为开关纹波会被放大取太低动态响应差。第二步算 fc 处功率级的增益。用上面的公式fc 50kHz 时(ω/ω0)² (2π×50000 / 38344)² 8.19² 67.1 |Gvd| ≈ 12 / 67.1 0.179也就是 -14.9dB第三步算需要的补偿增益。反馈分压比 β Vref/Vo 0.8/5 0.16假设基准 0.8V。环路增益要等于 1Gc 1 / (β × 0.179) 1 / 0.0286 35第四步定 Rc。跨导型误差放大器的增益是 gm × Zc。取 gm 1mSZc 在 fc 处近似等于 Rc因为 Cc 在 50kHz 时阻抗只有 3kΩ远小于 RcCcp 的阻抗有 145kΩ远大于 Rc。所以Rc 35 / 1e-3 35kΩ取标准值39kΩ第五步定 Cc。让补偿零点落在 LC 双极点附近稍微低一点更好目标 4~6kHzCc 1/(2π × 39000 × 5000) ≈ 820pF取1nF对应零点 4.1kHz第六步定 Ccp。让高频极点落在 ESR 零点附近或者 fsw/2Ccp 1/(2π × 39000 × 180000) ≈ 23pF取22pF算完之后再回头验一遍50kHz 处的补偿增益 gm × ZcZc (39k 3.2k) ∥ 145k 32.7k增益 32.7比需要的 35 略小说明实际穿越频率会落在 45kHz 左右可以接受。相位方面LC 双极点贡献约 -180°ESR 零点贡献 18°补偿零点贡献 80°补偿极点贡献 -12°总相位约 -94°相位裕度约 86°。理论值很漂亮但实际因为驱动延迟、PCB 寄生和运放的额外极点量出来一般是 60°~70°。提醒一句这套计算是给电压模式控制的。如果你用的是峰值电流模式功率级传递函数会变成近似一阶电感不再形成共轭极点变成一个单极点补偿网络要简单得多通常只要一颗 Rc 和一颗 Cc 就够了而且不用太担心 LC 谐振。这是电流模式最大的优势也是它在工业界用得比电压模式更广的原因。4.3 数字 PID 的定点实现和几个坑数字 BUCK 里的 PID 通常是这个形式/* 增量式 PID定点 Q12 格式用于 500kHz 中断的 BUCK 数字控制 */ #define KP_Q12 3072 /* Kp 0.75 */ #define KI_Q12 123 /* Ki 0.030 */ #define KD_Q12 8192 /* Kd 2.0 */ static int32_t err_prev1 0; static int32_t err_prev2 0; static int32_t duty_q12 2048; /* 占空比0..4095 对应 0..100% */ int32_t buck_pid(int32_t vref, int32_t vfb) { int32_t err vref - vfb; int32_t d_u; /* 增量式Δu Kp*(e[k]-e[k-1]) Ki*e[k] Kd*(e[k]-2e[k-1]e[k-2]) */ d_u (KP_Q12 * (err - err_prev1) KI_Q12 * err KD_Q12 * (err - 2 * err_prev1 err_prev2)) 12; duty_q12 d_u; if (duty_q12 4095) duty_q12 4095; if (duty_q12 0) duty_q12 0; err_prev2 err_prev1; err_prev1 err; return duty_q12; }这段代码有几个坑必须讲清楚。第一个坑是微分项对噪声的放大。ADC 采到的输出电压里一定含开关纹波微分项会把这个纹波放大 Kd 倍。Kd 2 的时候ADC 上 5 个 LSB 的噪声在 duty 上会被放大成 10 个 LSB占空比抖得厉害输出纹波反而变大。解决办法是在 ADC 后面加一个一阶低通或者干脆用不完全微分在微分项上串一个低通滤波。第二个坑是定点数的溢出。上面这段代码里KP_Q12 × err 如果 err 是 int16 范围±32767乘出来接近 1e8虽然 int32 装得下但如果 PID 之后还有别的运算就很容易溢。我一般会保证中间结果不超过 2^30。第三个坑是采样点。数字控制必须在开关管导通或关断的固定时刻采样输出电压千万不能随便采。因为采样瞬间不同得到的值会带着不同的开关纹波成分相当于给环路注入了一个和占空比相关的干扰很容易引起次谐波振荡。通常的做法是在 PWM 周期中间触发 ADC让采样点落在纹波的最小值或者平均值上。4.4 环路实测注入法测波特图算出来的参数必须实测验证。测环路最常用的方法是注入法在反馈分压电路中串入一个小电阻一般 10~50Ω用一个隔离的变压器把扫频信号注入进去同时测量注入点前后的幅值和相位两者的比值就是环路增益。需要的设备要么是专门的环路分析仪比如 Bode 100 或者 E5061B 这类要么用信号发生器加双通道示波器手动逐点测——后者很费时间但材料成本低。我早年做项目的时候就是用信号发生器一个频点一个频点地扫扫完一条曲线要两个小时但那个过程对理解环路的帮助特别大。实测时有几个注意点注入幅度要小一般 10~50mV。幅度太大环路会进入非线性区测出来的结果不准。注入点要选在反馈分压的中间这样不会破坏直流工作点。测的时候要在不同负载下分别测10%、50%、100% 三个点。因为我前面说过Q 值和负载有关环路特性会随负载变化。如果测出来的相位裕度小于 45°一定要重新调补偿45° 到 60° 之间可以接受但有风险我个人的标准是不低于 55°因为量产时器件容差、温度变化都会让裕度往下掉几个点。5. 常见问题与排查技巧实录5.1 上电炸管、输出不对、发热严重怎么一步步定位上电瞬间炸高边管最常见的原因是死区不够或者驱动没起来。排查顺序先用示波器看驱动波形确认高边和低边的栅极信号之间确实有死区再看自举电容是不是没充电测量自举电容两端的电压应该是 5V 或者 3.3V 左右最后检查高边管的 Vgs 最大值有没有超过芯片的绝对最大额定值SW 节点的过冲会把自举电压顶到 VinVCC过冲很多时候就是这个过冲把栅氧击穿了。输出空载正常、带载就掉压八成是电流限制触发了。查一下采样电阻的取值是不是偏大或者控制芯片的限流点设置是不是太保守。还有一种可能是电感的 DCR 太大满载时电感上的直流压降吃掉了 0.3V 以上再加上开关损耗控制器再怎么调占空比也补不回来。满载运行十分钟就烫手分几种情况看。MOS 烫先算开关损耗和导通损耗看哪个占大头如果开关损耗大检查驱动电阻是不是太大、栅极电荷是不是太高如果导通损耗大说明 Rds(on) 选大了或者没留温度降额。电感烫先看 DCR 损耗再看磁芯损耗——磁芯损耗和 ΔB 的平方成正比纹波率太大的话换个大一点的电感就能明显降温。输出纹波里有一个低频包络也就是纹波不是一个稳定的三角波而是被一个几 kHz 的低频信号调制。这个现象基本可以确定是环路不稳定或者输入 LC 谐振。区分方法很简单断开输入端的线直接用一台线性电源短距离供电。如果低频包络消失那就是输入 LC 谐振如果还在那就是环路问题得重新调补偿。输出电压有固定的偏差比如设定 5V 实际输出 5.15V。这种偏差主要来自三处反馈电阻的精度用 1% 或者 0.1% 的电阻能解决、芯片基准的精度这是芯片决定的只能选更好的芯片、以及反馈采样点的位置采样点如果落在输出电流路径上负载电流会在铜箔电阻上产生额外压降被误当成输出电压的一部分。第三点是最容易被忽略的用 Kelvin 连接能彻底解决。5.2 常见问题速查表现象可能原因排查动作处理方向上电即炸高边管死区不足、自举未充电、SW 过冲击穿栅氧测两路驱动死区测自举电容电压测 SW 过冲增大死区、缩小功率回路、加 RC 吸收空载正常带载掉压限流触发、电感 DCR 过大测电感两端直流压降看限流脚波形调整限流点、换低 DCR 电感纹波被低频调制环路不稳定、输入 LC 谐振换短线供电复测测环路波特图加输入阻尼、重调补偿轻载效率骤降强制 CCM、低边管反向导通测轻载时的电感电流波形开省电模式、换支持 PFM 的芯片输出电压固定偏差反馈电阻精度、基准精度、采样点不对万用表测反馈点电压对比理论值换高精度电阻、改 Kelvin 采样MOS 温升过高开关损耗大或导通损耗大分别估算两项损耗测栅极波形上升时间减小驱动电阻、换低 Qg 或低 Rds(on) 器件输出纹波是方波输出电容 ESR 过大换低 ESR 电容复测并联 MLCC、改用聚合物电容高温下输出跌落电感 Isat 温度降额、电容容值衰减热风枪加热后复测换高 Isat 电感、留足降额环路在谐振点振荡LC 的 Q 值过高、相位裕度不足测波特图看 f0 附近的增益尖峰增加输出电容 ESR、调整补偿零点位置5.3 往后可以怎么扩展多相交错和双向 BUCK-BOOST单相 BUCK 做到 20A、30A 以上就很吃力了电感体积巨大、输出纹波高、热量集中在一点。这时候上多相交错并联。两相 BUCK 的两个电感电流错开 180°输出端并联纹波电流会因为相位差而部分抵消——两相能把纹波降到单相的 1/2 左右四相能降到 1/4。同时热量分散到多个器件上散热压力小很多。代价是要有均流控制各相之间的电流偏差不能超过 10%否则某一相会先热起来。多相交错的另一个好处是等效开关频率翻倍。两相各 500kHz输出端看到的纹波频率是 1MHz也就是输出电容可以选得更小。这在大电流低压输出比如 12V 转 0.9V、50A的场合几乎是标配。再往上是双向 BUCK-BOOST也就是四开关升降压。它在 BUCK 的基础上把续流二极管也换成 MOS并且把输出电容也变成“输入”这样能量可以双向流动。典型应用是电池充放电和超级电容储能放电时工作在 BOOST 模式把电池电压升上去充电时工作在 BUCK 模式把母线电压降下来充电池。四开关结构在两种模式切换时会有过渡区过渡区的控制策略是整个设计的难点也是很多论文和专利集中的地方。如果你已经把单相 BUCK 摸透了我的建议是下一步先啃多相交错的均流控制再做四开关的双向切换。这两块的复杂度比单相高一个数量级但掌握之后绝大多数 DC-DC 的应用场景你都能应付了。5.4 几个我用了很多年的小技巧最后分享几个零碎的实战经验都是文档里不会写的。测电感电流没电流探头的时候可以在低边管的源极到地之间串一个 10mΩ 的电阻用运放搭一个差分放大电路把这个小信号放大 50 倍再送示波器。这样测出来的是低边管导通期间的电流想要完整波形就得靠拼。虽然是间接测量但精度完全够用来判断纹波和饱和。判断电感是不是饱和最快的办法是用手摸如果负载电流增加一点点电感温度就跳升得特别快基本就是饱和了。更严谨的方法是看电流波形有没有出现“平顶”或者“上翘”正常应该是笔直的线性斜坡。输出电容并联的 MLCC 数量不要贪多。每颗 MLCC 都有自己的 ESL并联太多会在某个高频段形成新的谐振反而把噪声推到更高的频率上辐射更难处理。我一般控制在 3~5 颗以内容量错开比如 22µF 1µF 100nF比堆十颗一样的 22µF 效果更好。热设计要在画板之前算不要等打样回来再补。我的做法是在原理图阶段就把每个器件的损耗估出来列一张表MOS 的开关损耗、导通损耗、驱动损耗电感的铜损、磁芯损耗电容的 ESR 损耗。加总之后按热阻估算温升超过 60℃ 就直接改方案。PCB 打样一次两周返工一次的代价远高于多花半天算损耗。如果你要做恒流输出的 BUCK比如驱动 LED反馈环从电压环改成电流环采样电阻放在输出回路上。这个时候要注意采样电阻的功耗和温漂——几百毫安到几安的电流下采样电阻上的功耗可能比驱动芯片本身还大。用四线制的 Kelvin 连接采样点从电阻焊盘的内侧引能避免走线电阻引入的误差实测能把恒流精度从 ±5% 提到 ±1%。别迷信仿真结果。我做过一个项目仿真效率 94%实测只有 87%。后来一项一项拆开对发现差的主要是三个地方一是电感的磁芯损耗模型不准仿真里只算了铜损二是 MOS 的 Coss 损耗没算三是 PCB 上 1 盎司铜厚、3mm 宽的走线在 3A 下也有几十毫欧累积起来吃掉 1.5 个百分点。从那以后我养成了一个习惯仿真结果打八折就是我的预期目标如果打八折之后还能满足要求这个方案才敢往下走。BUCK 电路说到底就是这么点东西但每一个参数的背后都有一堆取舍。我自己的体会是做电源最难的不是把公式算对而是知道什么时候该在哪个指标上让步。同样的 12V 转 5V成本敏感的消费类产品和车载产品选出来的方案能差出一倍的价格和完全不同的器件组合。多手撕几个电路、多测几块板子比看十本书管用。