news 2026/10/28 1:11:56

数字控制图腾柱PFC的关键时序与调试实践:ADC采样、ZCD与死区详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数字控制图腾柱PFC的关键时序与调试实践:ADC采样、ZCD与死区详解

写过几版数字图腾柱PFC之后,我最深的感受是:这个拓扑的原理讲起来并不复杂,真正折磨人的全在控制细节里。上篇我们把拓扑怎么选、电感怎么算、驱动怎么布局、GaN和Si怎么选讲透了,这篇专门聊数字控制的部分——ADC怎么采才不脏、ZCD怎么做才不会让电流畸变、死区到底给多少、多模式切换在代码里怎么落地。如果你正准备用C2000或者STM32G4做一台样机,这篇应该能帮你少走不少弯路。

1. 数字控制图腾柱PFC的整体架构:从拓扑到控制器的映射

1.1 图腾柱PFC到底在控什么

先回归一下拓扑本质。图腾柱PFC用高频桥臂的两个管子(Q1、Q2)做PWM斩波,低频桥臂(Q3、Q4)在工频半个周期里保持常通以跟随输入极性。相比传统Boost PFC,最大的优势是去掉了整流桥,电流不回灌到直流母线电容,换来的代价是:控制上必须时刻知道输入电压的极性,并且在高频开关动作中加入正确的死区和ZCD处理。

所以控制器需要管的事至少有这么几件:

  • 采样母线电压Vbus,稳住输出电压;
  • 采样电感电流iL,让它跟随输入电压波形,得到接近1的功率因数;
  • 采样输入电压Vac,用于前馈、极性判断和模式切换;
  • 输出高频PWM(对Q1/Q2),同时对低频桥臂Q3/Q4输出60Hz或50Hz的换向信号;
  • 在不同的负载与电网条件下,切换CCM、CRM、DCM,并处理与模式切换配套的时序和增益问题。

这里面最容易掉进去的坑是:很多工程师习惯把电路仿真里那种"理想受控源"的思路带进数字实现,默认采样是连续的、PWM是模拟比较器产生的。实际MCU/DSP里的ADC有采样时间、保持时间,PWM模块有装载模式、死区参数,数字环路有延迟,理论上再漂亮,落地时都得给这些"数字化副作用"做补偿。

1.2 采样与控制器的责任划分

我习惯把数字控制的责任划分成三层:

  • 物理层:负责电流传感器、电压分压电阻、运放调理到ADC输入,这一层决定信号质量;
  • 时序层:由PWM模块和ADC模块的联动触发完成,决定什么时刻采集数据,避开支开关噪声;
  • 算法层:负责环路运算、ZCD判断、模式切换、保护逻辑。

很多初学者把精力全投在算法层,结果样机一上电就波形乱跳。实际上,时序层的设计质量决定了后面所有调试工作的效率。你用的ADC是不是12位?采样窗口能不能和PWM中间时刻对齐?PWM能不能做双更新?这些在芯片选型时就该想清楚。

责任划分明确后,每一层的调试方法和重点就分开了:物理层看运放输出波形干不干净;时序层看PWM触发信号和ADC采样标志的时序关系;算法层才轮到写PI参数和状态机。这样出了问题,你不会满屏找bug,而是能按层定位。

2. 核心算法落地:平均电流模式、过零检测与多模式切换

2.1 用数字方式实现CCM平均电流控制

连续导通模式(CCM)下,主流方案是平均电流控制。外环电压PI输出电流幅值基准Iref,内环电流PI输出占空比。数字化实现时,整个环路的差分方程看起来并不复杂:

电压环输出(离散PI): v_pi_out(k) = Kp_v * e_v(k) + Ki_v * integral_v(k) 电流基准: iRef(k) = v_pi_out(k) * v_in_norm(k) 电流环输出: duty(k) = d_forward(k) + Kp_i * e_i(k) + Ki_i * integral_i(k)

其中v_in_norm是输入电压的归一化波形,用于让电流基准跟随正弦。d_forward是前馈占空比,近似为1 - |Vin|/Vbus。这个前馈项的作用非常明显:它让电流环只需要处理偏离理想占空比的误差部分,而不是从零开始建立正弦电流,环路增益压力会小很多。

但数字平均电流控制有个和模拟不同的点:电感电流的"平均值"不能直接测到。你在任意时刻只采到一个瞬时值,CCM下纹波不小,如果采样点不固定,采到的可能是波峰、波谷或中间值。我常用的做法是在PWM计数的特定相位触发ADC,采样点放在高频管导通的中心时刻或关断的中心时刻。因为CCM的电感电流在开关周期内近似三角波,中心时刻采样值约等于周期平均值,误差较小。

采样时刻选好后,还有环路延时的补偿问题。数字控制从采样到PWM占空比真正生效,至少有一个周期的延迟;如果采用单更新模式,最坏情况接近两个周期。电流环PI设计时要把这个延迟计入被控对象模型。简单工程做法:把电流环带宽控制在开关频率的1/10到1/6左右,留足相位裕量,再往高调就等着看振荡波形吧。

2.2 电感电流过零检测:ZCD的处理逻辑

图腾柱PFC如果只做CCM,ZCD的压力会小很多;可一旦要轻载进DCM/CRM提高效率,电感电流过零的判断就是整个控制器的面子工程。电流在零附近时,高低频桥臂的职能要换向,换早了、换晚了都会导致电流波形在过零处出现明显的平台或台阶。

数字ZCD实现有两个路径:

  • 用电流互感器或采样电阻信号输入比较器,由模拟比较器硬件检测过零,触发中断或事件信号给PWM模块;
  • 用ADC对电感电流持续采样,软件判断符号变化。

我推荐第一种。ADC即便做到2MHz的采样率,在60Hz工频周期内过零发生的瞬间也容易漏掉或延迟几个微秒,造成电流在过零处失真;而比较器是纳秒级响应,配合PWM模块的事件输入,处理起来靠谱得多。TI的C2000和STM32G4都有比较器+PWM联动功能,硬件上支持直接封波或触发事件。

实际工程中,ZCD还需要加滞回门限。物理上电流过零不是干净地从正变负,放大器偏置、采样噪声、布线耦合会让它在零附近来回抖。如果门限不设滞回,切换逻辑会被高频抖动触发,轻载功耗增加不说,还可能引起EMI恶化。我一般把滞回带设在大概±1%到±2%的额定电流范围,具体还要根据实测的噪声底来调。

2.3 CCM/CRM/DCM多模式切换策略

图腾柱PFC要提高全负载效率,轻载必须降频。数字控制最有优势的地方就在这里:模式切换是可以在代码里做平滑过渡的。

一个实用的切换逻辑:

  • CCM:中等功率到满载,连续导通,固定开关频率,通常设在65kHz到100kHz之间。电感纹波小,EMI滤波器设计相对简单;
  • CRM/BCM:轻载段,开关频率随电流变化,近似临界导通。让开关频率从额定值抬升,电感电流谷值到零;
  • DCM/突发模式(Burst):极轻载或待机,开关频率继续降低,甚至进入间隙性开关,用输出电压滞回控制。

这里最容易出的问题:模式切换瞬间的占空比和环路状态不连续,产生电流冲击。我调试时就遇到过CRM转CCM时母线电压突然拱起一个尖峰,后来在切换点加了环路的"bumpless transfer"处理——切换前把目标模式当前所需的占空比计算出来,作为新模式下PI的初始输出,保证切换前后占空比不发生跳变。

模式划分的边界,可以基于瞬时功率或电流有效值来判断,但要注意回滞:进入CRM的阈值设在比如30%额定负载,切回CCM则设在32%额定负载,避免轻载重载交替时在两个模式之间频繁抖动。

3. 关键时序背后:死区、谷值开关与ZVS的实现代价

3.1 死区时间的计算与实测调优

死区时间的设计会直接影响可靠性和效率。给太短,上下管直通,GaN器件的硬击穿速度非常快;给太长,死区期间体二极管或GaN反向导通时间变长,反向导通压降大,损耗很可观。

一个工程估算的思路是这样的:死区时间至少需要覆盖两个过程,一是功率管自身关断过程中的拖尾时间,二是半桥中点电压(SW点)在电感电流作用下从一轨换向到另一轨所需的时间。第二个过程用公式简单估算:

t_dead_min ≥ Qoss / iL_sw

Qoss是功率管的输出电容电荷,iL_sw是死区开始时刻的电感电流。例如某颗650V GaN器件Qoss大约几十nC,在CCM模式下电流几安培时,这个时间在几十纳秒量级。再加上关断延迟的余量,我实际用的死区通常在30ms到80ms不等,注意这里是纳秒(单位换算后是ns,实际量级为几十ns),具体值要通过测试逐点压缩。

实测过程中可以这样操作:先用一个相对保守的大死区(80ns)跑起来,验证驱动逻辑正确、没有直通风险,然后示波器看SW点电压上升沿和下降沿是否完整并清晰,逐步减小死区。当你看到SW点斜率变缓,说明死区不足以完成完整的换向,此时退回到略大于这个极限值的设置,再留20%到30%的余量。

GaN和Si管的死区取向不一样,这个一定要分开处理。Si管体二极管反向恢复电荷大,死区时间过短时反向恢复损耗会明显拉高;GaN器件没有体二极管,靠的是反向导通,死区时间反而要尽量缩短,否则反向导通损耗比Si还难看。如果你用同一套死区程序去带两种管子,效率数据会骗你。

3.2 谷值开关的数字检测实现

进入DCM或CRM之后,电感电流为零的区间里SW点会因电感与Coss谐振而产生电压振荡。如果在振荡波形的谷底开通上管(或在对角位置开通下管),可以把开关管两端电压压到最低甚至零,这就是谷值开关(Valley Switching)。

数字控制器实现谷值开关的常见做法:使用比较器检测SW点电压跌落到阈值以下,触发PWM模块启动开通信号。要注意的是,数字控制器自身的响应延迟要在触发逻辑里预留补偿。我的做法是:比较器事件触发打开,但实际开通时刻往后延时固定的Td_comp,这中间由PWM硬件定时器精确控制,而不是直接同步门控。这样比较器的抖动和芯片内部的触发延迟不会直接累计到每周期里。

检测窗口也要做时间限制。SW振荡的周期由电感和Coss决定,可能只有几百纳秒到一两微秒。如果不在软件里开一个窗口,任何一个毛刺都可能让比较器误触发。窗口通常在PWM关断后打开,持续到预设的最晚开通时刻。

3.3 数字延迟对环路的影响与补偿

数字PFC和模拟PFC的差异,核心就在"延迟"二字。一次完整的数字控制路径包含ADC采样时间、算法计算时间、PWM装载生效时间。如果开关频率是100kHz,单更新模式下从采样到生效最长可以到10微秒,环路相位损失相当可观。

处理延迟我常用的几个手段:

  • 用双更新模式:PWM在计数器周期值和零值处各更新一次,开关频率不变的情况下,控制频率翻倍,等效延迟减半。代价是CPU算力需求提高,算法必须在半个开关周期内算完;
  • 预测式采样:在ADC采样完成后,根据当前的电感电流变化率和已知占空比,推算到实际PWM生效时刻的电流值,用这个预测值做控制。给的补偿量要谨慎,预测太激进容易引入高频噪声;
  • 电流环用近似一阶模型加数字延迟项,再整定PI:把延迟近似成一个一阶惯性环节,带宽目标放在[开关频率/10]以内,这样工程余量充足,调起来不容易翻车。

延迟补偿的效果,我强烈建议结合扫频实测来验证。用网络分析仪直接测数字环路的开环波特图,比纸上算模型可靠得多。实测发现相位裕量不够时,最有效的修改不是加零点,而是降带宽或改用双更新。

4. 数字实现与系统保护:ADC时序、PWM装载、软启动和限流

4.1 ADC采样时机与PWM装载模式的具体选择

ADC采样时机这个话题在模拟控制时代根本不存在,但在数字控制里属于"稳定压倒一切"的细节。PWM开关动作会在几十纳秒内带来几百伏/微秒的dv/dt,通过寄生电容耦合到采样回路,产生明显的毛刺。如果ADC恰好在开关动作的瞬间采样,结果就是电流电压信号里多出一堆尖刺,PI环路被这些毛刺喂饱,输出抖动。

我的采样策略是:把所有采样事件安排到开关周期的低压摆率区间。CCM模式下,把采样点放到PWM关断期间的中点,并让ADC的采样窗口尽量短;必要时在芯片引脚和ADC输入之间加RC滤波,截止频率放在几百kHz量级,对控制环路的相位影响可以忽略。用数字滤波再平均几次也不是不行,但要权衡额外延迟。

PWM装载模式建议直接用立即装载与周期装载分开:控制环路算出的占空比通过影子寄存器缓存,等PWM计数到周期边界一并生效。如果所有寄存器都立即生效,每个中断里PWM占空比都有可能跳动,反而不利于稳定性。实际调参时,你需要在控制频率和计算负荷之间找一个平衡点,这个点通常标注在芯片参考手册的电气特性表里。

4.2 软启动、逐周期限流与饱和保护

图腾柱PFC上电冲击比普通Boost更敏感,因为直接跨过整流桥,母线电容充电电流没有二极管桥的缓冲。软启动必须分级处理:

  • 第一阶段:预充电阻或NTC限流,母线电容电压充到整流后的峰值附近;
  • 第二阶段:PFC开始工作,但输出电压基准从当前母线电压逐步爬升到目标值,爬升斜率由环路积分状态的初始限幅控制;
  • 第三阶段:电压环和电流环切换到正常带宽。

逐周期限流方面,我推荐比较器直接比较电流采样信号和限流阈值,超过则立刻封锁本周期的PWM,而不是等ADC算完再反应。ADC即便再快,从事件到封波也有微秒级的延迟,对短路而言已经太久了。硬件比较器直接触发的逐周期限流,延迟可以做到几十纳秒级,这才是真正可靠的保护。

软件保护同样不能省:母线过压、输入过压、过温都要有。过压保护尤其要在全负载范围做测试,因为母线电压在满载切载时会有一个较大的过冲,如果保护阈值给得太紧,很容易在动态响应时误触发。

4.3 基于状态机的上下电时序管理

数字控制器的优势之一就是可以用状态机管理上电和掉电时序。我自己的状态机一般是:

IDLE → SOFT_START → CCM_RUN → FAULT / SHUTDOWN ↘→ BURST / STANDBY → CCM_RUN

掉电时,PFC需要尽快停止开关动作,同时系统主控要有序接管。我的做法是检测母线电压下降到一个阈值后,先关闭PWM输出,再记录当前故障原因到非易失区域。整个过程要避免在掉电瞬间突然全载突切,否则母线电容会有明显的啪一声,瞬时电流冲击可能直接打穿低压侧的电路。

上电状态的切换条件要加回滞和延时确认,比如母线电压要连续几个开关周期都大于阈值才进入下一步,避免临界状态下反复横跳。

5. 调试中真实遇到过的坑:波形畸变、轻载振荡与效率疑惑

5.1 电感电流过零畸变与门限回滞

第一次做图腾柱PFC时,我遇到的第一个怪现象是:满载效率正常,但满载电流波形在过零附近有一个明显的"台阶",就像正弦波被切了一刀。查了很久,最后确认是ZCD的门限设置得太灵敏——电流在过零附近抖动,比较器反复触发切换,低频桥臂的驱动逻辑在半周期内来回翻转,电流自然就平台了。

解决方式是给ZCD做一个滞回比较器:正方向过零后,要让信号点低于负门限才确认极性反转;反方向同理。这个滞回带宽我建议先按额定电流的2%设置,再结合实测波形微调。调好之后,过零台阶消失,THD能从10%左右降到3%以下——注意这一步对功率因数的影响是决定性的。

5.2 轻载振荡与切换点不一致

第二版样机在轻载时出现了明显的输出电压低频振荡,周期大约几十毫秒,伴随一个连续的啸叫声。用示波器看母线电压波形,能看到一个缓慢的锯齿状波动。查下来是CRM和Burst模式切换点之间没有回滞,负载在切换点附近徘徊,控制模式频繁切换引起的。

此外,轻载时环路增益和满载时差异很大,固定的PI参数在轻载段容易过冲甚至震荡。我的做法是:轻载段单独用一组环路参数,或者根据负载大小做增益调度,切换点之间加至少3%到5%的回滞。修完之后,轻载到重载全程输出纹波可以从几百毫伏压到几十毫伏,耳听的啸叫也随之消失。

5.3 效率反倒变差的原因

某次实测下来,同一块板上用数字控制仿真的效率比模拟控制方案的参考数据还低,这让我一度怀疑数字方案的价值。后来把输入功率和输出功率同时拉出来做损耗分离,才发现问题不在环路,而在死区参数——我把针对Si管优化的死区沿用到了GaN管上,死区内的反向导通损耗白白烧掉了一截效率。把死区从60ns压缩到35ns后,满载效率回升了大约0.4个百分点。

还有一次效率下降的根源是开关频率选择不当:为了追求小电感把频率拉到200kHz,但驱动的开关损耗和非线性电容损耗同时抬升,整体效率反而低于100kHz方案。换回100kHz并把电感量适当加大之后,效率回到预期值。效率曲线这东西,不能只看满载一个点;10%负载、50%负载、90%负载各有各的坑。

6. 白皮书中不方便写、但我建议你保留的实测经验

6.1 上电前必做的检查清单

调试数字电源样机,我每次上电前都会按这套方法过一遍,花不了几分钟,但能省下大把排查时间:

  • 检查PWM输出逻辑:用示波器看空载下各管驱动波形,确认死区存在、无直通;
  • 检查ADC采样通道:用信号发生器给一个标准正弦波,记录采样值和实测值对比增益与偏移误差;
  • 检查故障保护通道:人为给过压比较器一个超过阈值的信号,确认能封波和置位故障标志;
  • 检查软启动条件:确认状态机处于IDLE状态,母线电压预充正常,才允许启动。

我第一次调样机时跳过预充检查,结果上电瞬间母线电容充电电流直接把NTC炸得冒烟了。从此之后,预充确认成了我上电流程里最优先的一步。

6.2 测量探头与接地方式对波形判断的影响

调试高频开关电路的波形,探头接地方式比探头带宽更能决定波形真实性。用长接地线夹在SW点上测,环路电感引入的高频振铃会被误判成电路问题;用短接地弹簧直接接在测量点附近的GND上,就能看到真正的开关波形。对比过两种接法,SW点的振铃在示波器上显示的幅度能差出一倍还多。

另外电感和电流探头测的波形也不同——电流探头测量延迟与带宽都会影响你判断ZCD的实际时刻。建议用电流探头在电感支路上同时观察过零点的波形,和内部ZCD比较器的门限一起比对。这个方法能快速定位过零畸变是探头假象还是电路真问题。

6.3 与电容、磁性元件布局纠缠的另一个经验

电感的选择直接决定电流纹波和开关频率的折中。数字控制的灵活性允许你根据温度动态调整开关频率,但功率电感的磁芯损耗会随着频率升高飞快增加,单纯认为数字可以"随便调频率"是很危险的。磁芯材料选型也要配合数字方案的使用范围,至少要覆盖你代码里设置的频率折返区间。

测量母线电压时,我习惯在高压分压电阻附近就近放一个小电容,高频噪声从采样引脚泄放掉一部分。这个电容的取值从pF级别起步,加得太大反而会引入AC信号的相位误差,影响输入电压采样和极性判断的精度。


做数字图腾柱PFC这一年多,我踩过的坑和学到的经验,几乎都集中在"数字"两个字上:采样时序、死区设置、模式切换、环路延迟、保护逻辑。拓扑本身是有标准答案的,但控制器的每一行配置,都需要跟实际器件、实际布局、实际工况对着调。这套设计方法不只适用于图腾柱PFC,你把它迁移到其他数字电源拓扑,同样能复现那些"看似简单但实际要靠耐心打磨"的控制细节。最后送一句个人心得:数字电源调试,规则是先保安全,再保稳定,最后才谈效率——顺序反了,效率曲线一张都测不完。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/28 1:11:55

AIoT开发工程师岗位全景解析:从嵌入式Linux到边缘智能的转型路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/28 1:11:53

STM32H750 Bootloader与QSPI Flash应用升级方案解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/28 1:09:31

STM32黑客松实战指南:从快速原型到现场夺魁

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/28 1:08:41

C++/Python混合架构:构建高性能量化回测框架的关键实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/28 1:08:33

从Win32消息循环到战车战斗:VC版重装机兵源码拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/28 1:08:15

MATLAB例程从解压到跑通:路径、调参与二次开发避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华