ARTICLE DETAIL

资讯详情

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

基于dsPIC33的四开关Buck-Boost双向DC-DC数字电源设计

基于dsPIC33的四开关Buck-Boost双向DC-DC数字电源设计 简介本资源是一套面向嵌入式电源系统开发者的完整双向DC-DC变换器工程实现方案聚焦电池储能装置中的能量双向调控需求适用于高校电力电子课程设计、毕业设计及中小型储能系统原型开发。方案基于dsPICFJ256GP710单片机采用Buck-Boost拓扑结构支持Buck模式恒流充电效率≥94%与Boost模式恒压放电效率≥95.5%集成过压保护与DS18B20温度检测功能具备工业级可靠性设计特征。压缩包共40个文件含9个C源码、9个头文件、9个目标文件及PCB原理图.SchDoc、PCB布局.PcbDoc、论文文档.doc、可执行固件.hex等核心交付物总大小7.52MB结构清晰便于从控制逻辑、硬件设计到系统验证全流程学习。已有169人下载学习提供从算法实现PWM、ADC、定时器驱动、外设接口LCD12864、按键、温度传感到PCB工程落地的全栈参考。 把需求拆开看这个项目其实包含了几条线dsPIC单片机的数字控制、Buck-Boost四开关拓扑、双向能量流动、PCB设计以及一套完整的论文和源码。如果你也卡在“想做数字电源但不知道从哪里下手”或者已经搭好了硬件但程序调不通这篇内容可以给你一些参考。先说结论四开关Buck-Boost方向做双向DC-DC是中小功率储能、电池充放电、无人机供电、车载辅助电源这些场景里很实用的方案。用dsPIC做主控不是因为迷信Microchip而是因为它的PWM和ADC模块配合度极高特别适合数字电源这种需要PI环路高速跑的场景。整个项目做完你手里会有一套能直接改参数重新打样复现的源码、一块功能完整的PCB以及一份拿得出手的论文底稿。1. 双向DC-DC的需求来自哪里拓扑选型背后的四开关Buck-Boost逻辑1.1 双向变换器的应用场景与设计需求双向DC-DC变换器说人话就是同一个变换器既能让能量从A端流向B端也能让能量从B端流向A端。最常见的需求是电池和直流母线之间做能量管理电池放电时把电池电压变换到母线电压电池充电时把母线电压降下来给电池充电。光伏配储能、电动车动力电池与回收系统、UPS的充放电模块、机器人电池与伺服母线都是这类应用。我的项目需求更具体一些低压侧电池电压范围10V到16V高压侧母线电压稳定在24V功率等级100W要求四象限运行也就是既能Buck放电也能Boost放电反向就是充电时既能Buck降压也能Boost升压。这种宽范围的输入输出变化直接用Buck或者Boost都搞不定因为Buck只能降压Boost只能升压。如果低压侧比高压侧低要用Boost方向反过来则要Buck方向。两个方向都要有就需要一个升降压拓扑。1.2 四开关Buck-Boost拓扑的工作模态四开关Buck-Boost其实就是两个半桥中间夹一个电感。左边两个开关管构成一个半桥右边两个开关管构成另一个半桥电感放在两个开关节点之间。四个开关管通常是两个半桥驱动芯片分别驱动上下管互补每个半桥的输出节点就是电感的左端和右端。这个拓扑的精妙之处在于它可以看成Buck和Boost的级联但省掉了中间电容。当左半桥高频开关、右半桥固定开通或同步整流时它是Buck电路当右半桥高频开关、左半桥固定开通或同步整流时它是Boost电路。因为左右两个半桥都有同步整流能力所以电流可以双向流动不管工作在Buck还是Boost模式窄脉冲那边负责能量传输宽脉冲那边就做同步整流。对于双向关键是不要把它想成“两套独立的单向DC-DC”。双向的核心是控制电感电流的方向。比如高压侧24V低压侧12V正向Buck模式下能量从24V流向12V电流向右。如果这时候想让能量反向立刻切换成Boost模式右半桥开关左半桥同步整流电流方向就反过来了。控制逻辑上只需要根据电压参考变化或者电流指令的正负来判断该跑哪个模式。1.3 为什么不用普通Buck-Boost电路传统两开关Buck-Boost电路也能升降压但是它的输出极性是反的也就是说输出端与输入端的负端不共地这带来很多麻烦。很多隔离电源会用它但在非隔离双向应用里四开关Buck-Boost才是主流。四开关还有一个好处电感两端电压应力可控占空比不会出现极端的情况工作范围更宽。同样是12V转24V如果用传统反极性Buck-Boost占空比可能要到接近0.7电感电流应力很大。而四开关Buck-Boost可以让左半桥按Buck模式工作右半桥同步整流电感电流波形更好效率更高。我在选型的时候也考虑过Zeta、SEPIC这些拓扑但它们要么需要耦合电感要么电容数量多控制更复杂而且双向扩展并不方便。四开关Buck-Boost的四个开关管工作在不同组合下控制自由度大很适合用数字控制去做模式切换和环路补偿。2. dsPIC33做主控PWM与ADC深度配合是数字电源的绝配2.1 从普通单片机到dsPIC的跳跃很多人做电源第一反应是用STM32或者普通的8位单片机。这也不是不行但一旦开关频率上到100kHz以上控制环路的延时问题就会非常明显。普通单片机的ADC采样、计算、更新PWM占空比这三个动作如果串行执行一个控制周期可能做不到10us以内环路的相位裕度会变得很差。dsPIC33系列不一样它好就好在把PWM模块和ADC模块设计成了可以硬件触发的组合。ADC转换周期可以由PWM触发事件同步启动转换完成之后用DMA直接搬运结果到RAM然后CPU在下一个PWM周期开始前把新的占空比值写入PWM模块。这个过程大大减少了软件上的等待和调度开销。我用的是dsPIC33EP64GS50264KB Flash主频最高70MIPS对于数字电源来说完全够用。它自带4路专用PWM模块支持80ps级的分辨率以及一个12位ADC采样率最快到3.5Msps还有模拟比较器可以直接做快速过流保护不需要经过CPU。2.2 PWM模块配置和死区管理四开关Buck-Boost需要两路互补的PWMPWM1驱动左半桥PWM2驱动右半桥。dsPIC的PWM模块可以自动生成互补输出并且提供可编程的死区插入。死区参数太大会限制最大占空比太小会直通炸管。我最终设的是180ns死区用的是250kHz开关频率。这里有个关键点死区不是越大越安全。死区期间电感电流会通过MOSFET的体二极管续流体二极管反向恢复时间长损耗很大而且容易产生振铃。所以我选MOSFET的时候特意选了体二极管反向恢复时间短的型号另外在死区参数上做了权衡既不能过短导致上下管交叉导通也不能过长导致效率和EMI变差。PWM模块还要配合重载周期寄存器。在初始化代码里要设置PTPERPWM时基周期寄存器通过它决定开关频率。例如PLL配置到140MHzPWM周期寄存器设为559就能得到250kHz的开关频率。用公式算一下f_PWM f_PLL / (2 * (PTPER 1))。这里每组PWM模块有独立时基可以方便做相移控制虽然本设计用不到但也很重要。2.3 ADC采样同步与控制环调度源码设计核心是让ADC采样和PWM周期同步。我采用PWM周期中点采样也就是在PWM定时器计数归零时触发ADC这样采样到的电感电流纹波平均值比较接近真实平均值而不是峰值或者谷值。如果采样点落在开关管开通或关断的边沿附近很容易采到巨大的开关噪声导致环路误动作。ADC的触发源可以直接配置为“PWM模块触发事件”不需要外部引脚连接。每个PWM周期触发一次ADCADC转换完成后产生中断然后把采样值换算成实际电压和电流再执行数字PI计算最后更新PWM占空比。为了减少主循环干扰整个控制环都在ADC中断里执行主循环只处理按键、显示、通信这类低速任务。这里给你一个参考配置顺序初始化时钟-初始化PWM时基和死区-配置ADC触发源和通道-配置DMA可选-使能PWM输出-开ADC中断-进入主循环。3. 功率级和驱动电路的硬件计算电感、MOS管、半桥驱动3.1 主功率电感设计计算这个环节计算错了后面调试必炸。根据能量存储和纹波电流公式电感量L (Vin * D) / (freq * ΔI_L)。如果高压侧24V升压低压侧12V降压假设满载100W平均输入电流约8.3A低压侧设定电感纹波电流峰峰值为平均电流的30%也就是约2.5A。开关频率250kHzBoost模式占空比约50%那么L (12 * 0.5) / (250k * 2.5) ≈ 9.6uH。我这里最终选了10uH。注意电感电流的有效值RMS可比平均值大不少设计时用RMS值去选电感额定电流而不是简单的直流电流。10uH/12A电感的饱和电流至少要选15A以上留30%余量。另外磁芯材料别用铁硅铝那种低μ粉芯环虽然不容易饱和但损耗在大电流下很明显。我用的是铁硅合金环形磁芯具体型号不说了反正绕线时注意别让线圈离外壳太近。3.2 MOSFET选型考量四开关Buck-Boost里的四个开关管每一个在工作和同步整流状态下的应力并不对等。低压侧两个开关管承受的最大电压是高压侧母线电压24V高压侧两个开关管承受的最大电压是低压侧电压12V加反电动势也基本在24V以内。所以电压应力不算大但要特别关注电流应力和Rds(on)。我选了100V/40A的MOSFETRds(on)约9mΩQg约40nC。选大电流主要是为了降低导通损耗尤其同步整流期间电流流经MOSFET沟道时损耗是I²R在小体积下散热不理想Rds(on)越低越好。高频开关下Qg太大则栅极驱动损耗和驱动芯片的驱动能力都要重新估算。栅极电阻也很关键。我用的是1Ω到4.7Ω的栅极驱动电阻用来调节开关速度和抑制振铃。电阻太小开关速度过慢开关损耗大电阻太大虽然能抑制EMI但驱动芯片拉不动栅极容易让MOSFET在开关中途进入线性区直接导致发热。实际调试时我用示波器看Vgs波形在保证波形圆润不震荡的前提下尽量减小栅极电阻。3.3 半桥驱动芯片与自举电路驱动电路采用半桥驱动芯片芯片内部集成了上管驱动、下管驱动、自举二极管和欠压锁定。典型型号如IR2104、IRS2186、UCC27714我用的是IR2104的兼容型号便宜好用带硬件关断引脚方便接保护信号。需要特别注意自举电容的选型。上管悬浮供电依靠自举电容充放电电容容量太小导致上管开通瞬间电压跌落太多会让上管米勒平台期间栅极电压不足。我选的是100nF陶瓷电容并联一颗10uF的电解电容这是很通用的组合。另外自举电容的充电路径要经过自举二极管和限流电阻这个限流电阻太小会冲击自举二极管太大会导致充电不足。IR2104的数据手册上建议加1Ω到10Ω之间的限流电阻我最后用4.7Ω实测Vgs波形正常。需要注意的是当PWM占空比接近100%时上管长时间导通自举电容得不到有效充电会造成“自举电容饥饿”。这种情况在Buck模式下如果占空比太高就会出现上管驱动波形畸变。所以控制算法里我做了最大占空比限制钳位在95%左右。3.4 采样与保护电路电压采样用电阻分压再经过RC滤波和电压跟随器送入ADC。分压电阻的精度直接影响测量精度1%的电阻是底线最好用0.1%。我实测用0.1%的精度低压侧12V可以做到±10mV以内。电流采样这里走了点弯路最开始用低边检流电阻采样但是四开关Buck-Boost的PWM地是高低边交替的低边采样在高端开关导通时无法准确反映电感电流。后来改成高边检流电阻差分放大器的方式参考电压浮动比较大但用差分放大器后效果还行。为了更准确也可以直接用电流传感器芯片比如ACS712或霍尔传感器不过贵一些。我用的是INA240专门适应高共模电压的电流检测放大器可以直接接在电感支路上。保护方面最重要的就是过流保护。软件过流可以靠ADC检测后做限流但速度不够快。dsPIC的模拟比较器可以配合PWM的硬件故障引脚当检测电压超过阈值时立即关闭PWM输出响应时间在几十纳秒级。我在源程序里专门做了这段硬件保护配置并演示过人为短路能可靠关断。4. 控制源码怎么搭状态机、PI调节器与双向切换的实现4.1 代码结构和工程目录源码工程用MPLAB X IDE XC16编译器开发目录结构尽量分层避免把一堆函数堆在main.c。我的源码分成模块main.c系统初始化、主循环adc.cADC配置和中断服务程序pwm.cPWM初始化、死区配置control.cPI调节器、数字滤波、方向判断fault.c故障检测和状态机peripherals.c按键、LED、串口显示每写完一个模块就单独编译别等全部写完再调试不然一旦出问题根本不知道是硬件还是软件。4.2 核心控制算法实现主控制环我采用的是电压外环和电流内环的双环控制结构。电压外环根据目标电压和当前输出电压之差计算电流指令电流内环根据电流指令和实际电感电流之差更新PWM占空比。为什么用双环因为Buck-Boost本质上是一个二阶系统直接单环电压控制动态响应差尤其负载突变时电压回落很大。电流内环相当于把一个电流源驱动到了电感路径上电压外环只需要控制“往电感里”灌多少电流响应速度会快很多。PI调节器我用的增量式代码如下typedef struct { float Kp; float Ki; float integral; float out_max; float out_min; } PI_Controller; float PI_Update(PI_Controller* pi, float err) { pi-integral pi-Ki * err; // 积分限幅 if (pi-integral pi-out_max) pi-integral pi-out_max; if (pi-integral pi-out_min) pi-integral pi-out_min; float out pi-Kp * err pi-integral; if (out pi-out_max) out pi-out_max; if (out pi-out_min) out pi-out_min; return out; }积分限幅一定要做不然启动时刻积分疯狂累积占空比会直接飙到最大电感电流爆增轻则炸MOS管重则烧保险。我这里调Kp和Ki的时候采用的是先调Kp增大到输出开始震荡再调Ki逐步找到响应和稳定性的平衡点。4.3 双向切换状态机模式切换是双向DC-DC最容易出bug的地方。我用了四个状态FORWARD_BUCK、FORWARD_BOOST、REVERSE_BUCK、REVERSE_BOOST。还有一个SOFT_START状态每次切换都会先进入软启动。状态切换的核心判断条件是输出电压与目标电压的差值以及方向标志。比如高压侧基准24V低压侧基准12V如果检测到高压侧电压低于24V且需要从低压侧取电就进入正向Boost状态如果高压侧电压高于24V需要回灌低压侧就进入反向Buck状态。切换的时候不能瞬间把PWM占空比跳到目标值需要斜坡或者按步进变化。我从当前占空比开始每100us增加1%的占空比步进直到目标值。实测这个做法能把电流超调控制在设计范围之内。在源码里还有一段重要的代码是ADC中断里的执行序列先读电压再读电流然后跑模式状态机再执行电流环PI最后更新PWM。这里一定要关注执行时间我实际跑下来整个中断执行时间约4usPWM周期4us250kHz也就是说CPU有接近一个周期的时间都在跑控制环留给低速任务的时间很紧张所以低速任务很少放进中断。5. PCB设计复盘功率环路、采样布线与EMI抑制5.1 功率环路最小化四开关Buck-Boost的功率回路里有两个开关节点左边和右边。最忌讳的是把输入电容、MOSFET、输出电容之间的回路拉得很长环路面积大了寄生电感就会产生高尖峰电压直接导致MOSFET过压击穿。我的做法是先确定输入和输出电容的位置让它们紧挨着对应的半桥。高压侧半桥的上管漏极接到高压侧正极低压侧半桥的下管源极接到地这些回路的铜皮面积要尽可能小。电源地要单点汇接到输入电容的负端不能乱铺通。实际我画了四层板第二层整层当作完整参考地第4层是电源层顶层和底层走信号和功率功率走线尽量加宽。实测相同控制参数下四层板比双层板的SW节点振铃小了差不多30%。5.2 采样走线和地线布局采样的走线是高频开关电路里最容易出错的环节。电感电流检测放大器输出的模拟信号如果走线穿过功率区域很容易引入高频噪声。我把采样信号从功率区域拉出来之后先穿过一个RC低通滤波器截止频率大约1MHz再进ADC。这个滤波器是必须的哪怕dsPIC内部已经有滤波外部再加一道会更干净。IGBT或者MOSFET的开关节点SW节点旁边不要平行走采样线。我layout的时候特意让采样线远离SW节点至少3mm如果空间不够就用地线隔离。还有一点ADC的参考电压引脚一定要处理好我用的是内部Vref但还是额外在引脚旁放了一个0.1uF1uF的电容。否则ADC结果会随开关噪声波动环路稳定性直接受影响。5.3 散热设计与实际性能100W功率下就算效率做到94%仍然有大约6W的损耗要散发。MOSFET是主要损耗来源我用的是DPAK封装在PCB上给漏极铺了一大块铜皮作为散热片。同时加了过孔阵列把顶层热量导到内层和底层铜皮。板子实测结果如下测试条件输入电压输出电压负载功率效率正向Boost12V24V50W96.5%正向Boost12V24V100W94.8%反向Buck24V12V50W95.9%反向Buck24V12V100W94.1%满载工作半小时MOSFET表面温度在70℃左右可以接受。如果你们要把功率做到200W以上建议用TO-220封装并外加散热器或者直接用同步整流的GaN器件。6. 调试、实测与论文整理真正完成一个可复现的电源项目6.1 调试流程从空载到满载的递进我调试这个板子时的顺序很死板但很有效。第一步不上电检查各电源对地阻抗是否有短路。第二步只给控制板供电用示波器观察PWM模块是否有输出且死区时间正确。第三步输入串接一个电流限制在1A的稳压电源在空载情况下输出PWM看输出电压能不能建立并粗略检查输出电压纹波。第四步用电子负载从10%负载开始加载逐步加大负载同时观察输出波形和电流波形。这个过程里最容易发现问题的阶段是空载到轻载因为此时电感电流进入断续模式控制环路的传递函数会变化。我遇到过用连续模式参数跑断续模式结果出现电压振荡的情况。数字电源里解决这类问题通常有两种思路一是加入“电流连续与否”的判断用不同的PI参数二是简单粗暴地增加一个固定的小负载或者加入同步整流强制连续模式。我为了减少控制复杂度在软件里加入了最小电流钳位让电感电流始终保持在临界连续之上这样整个负载区间内都是连续模式控制参数不需要变。6.2 典型故障和排查思路我在这个项目里踩过两个值得说的坑。第一个是上电时烧了一颗MOSFET。排查下来发现是最大占空比限制没做好软启动功能没有严格执行启动瞬间PWM占空比直接跳到计算值电流斜率过大瞬间超出额定电流。后来加入斜坡软启动并且用示波器双通道拍Vgs和电感电流确认启动过程电流没有过冲。第二个坑是DS电压波形有严重振铃。一开始以为是LC谐振后来发现是MOSFET的栅极驱动回路环路面积太大栅极电荷注入产生的米勒平台导致导通瞬间的高频开关噪声。解决方法是把栅极驱动电阻和MOSFET的距离拉近并且减小驱动回路的面积同时在驱动芯片的电源引脚旁边多加了100nF10nF的高频退耦电容。振铃明显减小EMI也降了。6.3 论文与附件整理论文结构我建议按标准毕业设计或者技术报告的惯例来摘要写清楚你做了个什么变换器、用了什么控制策略、主要的测试性能第一章绪论介绍双向DC-DC的应用背景和国内外的研究现状不要写空话第二章讲系统方案和拓扑选型第三章详细写硬件电路设计第四章写软件设计第五章展示仿真和实测结果要有波形、效率数据。最后给结论和展望。源码和PCB附件一定要和论文里的描述对得上。我的论文里提到某个采样滤波器的截止频率代码里就必须有对应的实现。PCB版图里的器件位号也要和原理图一致不然评审老师对照起来会一头雾水。我最后交付时把源码、原理图/PCB工程、仿真文件、论文草稿分目录整理并且写了一份README说明怎么编译和烧录方便别人复现。整套源码中有一处值得单独说一下在MPLAB X的工程文件里我加了Kconfig式的宏定义注释方便切换Buck/Boost方向以及改目标电压这比让用户去代码里搜索数字“24.0”要友好得多。你如果以后要扩展双机通信、远程调压、恒流充电在这个框架上加模块会方便很多。最后再分享一个个人体会数字电源和模拟电源完全是两种思维。模拟电源调环路靠改RC参数数字电源调环路靠改PID系数但核心都是反复观察阶跃响应。我建议你每个项目都单独做一块“调试接口板”用uart和上位机连接实时显示电流、电压、占空比、PI输出这样能把你从无限次的示波器读数里解放出来。这个习惯我保留到现在做任何数字电源项目都会先做通信接口再调主电路。本文还有配套的精品资源点击获取
返回列表