双向DC-DC变换器电赛实战:从拓扑选型到PCB布局与调参避坑
简介一套完整的电赛双向DC-DC变换器赛题方案面向全国大学生电子设计竞赛参赛者、电气工程专业毕业设计学生及电力电子入门开发者解决从电路原理到软硬件联调的全流程参考需求。资源共25个文件压缩包5.14MB涵盖原理图SCHDOC、PCB设计源文件PCBDOC、基于STC12C5A60S2的Keil工程C/HEX/A51源码、设计论文DOCX等类型可分别对应硬件拓扑理解、板级布局实现、控制算法烧录与理论分析验证环节。已有251人学习下载。内含2020年全国电子设计大赛电源方向的双向变换器原始工程既展示Boost/Buck双向升降压的功率级设计细节也包含PWM调制、电压电流闭环调节的固件代码论文部分则补充效率优化与稳定性分析思路。适合需要对照完整项目快速上手、或希望复现竞赛作品的人群可直接基于Altium Designer与Keil环境打开源文件进行二次开发与调试。1. 双向DC-DC变换器电赛里「看着简单、上电就炸」的硬骨头双向DC-DC变换器是电赛电源题里最典型的双修题型同一套主电路既要降压给电池充电又要升压把电池能量送回母线。原理图翻来覆去就是半桥加电感、两侧电容但很多组打到样回来上电就冒烟最后连题目都交不完整。我带过好几届队伍做这个方向最深的感受是拓扑本身不值钱值钱的是PCB布局、死区参数、数字环路这三样「看不见的东西」。这篇文章按我自己的落地顺序拆开讲从拓扑选型、参数计算到原理图PCB、源代码调参再到最常见的翻车现场和验证方法新手能照着复现熟手也能对比一下自己的边界。2. 先定拓扑与指标双向半桥为什么是电赛的主流方案2.1 拓扑选型双向Buck-Boost与两级式怎么选电赛题目里最常见的双向DC-DC工作点是低压侧电池典型24V和高压侧母线典型48V之间互传能量功率从几十瓦到两三百瓦。这个范围下我一般会优先选双向Buck-Boost半桥拓扑也就是一个半桥、一个电感、两侧各一组电容。降压模式时高压侧上管高频开关低压侧下管做同步整流升压模式时角色互换下管高频上管同步。两个方向共用一个电感器件数量最少控制也最直观。还有一种两级式方案前级Buck调压、后级全桥做隔离适合功率更大500W以上或者输入输出需要电气隔离的题目。但电赛大多数题目不要求隔离加一级隔离只会把效率做低、把调试周期拉长。我做过的模拟项目X就是把第一版做成两级式结果光变压器设计就耗了三天后面换回双向半桥一天就调通了。选型时可以按下面这张表快速判断对比项双向半桥同步Buck-Boost两级隔离式典型功率≤300W≥500W效率90%~95%85%~92%控制复杂度低一套环路高两级分别控制电气隔离无有元件数量少多含变压器电赛适配度高低除非题目强制隔离2.2 控制架构CC/CV双环与模式状态机控制策略上双向DC-DC需要跑三种基本模式降压恒流充电、降压恒压充电、升压恒流放电。恒流和恒压本质上是两个PI环哪个环起作用取决于当前误差我用一个简单的状态机管理模式切换而不是直接在PI输出里取小值。取小值虽然也能工作但模式切换瞬间容易产生电流尖峰状态机加软启动过渡会更稳。状态机跑在10kHz~20kHz的中断里每个周期做一次ADC采样、一次PI计算、一次PWM占空比更新。10kHz的控制频率对100kHz的开关频率来说是够用的而且方便用标准外设库的定时器更新事件触发中断。模式切换要处理的边界是「恒流切恒压」当低压侧电压接近目标电压时电流环让位给电压环如果不做任何处理积分器里存着大电流误差切换瞬间输出会突变。我的做法是切换前把新激活环路的积分值复位同时限制每次PWM占空比的变化步长也就是给占空比加一个斜率限制通常每秒不超过10%的满量程。2.3 主电路参数计算电感、MOS管、驱动与采样我以一个典型电赛工作点为例高压侧48V低压侧24V额定功率200W开关频率100kHz。第一步算电感双向半桥在降压模式下的电感纹波公式是ΔIL (Vout/Vin) × (Vin-Vout) / (f × L)。取额定电流4.17A的20%作为纹波即ΔIL0.83A代入后L (24/48)×(48-24)/(100000×0.83)算出来约145μH我取标称120μH~150μH都行饱和电流要留到8A以上。第二步选MOS管耐压按高压侧电压的1.5~2倍48V系统选80V~100V耐压的管子额定电流按低压侧峰值电流6A左右再加1.5倍余量也就是选20A以上的。RDS(on)尽量低几毫欧到十几毫欧Qg也要小这样驱动损耗和开关损耗才压得住。驱动芯片用常见的半桥驱动自举电容取100nF~1μF并在旁边并联一个100nF的高速瓷片电容。第三步是采样参数。电流采样电阻一般取1mΩ~5mΩ的合金电阻我用3mΩ、额定电流6A时压降18mV后面接一个差分放大器放大到1.8V左右正好匹配MCU的ADC满量程。电压采样用1%精度电阻分压中点对地并一个100nF~1μF电容做滤波。核心参数见下表参数计算值说明电感L120μH~150μH纹波电流≤20%饱和电流≥8A高压侧电容470μF电解若干22μF瓷片靠近半桥放置提供高频脉冲电流低压侧电容220μF电解若干10μF瓷片兼顾输出纹波和负载瞬态MOS管80V~100V / 20A以上RDS(on)尽量小Qg尽量小自举电容0.1μF~1μFX7R/C0G材质紧贴驱动芯片采样电阻3mΩ 合金电阻封装2512或更大开尔文走线电流放大倍数100倍满量程对应约6A开关频率100kHz可在80kHz~150kHz调整这套参数不是唯一的答案但量级可以作为模板。如果你的题目是低压12V、高压36V或者功率只有60W按公式重新算一遍就行不用照抄。3. 原理图与PCB这样画才能避免「跑不起来」的返工3.1 原理图五大模块功率级、驱动、采样、保护、MCU原理图我按功率级、驱动级、采样级、保护级、MCU五块画每块都留下独立的测试点。功率级就是半桥两颗MOS、电感、两侧电容再加一个RC吸收电路典型100pF~1nF串联10Ω~47Ω并联在开关节点对地之间用于抑制开关振铃。注意RC吸收先预留封装实测振铃不明显可以不焊。驱动级是半桥驱动芯片加自举电容驱动电阻选3.3Ω~10Ω大小直接影响开关速度和振铃。驱动电阻太小开关瞬间di/dt太大容易振铃甚至炸管太大则开关损耗高。我一般先贴4.7Ω示波器看SW节点波形再微调。采样级两条路电压采样用电阻分压两个分压电阻都选1%精度温漂低的类型电流采样用差分放大器注意放大器的共模输入范围要覆盖低压侧电压范围很多同学选错放大器导致大电流时读数非线性。运放输出到ADC之间加一个RC低通截止频率取开关频率的1/10左右也就是10kHz滤掉开关噪声又能保留控制带宽内的信号。保护级一定要有硬件过流比较器输出直接接MCU定时器的刹车输入过流时硬件立即封锁PWM不依赖软件中断。软件过流最快也要几个微秒才反应硬件比较器可以做到百纳秒级差别很大。MCU部分选带互补PWM输出和可编程死区插入的型号确认PWM引脚电平与驱动芯片输入兼容不兼容就加电平转换或选用3.3V逻辑兼容的驱动芯片。3.2 PCB布局功率回路面积、开尔文走线与地平面PCB布局是双向DC-DC最容易拉胯的地方。原理图没问题、代码没问题照样上电炸管或效率低得离谱十有八九是布局问题。我自己总结的优先级是功率回路面积 驱动芯片位置 采样走线 地平面。功率回路面积是第一位。降压模式下的高频电流路径是高压侧母线电容→上管→电感→低压侧电容→下管→回到母线电容。这个环路包围的面积越小寄生电感越小开关尖峰越低。具体做法是把高压侧母线电容紧贴半桥开关节点与电感之间的铜皮短而宽不要绕圈。上管的漏极、下管的源极都接到母线电容的同一对焊盘附近让高频电流在板子上走「直线」。驱动芯片要放在被驱动的MOS管旁边栅极驱动线越短越好。自举电容紧贴驱动芯片的Boot引脚和开关节点引脚这段线长了上管驱动电压会掉得很厉害。电流采样用开尔文接法采样电阻两端各引一对线一对走功率电流一对走采样信号信号线在采样电阻本体处就近差分引出走到运放输入端不要在功率地回路里绕一圈。采样线还要远离开关节点避免容性耦合。模拟地与功率地在采样电阻的功率地侧单点相连其他地方完全分开。3.3 打样前检查清单丝印、测试点、电气规则打样前花半小时过一遍检查清单比板子回来再返工省一天。以下是我每次发板前的固定动作电气规则检查电源极性有没有接反电容耐压够不够MOS管引脚顺序对不对驱动芯片供电电压是否匹配。电感下方不要铺大面积铜皮否则涡流会发热这一点很多PCB软件检查不出来纯靠人工看。丝印检查MOS管方向、二极管方向、电解电容极性这三样错了基本就是上电烟花。我会在丝印层加粗标注地线、母线、电池三个关键网络。测试点检查母线电压、电池电压、开关节点、PWM信号、电流采样输出这五个测试点必须有用标准的测试环或焊盘。调试时示波器探头要有个地方下针没有测试点的板子调起来非常痛苦。爬电距离检查48V系统不算高压但高低压网络之间还是留至少1mm间距潮湿环境留2mm更稳。螺丝孔附近走线退避1mm以上避免安装时划破铜皮短路。4. 源代码里的关键互补PWM、数字PI与模式切换4.1 互补PWM输出与死区配置双向半桥需要两路带死区的互补PWM死区必须由硬件定时器插入不能靠软件翻转否则一次中断抖动就直接直通炸管。以下代码基于某款带高级定时器的32位MCU的标准外设库写成核心是配置时基、输出比较和死区刹车三个结构体/* 定时器1初始化100kHz互补PWM带死区 */ void PWM_Init(void) { TIM_TimeBaseInitTypeDef tb; TIM_OCInitTypeDef oc; TIM_BDTRInitTypeDef bdtr; /* 100kHz定时器时钟72MHzARR720-1 */ tb.Period 720 - 1; /* 720/72MHz 10us */ tb.Prescaler 0; tb.CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, tb); /* PWM1模式初始占空比50% */ oc.OCMode TIM_OCMode_PWM1; oc.Pulse 360; /* 占空比 Pulse/(Period1) */ oc.OCPolarity TIM_OCPolarity_High; oc.OCNPolarity TIM_OCPolarity_High; TIM_OC1Init(TIM1, oc); /* 死区约234nsDeadTime18DTS72MHz */ bdtr.DeadTime 18; bdtr.BreakState TIM_BreakState_Enable; bdtr.BreakPolarity TIM_BreakPolarity_Low; bdtr.AutomaticOutputState TIM_AutomaticOutputState_Enable; TIM_BDTRConfig(TIM1, bdtr); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); }死区寄存器值不是随便填的。以定时器时钟72MHz为例DeadTime每加1大约对应13.9ns填18就是约250ns。对100kHz开关频率下的常见MOS管100ns~400ns是比较稳妥的范围具体数值要结合你选的管子驱动延迟来定。程序里预留一个变量调参时直接改寄存器值在线观察效率不需要重新编译烧录。注意Pulse初始值我故意设为360也就是50%占空比但代码里真正使能主输出是在所有初始化完成之后避免上电瞬间PWM引脚出现不受控的乱跳。4.2 数字PI控制器与CC/CV切换的核心代码数字PI是整个控制环的核心我一般不用完全浮点库里的复杂写法就用一个结构体加一个更新函数。重点是抗积分饱和和最小占空比限制这两个不做炸管只是时间问题typedef struct { float Kp; /* 比例系数初始0.5~2.0 */ float Ki; /* 积分系数初始0.01~0.1 */ float out_max; /* 占空比上限0.90 */ float out_min; /* 占空比下限0.05 */ float integral; /* 积分累计值 */ float tau; /* 控制周期0.0001s 10kHz */ } PI_TypeDef; float PI_Update(PI_TypeDef *pi, float ref, float fb) { float err ref - fb; float out; /* 积分项带输出限幅抗饱和 */ pi-integral pi-Ki * err * pi-tau; pi-integral CLAMP(pi-integral, pi-out_min, pi-out_max); out pi-Kp * err pi-integral; out CLAMP(out, pi-out_min, pi-out_max); return out; }out_min设为0.05不是随便写的。CCM模式下占空比过低会让电感电流断续环路特性突然改变轻载启动时特别容易冲过头0.05~0.1的下限能挡住大部分启动异常。CLAMP宏做限幅误差极大时积分也不会飞。CC/CV切换逻辑放在10kHz控制中断里伪代码如下void Control_ISR(void) { float v_lo ADC_GetVoltage(LO_V); /* 低压侧电压 */ float v_hi ADC_GetVoltage(HI_V); /* 高压侧电压 */ float i_lo ADC_GetCurrent(LO_I); /* 低压侧电流 */ float duty; switch (state) { case MODE_BUCK_CV: /* 恒压目标是低压侧电压 */ duty PI_Update(pi_v, v_ref, v_lo); break; case MODE_BUCK_CC: /* 恒流目标是低压侧电流 */ duty PI_Update(pi_i, i_ref, i_lo); /* 电压超过目标自动切恒压 */ if (v_lo v_ref) state MODE_BUCK_CV; break; case MODE_BOOST_CC: duty PI_Update(pi_i_boost, i_ref, i_lo); break; default: duty 0.1f; /* IDLE模式下低压输出 */ break; } PWM_SetDuty(duty); }切入恒压模式时pi_i会保留积分值需要立刻清零否则切换瞬间PI输出的历史积分会叠加到新环路上。我这里直接在切换分支里执行pi_i.integral 0.0f同时把pi_v的积分也复位保证新环路从零开始。这个细节是调模式切换时最容易漏的。AI 在写代码时往往会忽略这个积分复位问题实际调试时你会发现CC切CV瞬间电压过冲0.5V以上多半就是积分没清。4.3 调试顺序先开环后闭环先电压环后电流环代码写完后不要直接上闭环我的调试顺序是开环固定占空比跑通、再调电压环、最后加电流环。开环阶段把占空比固定在一个安全值比如0.5空载上电示波器看SW节点波形确认死区正常、没有直通、振铃可接受。这一步能排除大部分硬件问题。电压环调试从低压侧给定目标电压的一半开始比如目标24V就先给12V看稳态精度和动态响应然后逐步抬高。电流环放到最后给定电流从0.2倍额定值开始确认恒流精度和纹波都正常再往额定值加。PI参数的经验值控制周期100μs下Kp从1.0附近起步太小响应慢太大的话电压会振Ki从0.01起动等Kp调稳了再慢慢加。每调一个参数记录输出电压波形和电流波形不要凭感觉记。5. 双向DC-DC避坑手册最容易翻车的5个现场5.1 自举电容容量不够导致上管驱动电压跌落现象重载时上管温度明显高于下管SW节点波形高电平幅度达不到母线电压继续加大负载就直接炸管。原因上管导通时栅极驱动能量全靠自举电容电容量太小高占空比下电容电荷被持续消耗驱动电压一路跌到欠压阈值以下上管进入线性区导通损耗飙增。解决自举电容换成100nF~1μF的X7R或C0G瓷片电容紧贴驱动芯片的Boot引脚高频开关时再并一个10nF小瓷片。确认自举二极管是高频快恢复类型不要用普通整流二极管。如果占空比经常超过90%则要考虑改成独立的隔离驱动电源。5.2 电流采样噪声导致CC模式振荡现象恒流模式电感电流波形上有明显毛刺电流读数来回跳输出电压伴随低频嘶嘶声。原因采样时刻落在开关瞬间附近开关节点的高dV/dt通过寄生电容耦合进采样走线或者运放输出到ADC之间的RC截止频率设得太高噪声没滤掉。解决运放输出到ADC之间加二阶RC低通截止频率取10kHz左右大约是开关频率的1/10。ADC采样时刻通过定时器触发把采样点移到PWM周期的中间或者谷值远离开关边沿。采样走线用开尔文差分引一对线不要在功率地回流路径上取信号。5.3 空载/轻载启动炸管现象输出电压还没建立电流瞬间冲到保护值MOS击穿板子冒烟。原因输出电容初始电压为零PI环误差极大积分快速饱和后输出100%占空比电感电流不受控。轻载时电感电流断续环路增益变化也容易让系统失控。解决代码里上电初始占空比限制在0.1~0.2PI积分上限不能超过0.3等输出电压建立后再逐步放开。启动阶段用软启动斜坡目标是让占空比以固定斜率爬升。还要确保MCU复位期间PWM引脚保持低电平最好加一个下拉电阻防止复位瞬间引脚悬空导致管子全开。5.4 死区时间设置不当导致效率低或直通现象效率测出来只有80%出头或者跑一会儿低压侧管子就烧了SW波形上能看到明显直通尖峰。原因死区太大两个管子都关断时电流从体二极管走二极管压降0.7V左右损耗成倍增加死区太小上管还没完全关断下管就开出现短暂直通。解决用示波器放大看SW节点波形测量上下管都关断的时间间隔。死区时间应该大于上管关断延迟与下管开通延迟之差再乘1.5倍余量。100kHz下常见值是100ns~400ns先按200ns调再根据效率曲线微调。效率对死区异常敏感每次调完死区都重新测效率能明显看到变化。5.5 万用表测纹波和效率数据完全不可信现象万用表显示的纹波电压和示波器差一个数量级算出来的效率波动很大。原因万用表频率响应只有几百赫兹到几千赫兹量不到开关纹波的真实峰值示波器探头用长地线夹子时地线电感会引入额外尖峰数字虚高。解决纹波用示波器测探头去掉夹子用弹簧地线或铜线直接接地尽量缩短回路电感。效率测量用同一台直流电源和电子负载电压电流都用四线法接分别记录输入电压、输入电流、输出电压、输出电流再算效率。保留原始数据论文里要用。6. 最后一公里用效率与动态响应验证这套设计6.1 双向效率测试别只看一个方向测试流程要固定低压侧接直流源、高压侧接电子负载测升压方向反过来降压方向。每个功率点记录四个量计算效率画成两条曲线。注意满载之前先把死区和驱动电阻调到位不然测出的效率低到会让你误判哪一块有问题。6.2 动态响应负载阶跃与电压跌落电子负载设成周期性阶跃比如10%负载跳到50%再跳回示波器同时看输出电压和电流。记录过冲量和恢复时间。恢复时间过长优先加Kp出现振荡就减Ki。6.3 论文实测素材三张图就够了论文里放双向效率曲线、负载阶跃波形、稳态纹波波形这三张图就够了每张图把关键参数标上去死区时间、电感感值、开关频率。我习惯第一张图横轴功率百分比、纵轴效率两个方向用不同颜色第二张标过冲幅度和恢复时间第三张标纹波峰峰值。这套图配合参数表比大段文字说明有说服力得多。我每次打完板第一步永远是接低压电源、限流100mA检查空载功耗再上高压。这个习惯救过我很多次有两次都是电流异常最后查出来是电容焊反和MOS封装画反。电赛这种时间紧的题目多花半小时做这一步比炸两块板再返工划算得多。希望帮到你。本文还有配套的精品资源点击获取