ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

基于STM32的Boost数控电源设计、参数推导与调试全记录

基于STM32的Boost数控电源设计、参数推导与调试全记录 简介面向嵌入式学习与电源开发者的STM32 Boost数控电源完整工程包覆盖STM32基础、Boost升压拓扑、恒流/恒压闭环控制及上位机通信等关键知识点。包内共510个文件以C语言源文件.c/.h、Keil工程配置.uvprojx/.uvoptx、编译生成文件.o/.axf/.hex以及PDF/docx说明文档为主另有上位机程序、芯片支持包和资源文件可直接打开Keil工程查看初始化配置与外设驱动。通过源码可深入学习PWM占空比调节、ADC采样、恒压恒流切换机制以及基于HAL/LL库的闭环控制算法。压缩包大小约32.82MB已有1604人学习下载。资料从工程源码、驱动库、上位机到设计文档一应俱全适合正在做数控电源课设、希望理解Boost电路数字化控制或想快速上手STM32电源项目的读者参考借鉴。 前阵子实验室要做一台宽范围可调电源手头正好有一堆12V适配器买成品数控电源价格不低于是决定自己动手用STM32做控制和交互Boost拓扑做功率变换做一台基于STM32的Boost数控电源。项目做完之后前前后后踩了不少坑从控制环路整定到PCB回流路径再到烧录报错每一类问题都值得拿出来单独说。这篇文章就把整个项目的设计思路、参数推导、调试过程和踩坑记录整理出来给准备做数控电源或者想深入玩Boost电路的朋友一个还算完整、能照着搭的参考。一、为什么选Boost拓扑项目定位与整体架构1.1 需求拆解要做一台什么样的电源做电源之前先把需求写清楚不然很容易做一个能出电压但没法用的东西。我的目标规格是这样的输入12V直流来自普通适配器输出5V~30V连续可调最大2A工作模式恒压CV优先附带限流保护控制精度输出电压误差在1%以内30V时误差不超过0.3V保护功能过压保护、过流保护、过温保护、软启动交互方式旋转编码器设定电压OLED显示实时电压电流这里最初也有人问为什么不用Buck或者Buck-Boost原因其实很直接输入就是12V而目标输出最高到30VBuck只能降压做不了。Buck-Boost虽然既能升又能降但控制复杂度和电感应力都比单独Boost高。如果应用场景明确是从低压升到更高压Boost就是最合适的拓扑它结构简单、器件少、效率能做高调试起来心智负担也小。Boost的电路原理可以用一个很直白的比喻来理解电感就像一个蓄水池开关管反复把水电流蓄进电感里再在关断瞬间把压力电压顶上去二极管负责让顶上去的电压只往输出端流电容再把脉动的电压抹平。通过调节开关管导通和关断的时间比例占空比就能控制输出电压的高低。1.2 系统架构功率级与控制级的分工整个系统可以分为两大部分功率级Boost升压主回路包括电感、开关管MOSFET、整流二极管、输出电容以及驱动电路和采样电路。功率级负责能量的变换与传递是这台电源的身体。控制级STM32最小系统板我用的是STM32F103C8T6蓝板那种就够用负责产生PWM控制信号、采集输出电压和电流、运行PID算法、处理编码器输入和OLED显示。控制级是这台电源的大脑。这两个部分之间通过三类信号连接PWM驱动信号从STM32的TIM1通道输出经过驱动芯片增强后送到MOSFET栅极电压反馈信号输出端分压电阻采样经RC滤波后送入STM32的ADC引脚电流反馈信号低边采样电阻两端的电压经运放放大后送入ADC整个控制逻辑是这样的STM32的ADC以固定频率采样输出电压与用户设定的目标电压做差差值经过数字PID运算后换算成PWM占空比的增量写入定时器比较寄存器从而调整输出电压使其稳定在设定值上。这是一个典型的闭环数字控制系统。1.3 开发环境与工具链开发环境我用的Keil MDK5配合ST-Link V2烧录器。STM32的开发方式现在主要分标准外设库和HAL库两派我习惯用标准外设库因为它对寄存器的封装更薄在需要精确控制定时器和ADC触发时序的时候代码逻辑更容易看清楚。这个项目里对时序有明确要求ADC采样要同步到PWM触发点上所以用标准外设库会更顺手。如果是新手建议还是先用HAL库搭一套能跑的工程再逐步往寄存器层面深入。开发环境这块还有一个容易被忽略的点STM32芯片包Device Family Pack一定要装对版本否则编译会报一堆莫名其妙的头文件错误。这点在Keil的Pack Installer里直接装最新版就行。二、Boost功率级参数推导从规格反推电感电容与开关频率2.1 核心公式与计算实例Boost电路在连续导通模式CCM下输入输出关系由占空比D决定Vout Vin / (1 - D)反解出占空比D 1 - Vin / Vout拿我的规格举例输入12V目标输出30V占空比D 1 - 12/30 0.6。也就是说开关管有60%的时间是导通的开关频率100kHz时一个周期10μs导通时间就是6μs。这是在理想情况下的计算实际电路中二极管压降和开关管导通压降会把占空比顶高一些这不要紧控制环路会自动修正。接下来是电感的设计。Boost电路的电感选择有两条基本约束电感值太小纹波电流大会加重开关管和二极管应力甚至进入断续模式电感值太大动态响应慢而且磁芯体积大工程上常见做法是让电感纹波电流峰峰值控制在平均电感电流的20%~40%之间。平均电感电流近似等于输入电流按效率85%估算30V/2A输出对应输入功率约70.6W输入平均电流约5.9A。取纹波系数30%则纹波电流ΔIL约为1.8A。电感计算公式L Vin × D / (fs × ΔIL)代入12 × 0.6 / (100kHz × 1.8A) 40μH取标准值47μH。电感在最大负载下的峰值电流约为6.8A选型时要留至少20%余量所以电感饱和电流至少要按8A考虑。我用的是一颗47μH/10A的铁硅铝磁环电感磁环的好处是磁芯不易饱和且不会像铁氧体那样有气隙噪声。输出电容的选型由输出电压纹波要求决定。假设输出电压纹波目标不超过100mVC ≥ Iout × D / (fs × Vripple) 2 × 0.6 / (100kHz × 0.1V) 120μF这只是一个基础值实际还要考虑电容ESR带来的纹波电压以及负载瞬态时的电压跌落。我最终用的是两个100μF/50V固态电容并联等效容量200μF加上一个10μF MLCC吸收高频分量实测满载纹波在60mV左右符合预期。2.2 开关频率的选择开关频率越高电感和电容体积越小但开关损耗和驱动损耗同步上升。在STM32上产生PWM本身没有压力100kHz对定时器来说负载很低所以我选100kHz作为基准频率兼顾体积和效率。如果你想让电源体积更小可以提高到200kHz~300kHz但这时对MOSFET的栅极电荷、驱动芯片的峰值电流要求和二极管的恢复速度都会有更高要求PCB布线难度也会明显增加。2.3 器件选型与损耗分摊开关管我用的是IRF3205TO-220封装Vds耐压55V漏极持续电流110A导通内阻典型值8mΩ。虽然这管子性能参数远超实际需要但它的优势是栅极电荷适中、驱动容易、价格便宜、散热方便。效率敏感的场景可以换低栅荷的管子但这里没必要。整流二极管用了MBR20100CT肖特基二极管耐压100V持续电流20A。肖特基二极管最大的好处是正向压降只有0.4V~0.5V左右而且没有反向恢复电荷在100kHz开关频率下能显著降低损耗。输出2A时二极管上的损耗约1W这个在可接受范围内。想进一步提升效率终极方案是用同步整流把二极管换成一个低导通电阻的MOSFET可以省掉这1W的损耗但需要多做一路互补PWM并仔细处理死区时间复杂度高不少。驱动电路用的IR2104半桥驱动芯片它内部集成自举电路单路输入就能输出高边和低边两路驱动信号。不过在这个Boost电路里其实只用了低边驱动也就是驱动MOSFET的开关动作。IR2104的驱动能力完全够用而且欠压锁定功能可以防止栅极驱动电压不足导致MOSFET工作在放大区。栅极串联了一个10Ω电阻作用是抑制开关振铃。效率方面满功率输出12V升30V/2A实测效率在88%左右。损耗主要分摊在三块电感磁损和铜损约1.2W二极管损耗约1WMOSFET开关和导通损耗约0.6W。如果想再抠效率可以从电感线径加粗、换成同步整流、优化栅极电阻三个方面入手但每优化一步都要增加成本和复杂度。三、STM32数字控制环PWM、ADC采样与PID整定3.1 为什么数字化控制优于模拟方案传统模拟电源用误差放大器和基准源来做反馈控制响应快、电路成熟缺点是参数改起来麻烦换一个分压电阻才能改输出电压想要精确到0.1V档位更是费劲。数字化控制的好处是灵活输出电压由程序设定旋一下编码器就能从5V调到30V不需要换硬件。而且数字PID的参数可以在软件里在线调整对调试阶段非常友好。数字化控制最大的考验是采样带宽和延迟。ADC采样、软件计算、PWM更新每个环节都有延迟如果PID参数给得太激进环路就会振荡。这是所有数控电源的通病解决思路就是采样尽量同步到PWM开关周期上控制频率不用太高我用5kHzPID参数宁慢勿快。3.2 关键外设配置定时器与ADC的协同这里有一个非常关键的配置思路让ADC采样由PWM定时器触发而不是在主循环里随机采样。如果用主循环轮询ADC采样时刻和开关管的开关边沿没有固定关系开关噪声会随机落到采样值上导致输出电压来回跳动看起来像控制不稳其实是采到了带噪声的点。我的做法是TIM1产生100kHz PWM做主输出同时配置TIM1的TRGO事件定时器更新事件去触发ADC1的注入组转换。这样每次PWM周期开始的时候ADC就会自动采集电压和电流信号转换完成后由DMA搬运到内存里。控制中断定时器中断只在收到ADC转换完成标志后才执行PID计算保证每次控制周期用的都是最新、最同步的采样值。PWM的实际配置参数STM32F103主频72MHz定时器预分频PSC1即2分频自动重装载值ARR360PWM频率 72MHz / 2 / 360 100kHz。占空比分辨率就是1/360约0.28%对30V输出来说对应约0.08V的电压步进够用了。3.3 软件控制框架主循环、控制中断与保护逻辑软件结构大致如下主循环 1. 读取编码器更新目标电压带上下限和滤波 2. 刷新OLED显示电压、电流、状态 3. 响应按键设定恒压/限流模式 4. 检测故障标志若故障则停机并显示错误码 5kHz控制中断TIM1更新事件触发 1. 从DMA缓冲区读取Vout采样、Iout采样 2. 计算电压误差err Vtarget - Vactual 3. 数字PID计算输出限幅到[最小占空比, 最大占空比] 4. 更新TIM1比较寄存器CCR1 保护逻辑进入中断时检查 1. 若Vactual 过压阈值立即清零CCR1并置故障标志 2. 若Iout 限流阈值切换为恒流控制或直接关断 3. 若NTC温度 80℃降额或关断 4. 软启动上电后占空比从0逐步加到目标值防止输出过冲3.4 PID参数整定经验数字PID我用的是位置式PIDu(k) Kp × e(k) Ki × Σe(i) Kd × [e(k) - e(k-1)]几个关键细节积分限幅积分项必须限幅不然启动瞬间误差持续累积导致积分饱和占空比冲到最大值后输出电压过冲要好几百毫秒才能拉回来。微分项慎用由于ADC采样本身有细微噪声微分项会放大这些噪声反而引起控制量抖动。我最后Kd直接设置为0只靠PI控制就够了。如果对响应速度有更高要求最好先对采样值做一阶低通滤波再进微分环节。先调Kp再调Ki先把Ki置0Kp从很小的值开始增大直到输出电压出现等幅振荡记录此时Kp和振荡频率然后取当前Kp的0.4倍作为工作值再从小往大加Ki直到静态误差消除。这个方法在实际调PID时非常有效远比对着公式算靠谱。我的最终参数以占空比0~100对应CCR 0~360为坐标系Kp1.8Ki0.03积分限幅±15采样周期200μs。从冷启动到输出电压稳定到30V±0.1V大概需要30ms没有明显过冲负载从0.5A阶跃到2A时电压跌落约0.4V恢复时间约5ms。四、硬件设计与PCB布局回流路径和采样噪声必须认真对待4.1 驱动电路设计要点Boost电路的开关管放在低边驱动起来相对容易但仍要处理好几个细节。IR2104的输入是逻辑电平PWM它的输出是图腾柱结构能提供更强的栅极充放电电流。驱动芯片的电源我用的是12V确保MOSFET栅极电压在10V以上IRF3205才能完全导通导通电阻才是数据手册里那个8mΩ。如果栅极驱动电压不足MOSFET的导通电阻会成倍上升轻则发热重则炸管。栅极电阻的选择也值得说说。10Ω是比较均衡的取值太小开关边沿变陡EMI恶化开关电压振铃明显太大开关损耗增大效率下降。调试时用示波器看栅极波形如果出现过冲尖刺不是加大栅极电阻而是检查驱动回路的环路面积或者加一个栅极到源极的泄放电阻。4.2 电流与电压采样电路输出电压采样用两个1%精度电阻分压把30V降到3.3V以内分压比约1/10然后并联一个100nF电容做低通滤波进入STM32的ADC引脚。这里有个细节分压电阻的取值不能太大否则和ADC内部采样电容相互作用会产生建立误差我用的是10kΩ对100kΩ。软件里做一阶校正把分压比误差校准到±0.3%以内。输出电流采样我用的是低边采样方案在MOSFET源极与地之间串联一个0.02Ω的合金采样电阻通过运放把压降放大50倍后送入ADC。为什么选低边因为它结构简单不需要高共模电压运算放大器成本低。缺点是采样信号的地和功率地连在一起处理不好会引入噪声。解决办法是运放供电用单独的小电感LDO隔离采样走线用差分对直接从采样电阻两端引出开尔文接法避免大电流走线上的压降污染采样信号。电流运放我用了LM358便宜的通用运放带宽对这个应用足够。不过要注意LM358的输入失调电压有2mV左右折合到电流就是0.4A这是不可接受的。解决方式是在软件里做零点校准上电初始化时没有输出电流记录此时ADC读数作为零点偏移之后每次采样都减掉这个值。这样虽然不能完全消除失调但能把误差压到0.05A以内对限流保护来说够用了。4.3 PCB布局功率环路越小越好Boost电路的PCB布局是决定成败的关键环节热搜里boost回流路径被反复提及就是因为这个问题太容易出事了。高频开关电流的通路所谓热环路包括输入电容 - 电感 - MOSFET - 二极管 - 输出电容 - 回到输入电容。这个环路面积越小引线寄生电感越小开关尖峰越低EMI表现越好功率管上的电压应力也越低。我做的是双层板核心思路功率器件输入电容、MOSFET、电感、二极管、输出电容全部放在同一面走线尽量短粗功率回路的地用单独一块铜皮走成星型一点接地再和控制地单点连接避免高频噪声串入控制信号驱动芯片尽量靠近MOSFET栅极缩短栅极驱动回路的长度ADC采样线和分压电阻靠近STM32的ADC引脚放置采样信号远离电感和大电流走线SW节点电感与MOSFET、二极管的连接点铜皮面积适中既能散热又不会过大增加寄生电容布局不好会有什么表现最典型的是用示波器看SW节点波形出现高频衰减振荡振铃严重时MOSFET的Vds尖峰会超过耐压值直接击穿。如果发现这个问题先把功率环路的铜皮加宽、缩短比改任何参数都有效。4.4 空载与轻载失稳问题Boost电路空载时容易失控这是拓扑本身的特点。空载时输出电容上没有负载泄放能量但电感每次开关周期还在源源不断地泵入能量如果控制环路没有及时减小占空比输出电压就会一路飙上去直到过压保护动作。我的解决措施是两个一是硬件上在输出端并一个1kΩ/2W的泄放电阻吃掉约0.9W的空载功率这相当于一个最小负载保证即使完全不接负载输出也有一个稳定的能量泄放通道。二是软件上增加空载降压逻辑当检测到输出电流小于50mA时将控制目标从恒压模式切换为脉冲间歇模式打嗝模式只在输出电压跌到设定值以下时才发一组PWM脉冲否则PWM完全关闭。这样既保住了稳压精度又避免了长时间轻载下电感噪声和损耗实测空载功耗从0.9W降到了0.3W左右。五、调试实录烧录、纹波、失控三大坑的完整排查链路5.1 烧录失败no STM32 target found怎么处理做好硬件后的第一步烧录就给了我一个下马威ST-Link连接电脑后Keil报错no stm32 target found! if your product embeds debug authentication...。这个报错信息很迷惑但实际上绝大多数情况都是最简单的问题。我当时的排查链路是这样的先查接线SWDIO、SWCLK、GND三条线是否确实连到了目标板的对应引脚SWDIO和SWCLK有没有接反杜邦线接触不良是重灾区。查供电目标板有没有独立供电STM32的VDD引脚有没有电压如果目标板供电不足芯片连上电都上不了更别提调试协议握手。查复位电路NRST引脚有没有被拉低有些板子的复位电路设计不合理上电瞬间复位引脚被拉低超过几百毫秒导致调试器无法建立连接。查BOOT0引脚BOOT0必须接GND才能从Flash正常启动如果BOOT0悬空被外部干扰拉高芯片会进入系统存储器Bootloader此时SWD连接是不稳定的。最终我的问题在第二步自制板上电瞬间3.3V稳压器过冲导致STM32处于低压复位状态在3.3V输出端补了一颗100μF电容问题消失。如果以上都查过了还不行还有一个杀手锏按住目标板的复位按键不松开点击Keil的烧录按钮在烧录开始瞬间松开复位键让调试器抢在用户程序启动之前连上芯片。这个connect under reset方式能救回绝大多数误配置了SWD引脚或者程序死循环的板子。5.2 输出电压纹波异常大是采样噪声还是功率级问题装机完成后第一个不正常的表现是示波器接输出端看到20mV左右的开关纹波上面叠加了很大的杂乱毛刺峰值到200mV而OLED显示的数字也在缓慢跳动波动范围有0.3V左右。我最初的判断是控制环路不稳调了半天PID也没改善后面灵光一闪先把OLED显示数据冻结用独立示波器直接测硬件输出排除软件干扰确认纹波确实超标。然后开始逐级排查第一步测SW节点波形。正常应该是干净的方波0V到掉电电压之间切换。实测发现方波的上升沿有严重振铃频率大约50MHz这是功率回路的寄生电感与MOSFET结电容谐振产生的典型表现。但这个问题主要影响EMI和器件应力对低频纹波贡献不大。第二步测输出电容两端的实际纹波。用示波器探头测量时注意探头地线夹子要最短接地否则探头本身就捡了一堆耦合噪声。短地弹簧接地后实测纹波约80mV虽然比设计目标略高但不至于到200mV。第三步排除ADC采样链路。问题来了断电状态下用信号发生器在分压点注入一个稳定的1V直流再用STM32的ADC去读发现读到的数值在两个相邻码之间跳变这个属正常。但当外接Boost功率级上电后用示波器接ADC引脚看到上面叠了一层幅度不小的开关噪声。原因找到了ADC分压电阻的接地点和控制地之间电位差在开关瞬间剧烈变化噪声通过地线耦合进了采样回路。解决办法有两个我两个都做了一是把分压电阻的接地点改到功率输出电容的负极即真正的功率地采样线再从分压点用差分方式走到ADC二是在ADC引脚对地并联一个100nF电容把采样带宽压低。之后ADC读值稳了很多配合软件里5次移动平均输出电压显示波动降低到0.05V以内。这个经历说明一个很重要的原则看到输出不稳定时不要急着改PID先用示波器验证采样电路干不干净。采样的地基不稳控制算法再努力都是白搭。5.3 空载输出电压失控从波形分析到控制逻辑修订第三个大坑是空载测试时发现的。当时输出设定18V接好万用表断开负载输出电压从18.0V缓慢爬升到19V、20V还在继续往上涨吓得我赶紧断电。这次的经验是先用示波器观察SW节点的波形别急着改代码。正常带载时的SW波形是连续等宽脉冲PWM密度均匀而空载失控时的SW波形变成了密集脉冲串长时间静默的交替模式这个静默期占多数。这说明控制环路已经探测到电压超过目标值在尝试减小占空比但占空比减到接近0之后由于没有负载泄放能量输出电容上残余的电荷依然让电压维持在高位而且每次脉冲串都会把电压再顶高一点。失控的本质是最小占空比哪怕为0对应的能量注入速度依然大于负载消耗速度。正如上文提到的解决方案是加1kΩ泄放电阻 软件打嗝模式。空载时PWM完全关闭让输出电容独自承担负载电压自然缓降当电压降到设定值-0.1V时再打开PWM补一小段能量。这样输出电压维持在18V±0.1V的滞环带内解决了空载失控问题。这个问题实际是Boost电路的通病不是我一个人才会遇到热搜词里大量和boost相关的提问就是佐证。5.4 负载阶跃测试与环路快速验证最后提一个很实用的验证方法没有电子负载也能做负载阶跃测试。我用一个50W的功率电阻串一个MOSFET作为电子负载的简易替代用信号发生器给MOSFET栅极一个方波就能实现负载电流在0.5A和2A之间的快速切换。用示波器双通道同时观察输出端电压波形和负载电流波形能直观看到环路恢复时间和跌落幅度。我实测的结果是负载从0.5A跳到2A输出电压从30V跌落到29.6V左右恢复时间约5ms没有振荡。从0.5A跳到0A即突然切断全部负载因为泄放电阻存在电压只上升了0.2V然后被打嗝模式缓慢拉回。这个瞬态表现作为一台DIY数控电源来说已经相当够用。六、实测总结与后续扩展方向项目目前稳定运行了大半个月简单总结一下最终效果输出5V~30V连续可调最大电流2A带载调整率在0.5%以内满载纹波60mV效率满载约88%具备过压、过流、过温保护。做这台电源最大的体会是数控电源本质上是一个功率硬件数字控制调试耐心三者结合的工程原理图看着简单但每一步从参数计算到PCB布局到环路整定都会遇到教科书画不到的坑。如果后续继续升级我考虑的扩展方向有三个。第一是把效率做上去改成同步整流Boost换用带死区控制的驱动方案预计效率能到93%以上。第二是增加通信功能用UART或者CAN把输出电压、电流实时上报到上位机顺便用PC端做PID参数在线调参调试效率会高很多。第三是换成更高性能的STM32G4系列它内部集成运放和12位ADC采样链路能简化不少而且主频更高控制环路的带宽可以做得更宽瞬态响应还能更快。最后分享一个小技巧调试这种电源时养成先看波形再改代码的习惯。不管问题是纹波、失控还是噪声先拿示波器看功率开关节点和反馈点的波形能帮你快速定位问题是出在功率级还是控制级很多看似是算法问题的问题最后都是硬件采样和布局导致的。把这条路摸通了再做更大功率的电源项目底子就有了。本文还有配套的精品资源点击获取
返回列表