
做电源的兄弟应该都有这种经历板子焊好了PFC不上电是静的一上电就是各种妖魔鬼怪。要么输出啸叫要么功率因数表读数来回跳最气人的是明明抄的芯片厂商demo换个电感或者电容就全乱套。遇到这种问题九成是卡在同一个地方——控制环路的传递函数没吃透环路补偿的零极点没放对位置。这篇文章我就把自己调PFC环路时踩过的坑、算过的公式、验证过的方法都摊开讲从Boost型PFC功率级的小信号模型开始到传递函数怎么推导、补偿网络怎么设计再到数字控制里的离散化实现最后列几个高频问题。适合正在搞PFC电源设计、或者在学校做电力电子课题、再或者给电源芯片做应用支持的工程师把这套东西搞明白再遇到环路不稳就不会心慌了。另外说一句这里的PFC是功率因数校正Power Factor Correction大家搜资料时别和数据中心交换机里那个Priority Flow ControlPFC混淆那完全是两个世界。1. PFC环路补偿到底在补什么1.1 先从控制目标说起PFC为什么不能开环跑PFC全称是功率因数校正放到电源里核心任务就一个让输入电流主动跟随输入电压的波形把一个容性或者非线性的负载在电网侧“伪装”成纯电阻。只靠整流桥后面挂个大电容那种老式做法输入电流是尖峰脉冲功率因数低、谐波大所以现在稍微规范一点的电源都要加一级PFC。Boost结构的PFC之所以最普及是因为拓扑天然适合把整流后的正弦半波升压到高压直流母线常见的出压是380V到400V。但Boost本质上是开关变换器占空比一直变输出才能稳定。这里的控制架构通常是双环外环是电压环采样输出电压和400V基准做差输出一个电流幅值指令内环是电流环采样电感电流让它跟踪一个“正弦半波×电流幅值”的参考波形。电流环的输出最终变成占空比送到PWM比较器。关键问题来了为什么不能开环不少初学者会想反正输入是正弦半波我按比例调占空比不就行了但电网电压在变、负载在变开环状态下输入电流根本不可能自动保持正弦输出电压也会漂。更麻烦的是PFC的功率级传递函数会随输入电压瞬时值、负载大小、占空比变化而大幅变化开环增益甚至可能在不同工频相位点差出好几倍。所以必须闭环而闭环的动态性能、稳定性全部由环路补偿决定。1.2 三个指标决定环路质量穿越频率、相位裕度、增益裕度设计任何反馈环路第一件事就是看Bode图。PFC环路设计最重要的三个指标我习惯用下面这套标准穿越频率fc开环增益等于10dB的频率点决定了系统动态响应速度。PFC电流环的穿越频率一般取开关频率的1/10到1/6。比如100kHz开关频率电流环穿越频率取10kHz到20kHz再高就危险了因为要留空间给PWM采样延迟和数字延时。电压环则非常特殊穿越频率通常压到10Hz到20Hz目的只有一个压制100/120Hz母线纹波不让它串回电流指令。相位裕度PM穿越频率处开环相位加上180度。PFC常规要求至少45度我一般按55度到70度设计。PM不够动态响应会出现明显振荡轻则波形难看重则直接啸叫。增益裕度GM相位过-180度时的增益余量通常在6dB以上。这个指标在PFC中容易被忽视实际上如果补偿器高频极点放得不对或者功率级寄生参数引起额外相移GM不足也会在某个频率点自激。做PFC补偿要时刻提醒自己它不是一台固定工作点的Buck或Boost输入电压在工频周期内不断变化增益也在变化。所以设计点通常选在最恶劣工况也就是最低输入电压、满载这时候占空比大、右半平面零点频率最低环路相位最差。2. PFC功率级传递函数的推导与物理意义2.1 小信号模型平均、扰动、线性化三步走要设计补偿器先得有被控对象的传递函数。直接对开关电路做频域分析几乎不可能因为开关动作是非线性的所以要用状态空间平均法思路就是在一个开关周期内把电感电流和电容电压的导数用平均值代替然后在小扰动下做线性化。三步走第一步平均。以CCM Boost为例忽略开关纹波后电感电流和电容电压满足L·di/dt vin - (1-d)·voC·dvo/dt (1-d)·i - vo/R第二步扰动。把所有状态量写成直流工作点加小信号扰动dDΔdvinVinΔvinvoVoΔvoiIΔi。代入平均方程。第三步线性化。展开后忽略二阶以上小量得到线性方程组。这一步是最核心的因为只有去掉非线性项才能用拉普拉斯变换写出传递函数。对于Boost稳态关系很简单VoVin/(1-D)IVo/((1-D)·R)。小信号方程整理后就能解出我们最关心的两个传递函数占空比到输出电压Gvd(s)以及占空比到电感电流Gid(s)。2.2 Boost PFC核心传递函数Gvd和Gid在CCM Boost PFC中归算到控制到输出的传递函数通常写成Gvd(s) [Vo/(1-D)] × [1 - s·L/(R·(1-D)^2)] / [1 s/(Q·ω0) (s/ω0)^2]其中ω0 (1-D) / √(L·C)Q R·(1-D)·√(C/L)这个式子的物理含义很清晰。低频时增益接近Vo/(1-D)这是一个比较大的直流增益。一对LC极点决定了中频段以-40dB/dec斜率下降。但最要命的是分子里那一项“1 - s·L/(R·(1-D)^2)”它是典型右半平面零点。RHPZ在幅频响应上和普通零点一样把增益往上抬20dB/dec但在相频响应上却和零点相反产生相位滞后所以它会消耗相位裕度限制环路带宽。占空比到电感电流的传递函数Gid(s)就好处理一些我推导过之后大概长这样Gid(s) [Vo/(1-D)] × (s·C 2/R) / [1 s/(Q·ω0) (s/ω0)^2]这个式子很有意思低频时分子近似为2/R所以电流环功率级低频增益是常数高频时分子里的sC起作用会引入一个零点。整体来看Gid的相位滞后比Gvd小得多这也是为什么PFC电流环可以做到几十kHz带宽而电压环非常受限。2.3 拓扑变了传递函数怎么跟着变这两年讨论比较多的还有图腾柱PFC、无桥PFC、交错PFC、三相维也纳PFC。很多人以为拓扑一换传递函数就得从头推实际上它们的功率级动态模型基本都是Boost的变体核心的LC双极点和RHPZ依然存在变化的只是寄生参数、占空比定义、以及额外的控制自由度。图腾柱PFC把整流桥去掉了用两个低频臂完成工频整流两个高频臂做Boost开关。它的功率级小信号模型和传统Boost非常接近但有两个额外问题一是电流过零点附近输入电压接近0此时占空比接近1电感电流控制能力变弱容易产生过零畸变二是图腾柱结构没有专门的整流二极管共模噪声路径变化会影响电流采样精度进而影响低频段增益。所以补偿器参数可以沿用Boost的设计方法但过零点的畸变修正往往要靠数字前馈。交错并联PFC相当于N个Boost并联每个电感电流相加。等效之后总电流纹波变小等效电感L_eq减小那么LC谐振频率会升高RHPZ频率也会变系统本身的高频特性会好一些。但交错结构多了一个均流环各相参数的差异会让总开环增益出现微小波动。设计时只要按等效后的功率级参数取补偿器的零极点基本就能套用单相的结果。维也纳PFC用在三相场景每个开关管工作在一个三电平状态。它的电容电压被钳位到中性点本质还是和Boost类似但占空比和输入电压的关系不再是一个简单的单相正弦半波而是要按三相线电压的扇区切换。做环路设计时通常先按三相中的一相等效成Boost来处理再通过前馈补偿扇区切换造成的暂态扰动这样补偿器参数照样能用。2.4 别忘了右半平面零点这个“隐形杀手”RHPZ是Boost类变换器最让人头疼的东西。为什么会有这个零点物理上可以这样理解开关管导通时电感在储能但输出负载主要由电容供电输出电压反而会下降等电感把能量释放到输出端电压才回升。这就意味着占空比突然增大输出电压首先是下跌然后才上涨。这种“先反方向再正方向”的动力学在频域里就表现为右半平面零点。也正是这个原因PFC的电压环带宽不可能做高。假设一个功率级参数是L300uH、输出电压400V、负载R160Ω、占空比D0.68那么RHPZ频率大概是f_rhpz R·(1-D)^2 / (2π·L) ≈ 160×0.3175² / (2π×300e-6) ≈ 8.5kHz看着频率不低但在轻载时R增大RHPZ频率会迅速降低。比如负载变成1/4功率R640Ω那RHPZ频率就降到2kHz左右。所以电压环穿越频率如果设到几十Hz以上就可能撞上RHPZ相位恶化明显。这也是工程经验中电压环带宽只能取10到20Hz的根本原因之一。电流环则不同。电流环控制的是电感电流它的控制对象Gid里没有RHPZ只有一对LC极点和一些低阶级点所以电流环可以设计到比较高的带宽最多要考虑采样和数字延时带来的相位滞后。3. 环路补偿器设计从选型到参数计算3.1 Type I / Type II / Type III到底选哪个环路补偿器本质上就是给开环系统添加零极点调整增益和相位曲线。常见的几类我列一下Type I只有一个积分环节频率特性是-20dB/dec斜率相位恒定-90度。适合极低带宽的应用PFC基本不用因为没法提升相位。Type II一个原点极点一个零点一个高频极点。传递函数形式大概是K/s × (1s/ωz)/(1s/ωp)。它能在零点和高频极点之间提供一个相位提升区间最大提升约90度非常适合PFC电流环。Type III在Type II基础上再加一个零点和一个极点能提供最多180度相位提升适合需要高带宽、相位裕度吃紧的电源。PFC电压环带宽低一般用不上但如果遇到输入电压范围特别宽、重载轻载跨度大的特殊情况可以考虑。选择逻辑其实很简单先算功率级在穿越频率处的相位再看还差多少度能达到期望相位裕度。差得少用Type II差得多用Type III不够再往上加超前滞后环节。3.2 RC串联零点为什么能提升增益和相位这个问题被问得最多。RC串联的阻抗是Z(s) R 1/(s·C) (1s·R·C)/(s·C)分子里有一个零点频率是ωz1/(R·C)。这个零点对频率响应的影响要从两个角度看幅频特性上在零点频率之前阻抗主要由电容决定幅度随频率升高而下降越过零点频率后电阻主导幅度不再下降甚至变成平坦对应幅频曲线向上抬升20dB/dec。相频特性上电容的电流超前电压90度但电阻的电流和电压同相。两者串联以后整个支路上的电流相位就会介于0度和超前90度之间。随着频率升高相位从-90度往0度方向恢复。放到开环传递函数里就是系统相位在零点附近多了一个正的相位提升。通俗点说零点就像一个“提前量”让系统在穿越频率附近不那么滞后相当于给方向盘加了回正力矩车才不容易甩尾。实际补偿网络里RC串联常常出现在运放反馈支路比如反馈电阻R2串联一个电容C2再配合前向电阻R1就形成了Type II补偿器的一个零点频率大约为fz1/(2π·R2·C2)。设计时把这个零点放在功率级极点附近或者稍低于穿越频率就能有效拉起相位裕度。3.3 一个完整案例电流环和电压环的参数计算我拿一个很常见的PFC参数来走一遍流程。假设设计指标输入90V到264Vac输出400V/1kW电感L300uH母线电容C470uF开关频率fs100kHz。设计点选最恶劣工况输入90Vrms满载。输入峰值电压是90×√2≈127V占空比D1-127/400≈0.68负载等效电阻R400²/1000160Ω。此时LC谐振频率大约是f0 (1-D) / (2π·√(L·C)) 0.3175 / (2π·√(300e-6×470e-6)) ≈ 134Hz电流环设计。让我把电流环穿越频率定在fs/5也就是20kHz。由于Gid在LC谐振后只有一个净零点相位滞后不大功率级在20kHz附近的相位可能在-90度左右。考虑PWM调制和采样延时的相位损耗按20kHz估算再打个折扣所以补偿器在穿越频率处至少要提供45到60度的相位提升。按K因子法取一个Type II补偿器零点fz设计在3kHz左右高频极点fp放在50kHz左右。这样在20kHz处零点贡献约80度相位提升极点贡献约-22度综合下来补偿器在这个频率能够提供55度左右的相位。再把增益K调整到让20kHz处开环增益为0dB一个初步的电流环补偿参数就出来了。最终还需要在仿真里用Bode图验证PM不够就微调零点位置。电压环设计就简单许多。取穿越频率fc15Hz这样100/120Hz纹波在电压环里增益衰减足够大不会污染电流指令。电压环控制对象包含母线电容、负载电阻以及功率平衡产生的积分效应近似模型是一阶积分加一个负载极点。我习惯的做法是取一个Type II补偿器零点放2Hz左右极点放50Hz左右然后调整增益让15Hz处增益为0dB。这里要特别强调电压环的相位裕度尽量做大因为母线电容的ESR、采样滤波都会引入额外相位滞后留足余量才不会在满载切换时输出电压“拉锯”。4. 数字电源PFC环路离散化落地与代码实现4.1 数字环路比模拟环路难在哪模拟PFC里补偿器用运放搭带宽可以做到很高因为除了运放自身的带宽限制外几乎没有额外延时。数字PFC就不一样了整个控制链路里塞进了ADC采样时间、计算时间、PWM更新延时的数字量。最常见的做法是PWM周期同步采样然后在中断里算完补偿器再更新下一周期的PWM占空比。这意味着从采样到占空比生效至少有一拍的延迟等效为在环路中串入一个e的负sTd次方。这个延迟对相位的影响非常直观。假设Td10us穿越频率fc20kHz那么相位滞后就是φ_delay 360 × fc × Td 360 × 20000 × 10e-6 72度这个数字相当恐怖。如果不做处理原本模拟设计好的55度相位裕度会被吃干抹净系统必振。所以数字PFC设计时要么降低电流环带宽比如降到12kHz甚至更低要么在补偿器里预先多留相位余量要么采用单周期预测、延迟补偿等高级手段。实际产品里我看到的多数方案还是老老实实降低带宽用数字滤波把采样噪声压下去保证稳定第一。4.2 离散化方法对比前向欧拉、后向欧拉、Tustin、零极点匹配拿到连续域的补偿器Gc(s)要变成数字实现必须做离散化。常用方法有这么几种方法变换公式优点缺点适用场景前向欧拉s(z-1)/T最简单可能不稳定频率响应误差大很少用于控制器整体离散后向欧拉s(z-1)/(z·T)稳定高频增益误差明显低带宽场合凑合Tustin双线性s(2/T)·(z-1)/(z1)精度高稳定高频频率会压缩需要预畸变推荐PFC补偿器首选零极点匹配ze^(s·T)保持零极点位置增益需要单独匹配谐振控制器、精确频率场合我的原则很明确做Type II或Type III补偿器无脑选Tustin变换前提是配合预畸变处理。预畸变的意思是在变换前先把关键频率点改一下让Tustin变换后那个频率点的特性等于连续域目标值。对PFC这种穿越频率远低于采样频率的系统Tustin的误差很小不加预畸变也够用。Tustin变换的步骤是这样把Gc(s)里的s替换成(2/T)·(z-1)/(z1)然后用代数整理成z的多项式形式Gc(z) (b0 b1·z⁻¹ b2·z⁻²) / (1 a1·z⁻¹ a2·z⁻²)这个形式一般叫biquad几乎所有嵌入式处理器都能高效算。4.3 数字补偿器的差分方程和C代码示例有了Gc(z)的系数转成差分方程就好办了。假设输入是误差e(n)输出是占空比控制量u(n)对应u(n) b0·e(n) b1·e(n-1) b2·e(n-2) - a1·u(n-1) - a2·u(n-2)我常用的C语言实现是一个biquad结构体方便重复调用typedef struct { float b0, b1, b2; float a1, a2; float x1, x2; float y1, y2; } Biquad; float Biquad_Process(Biquad *f, float x) { float y f-b0 * x f-b1 * f-x1 f-b2 * f-x2 - f-a1 * f-y1 - f-a2 * f-y2; f-x2 f-x1; f-x1 x; f-y2 f-y1; f-y1 y; return y; }调用时每个开关周期中断里先做ADC采样、归一化到实际电压电流单位然后算电压环误差经第一个biquad得到电流幅值指令再和正弦基准相乘得到电流环参考再算电流环误差经第二个biquad得到占空比最后限幅后写进PWM比较器。这里有个细节不得不提输出的u(n)一定要做限幅而且限幅后的值和实际写入PWM的值要保持一致否则积分项会一直累积造成windup。我常用的处理是条件积分法如果输出超限就冻结积分项或者把误差反向回算防止退出饱和时出现大回摆。4.4 前馈、限幅、软启动一个都不能少数字PFC相比模拟还有一个显著优势就是可以很方便地做输入电压前馈。PFC的电流环增益会随输入电压变化传统模拟方案要设计复杂的乘法器或者自适应电路数字方案里直接采Vin的瞬时值在控制量里除以Vin的平方就能把环路增益拉平。公式上就是电流参考乘以k/Vin²这样做可以保证在不同输入电压下穿越频率基本不变这是提高PFC动态性能的关键一招。限幅分两层。电流环参考要限幅防止过流电流环输出的占空比要限幅防止在输出电压较低时占空比饱和导致失控。启动时还要做软启动最常见的是把电压环参考电压从0缓慢爬升到400V或者把电流幅值上限从0逐渐放开。数字实现只是一个斜坡发生器几行代码的事但省了很多上电冲击的麻烦。5. 常见问题与调试经验实录5.1 PFC用IGBT还是MOSFET这个问题从热搜词里出现率特别高。答案不是绝对的要看功率等级和开关频率。IGBT有饱和压降导通损耗在低压大电流时不太吃亏但拖尾电流让它在高频开关时损耗剧增所以IGBT一般用在开关频率低于20kHz到30kHz的大功率场景比如几千瓦到几十千瓦的充电桩、工业电源。MOSFET特别是超结MOSFET和GaN HEMT开关速度快适合PFC常见的65kHz到200kHz开关频率。消费级电源、适配器里的PFC基本都是MOSFET或GaN。图腾柱PFC因为要处理高频臂几乎清一色用高压MOSFET或GaN低频臂才可以用IGBT甚至普通MOS。所以“PFC一定用IGBT”是错的功率小、频率上去了IGBT根本扛不住开关损耗。5.2 仿真稳了实物炸了问题出在哪仿真里用的是理想模型没有PCB寄生电感没有采样噪声没有ADC量化误差也没有相邻功率级的耦合。很多人在Simulink里搭了一个理想PFC模型补偿器参数往上一填Bode图漂亮得不行一到实物就电流尖峰、输出电压振荡甚至炸管。我的经验是实物调试遵循几个步骤。上电之前先把功率级断开用隔离直流源给控制芯片和驱动供电确认PWM波形和占空比初始值对不对。然后上低压直流母线比如50V开环给固定占空比看电感电流是否连续、有没有异常尖峰。接着做扫频或注入扰动用环路分析仪测实际开环增益看有没有多个穿越点。最后再逐步加压加负载。千万不要一上来就满载那是给实验室增加烟火气。5.3 Simulink里如何得到传递函数并显示Bode图新版本Simulink有模型线性化器操作路径是Analysis - Control Design - Frequency Response Estimation或者直接写脚本。如果模型里全是平均模型和线性环节可以用linearize函数得到状态空间对象然后转成传递函数sys linearize(pfc_model, Gvc); tf_sys tf(sys); bode(tf_sys); grid on;如果模型里带PWM比较器和开关管线性化容易失败或者结果异常。我的做法是建立一个平均模型用受控电压源和受控电流源替代开关网络再用乘法器搭占空比到输出的关系。这种模型虽然少了开关纹波但频域特性非常接近真实功率级特别适合环路设计验证。5.4 电压环带宽为什么只能取十几赫兹很多人不理解电压环为什么不能快。原因在于PFC的输出电压不是纯直流它天然含有100Hz或120Hz的纹波这是正弦输入和恒功率负载共同作用的结果。如果电压环带宽太高它会尝试去“纠正”这个100Hz纹波结果就是电流幅值指令跟着100Hz一起抖输入电流中会出现大量三次、五次谐波THD严重超标功率因数反而下降。所以PFC电压环穿越频率一般板子定在10Hz到20Hz目的就是让100/120Hz分量在电压环里被深度衰减。如果想要兼顾动态响应就得在控制里加入纹波前馈或者陷波器把100Hz分量从反馈路径里单独去掉这才是高级做法。5.5 PFC和LLC级联时环路的协同问题热搜词里有“PFC和LLC电路图及原理”说明很多人已经把PFC当做一个电源系统的前级。PFC后面接LLC两级都有电压环。PFC电压环带宽低LLC电压环带宽通常也不高两者级联时如果响应速度设计不当会出现互相拉扯。比如负载突变LLC先动作把母线电压的能量抽走PFC电压环才发现母线掉压再慢慢补电。这个过程中母线电压会有比较长的跌落恢复时间但只要两级环路带宽拉得够开比如LLC带宽几百HzPFC带宽十几Hz一般不会振荡。实际调试中我会把PFC先单独调稳再挂上LLC用电子负载做动态测试重点观察母线电压波形。如果母线电压在突加负载后出现低频振荡多半是PFC电压环相位裕度不够或者LLC输入阻抗在某个频率呈现负阻特性把两个环路的相位叠在一起导致。这种问题没有统一公式靠的是经验和仪器一点点扫。写在最后我调过很多块PFC板子最深的体会是环路补偿从来不是“算完就结束”的事。计算只是给你一个合理的起点最终还要靠Bode图实测、负载动态测试、温度变化测试去收敛。补偿器的零极点哪怕只偏了一点在满载和轻载之间都可能暴露问题所以设计时一定要留足相位裕度别贪那一点带宽。数字控制的板子尤其如此采样延时、量化误差、前馈精度都会侵蚀理论计算的余量。最后再分享一个小办法每次改完补偿器先做低压半载的启动和负载切换试验记录输出电压波形确认没有振铃再去碰满载。这个习惯帮我在实验室里省下了不少炸管的预算。