做数控电源最烦什么不是画板子不是写代码而是把一颗大功率可调DC-DC从“能响”调到“能信”。早几年大家玩的是LM2596加一个多圈电位器调压靠手拧电流显示靠猜后来流行过一阵MCU加数字电位器改反馈电阻的方案可调倒是可调了但负载一变化输出电压就跟着飘限流全靠软件掐表体验并不好。最近我完整复刻并改进了开源的Xuemeng V6数控电源项目核心思路是“功率环路交给模拟芯片控制和交互交给STM32F103”电源芯片选的是南芯的SC8701一颗4开关Buck-Boost控制器支持I2C动态调压和限流输出电流做到10A电压可以从0.6V一直调到36V输入用常见的12V、19V、24V适配器都能工作升降压全兼容。这篇文章我把整个硬件设计从方案选型、最小系统、功率级电路、采样链路到PCB布局和调试排障完整过一遍适合想自己做数控电源、做测试仪器前端或者正在啃BMS/充电器硬件的人参考。1. 方案选型与整体架构为什么是STM32F103加SC87011.1 主控和电源芯片怎么分工很多自制的数控电源项目喜欢让单片机直接参与电源环路比如用MCU的PWM输出控制Buck芯片的反馈脚或者干脆用纯软件做PID去跟踪目标电压。这种方案不是不行但有一个绕不开的问题环路响应太慢。10A负载动态变化时电压跌落往往在几十微秒内发生单片机还在转换AD值电压已经跌下去又冲回来了靠软件补根本来不及。Xuemeng V6的思路是把脏活累活交给专门的电源管理芯片。SC8701是一颗同步4开关Buck-Boost控制器内部集成了误差放大器、PWM比较器、限流比较器以及各种保护逻辑它自己就能完成稳压和恒流。你只需要通过I2C接口告诉它“输出目标电压是多少限流点是多少”芯片内部的模拟环路就会自动调节占空比。STM32F103的职责被压缩成三块第一开机时通过I2C配置SC8701的寄存器第二用ADC实时采集输入电压、输出电压、输出电流和板温送到屏幕显示并做软件保护第三处理旋转编码器、按键、串口命令这些人机交互逻辑。这种分工在工程上非常健康。模拟环路跑得快MCU只做慢速配置和状态监控两边不会互相拖累而且即使MCU死机或者正在刷屏输出电压也不会失控SC8701仍会保持上一次配置的目标值继续正常工作。1.2 电源拓扑选型线性、Buck、Boost还是Buck-Boost做可调电源第一个要定的拓扑。线性电源LDO方案结构最简单、纹波最小但10A输出下功耗完全扛不住输入24V输出5V时压差19V乘以10A190W热量得靠暴力风冷压下去完全不现实。纯Buck降压方案效率高但只能输出低于输入电压的值用24V适配器供电就做不出30V输出。Boost升压方案反过来只能升不能降。如果只是固定电压输出这两种都好选但“可调电源”的天生需求就是输出电压横跨输入电压上下所以必须用Buck-Boost拓扑。传统做法是先用Boost预升压再Buck降压两级拓扑效率叠加之后偏低而且在输入输出接近时控制还会打架。SC8701这种4开关单电感Buck-Boost就舒服很多它内部有四颗MOS管和一套升降压切换逻辑输入输出任意关系都能正常工作效率比两级方案高出一截。这里我把常见拓扑做个对比拓扑升降压能力10A下的可实现性效率复杂度LDO线性稳压只能降压极差散热灾难极低低Buck降压只能降压容易高低Boost升压只能升压容易高低两级BuckBoost支持可行中高4开关Buck-Boost支持可行高中Xuemeng V6选4开关Buck-Boost是这套方案能“10A可调”的前提这是结构决定的不是选哪颗芯片的问题。1.3 系统级功能划分整块板子按功能可以切成六块功率变换级、主控最小系统、采样链路、人机交互、保护逻辑、接口扩展。功率变换就是以SC8701为核心的升降压电路输入侧有保险丝、TVS、反接保护采样链路包含输出电压分压电阻、电流采样电阻和仪表放大器所有模拟信号送到STM32F103的ADC人机交互部分是一个0.96寸或者1.3寸OLED屏幕加旋转编码器也可以外接串口屏保护逻辑分两层快速过流保护由SC8701内部限流比较器完成慢速过压、欠压、过温保护由STM32F103软件判断后通过EN脚关断。接口扩展方面STM32F103还留了一个SPI和一个USART方便以后挂外部EEPROM存校准参数、接WiFi模块做远程控制或者通过USB转串口连接上位机。整机可以工作在恒压CV和恒流CC两种模式屏幕会实时显示当前模式。2. 硬件电路核心细节从最小系统到采样链路2.1 STM32F103最小系统时钟、复位、SWD、BOOT配置STM32F103这部分严格说没有技术门槛但踩坑的人特别多。外部时钟我用的8MHz无源晶振两个22pF负载电容晶振两端并在中间串一个1M欧电阻。这个1M电阻不少人会漏实际作用是在反馈端建立一个直流偏置点帮助晶振快速起振。晶振走线必须尽量短并且周围不要走开关电源的功率线和信号线否则容易引入高频干扰导致主频抖动。复位电路是一个10k电阻上拉到3.3VNRST引脚接100nF电容到地实现上电自动复位。这里注意100nF并不是越大越好过大的电容会让复位时间变长偶尔出现上电后MCU没复位完成、外部设备已经开始工作的情况。BOOT0我用10k电阻下拉到地BOOT1同样下拉。BOOT0是启动模式选择的关键脚如果悬空静电或者PCB漏电偶尔会把它拉高导致MCU从系统存储器启动程序就跑不起来了。SWD下载接口只引出SWDIO、SWCLK、GND和一个复位脚不用把JTAG那堆引脚全接出来。SWDIO和SWCLK上各串一个100欧电阻再连到MCU调试口如果被误接电压不会直接打到芯片。MCU供电我这里给VDDA专门加了一路LC滤波10uH电感加一个1uF陶瓷电容把模拟电源和数字电源分开。ADC的参考电压直接使用VDDA如果想要更高的精度可以外接一颗3.3V基准电压芯片但Xuemeng V6原版用的是VDDA校准之后也足够日常使用。2.2 SC8701核心电路关键引脚与外置MOS、电感选型SC8701是整块板子的心脏引脚不多但每个都重要。VIN接输入电源VOUT接输出端BST引脚需要外接自举电容这个电容要尽量靠近芯片的BST和SW引脚为高边MOS驱动提供电源。SC8701内部有一个VDD LDO输出3.3V或5V可以直接给MCU供电不过我的习惯是MCU单独用一颗LDO供电避免SC8701的开关噪声耦合到数字电路上。EN脚是使能控制MCU拉低即可关断输出。PG脚是电源正常指示SC8701的输出电压进入目标区间后PG会拉高。I2C引脚接上拉电阻到3.3V用于寄存器配置。外置MOS管和电感是整个功率级最需要花心思的部分。SC8701本身不集成功率管驱动外部4颗N沟道MOS构成两路半桥。MOS选型第一看耐压输入最高36V考虑到开关尖峰必须选40V以上的管子我实际用的是50V耐压。第二看Rds(on)和Qg10A负载下导通损耗和开关损耗直接决定发热量Rds(on)最好在10m欧以内Qg不要太大否则驱动能力不够时会增加开关损耗。电感是整个方案里最不能省钱的元件需要能承受10A的直流电流感值我选了10uH饱和电流做到20A以上磁芯材料用铁硅铝或者铁镍钼绕制不能用普通功率电感磁芯否则大电流下感值掉得厉害输出纹波会明显变大。2.3 电压电流采样链路设计与计算数控电源的精度全靠采样链路这块计算要严谨。输出电压采样我用的电阻分压方案。SC8701输出最高36VSTM32F103的ADC输入范围是0到3.3V分压比需要保证36V满量程时ADC输入不超过3.3V。我选上分压电阻100k、下分压电阻10k分压系数为10/(10010)0.090936V对应ADC引脚电压约3.27V留了一点余量。下分压电阻再并联一个10nF电容到地组成一阶RC低通滤波截止频率约1.6kHz用来滤除高频开关纹波。分压电阻必须用1%精度否则显示电压和实际电压会系统性偏。电流采样比电压采样要求更高。采样电阻我用5毫欧合金电阻放在输出低边就是输出负端与系统地之间。5毫欧在10A电流下压降为50mV信号太小没法直接送ADC所以我加了一颗INA240仪表放大器增益选50倍10A时输出电压为50mV乘以50等于2.5V正好在3.3VADC量程内留余量。这里做一个对照表方便看懂不同增益下的输出采样电阻增益10A时运放输出ADC量程利用率10m欧20倍2.0V约61%5m欧50倍2.5V约76%5m欧100倍5.0V超量程2m欧100倍2.0V约61%如果采样电阻用10m欧配20倍增益也能用但小电流时分辨率差一些5m欧配50倍是综合电流分辨率和运放成本的平衡点。INA240是电流输出型仪表放大器吗不是它是电压输出但内部集成了共模抑制能力很强的差分放大架构即使采样电阻在Buck-Boost的开关节点附近有较大共模跳变它也能把微小的差模信号准确放大。ADC这边我用STM32F103的多通道扫描加DMA传输一次DMA循环采4个通道输出电压、输出电流、输入电压、板温。ADC时钟配置为12MHz采样周期尽量拉长一点比如239.5个周期采出来的值更加稳。软件每50ms做一次均值滤波把50个样本取平均再换算成实际电压和电流。2.4 辅助供电与前级保护电路SC8701的VDD输出能力有限我不建议直接拿它带动显示屏。做法是输入侧先经过一颗LM1117-3.3或者ME6211这类低压差LDO给STM32F103和周围低压器件供电。输入电压最高36V普通LDO扛不住所以LDO前端再加一颗DC-DC降压模块或者用耐压足够的高压LDO比如MP9486这种电流不大的降压方案。前级保护方面输入正极串联了一颗保险丝或者PPTC限流15A输入并联TVS管吸收浪涌反接保护用一颗P沟道MOS管做一个理想二极管防反接压降远小于肖特基满载时不会发热。输出端除了输出电容还接了一颗稳压管和放电电阻防止空载时输出高压残留。3. PCB布局与功率回路实战经验3.1 功率回路怎么画才算对PCB布局对开关电源的影响比原理图大得多。原理图只要网络对就能跑但开关电源如果布局不好轻则纹波大重则烧MOS管炸机。4开关Buck-Boost最大的di/dt环路有两个一个在输入电容和两个高边/低边MOS之间另一个在电感两端切换到不同节点时。布局时要把输入电容尽量贴近高边MOS的漏极和低边MOS的源极让高频电流回路面积最小。输出电容也一样要贴近电感和低边MOS。四颗MOS我建议焊盘尽量靠近开关节点也就是SW1、SW2之间的铜皮要短而粗不要细长条因为SW节点在Buck模式和Boost模式下对地电位会高速摆动寄生电感会在SW节点产生振铃。栅极驱动走线是另一个重点。SC8701输出的驱动信号要走短线并且每路驱动串一个2.2欧到4.7欧的栅极电阻用来减缓MOS开关速度、抑制振铃。如果栅极走线太远太细驱动信号到达MOS栅极时波形会变得圆润开关损耗上升严重时直接触发直通烧管。BST自举电容要放在IC附近它的返回路径是SW引脚所以自举电容到IC的距离决定了自举电压是否稳定。3.2 采样走线开尔文接法避免电压误差电流采样电阻有四个焊盘实际上合金采样电阻只有两个端子但开尔文接法要求把功率电流走线和大电流铜皮与采样电压检测线分开。具体来说电流流过采样电阻的两端焊盘是专门的功率焊盘铜皮要宽而从采样电阻两端引到INA240输入的信号走线要从采样电阻中心引出或者从焊盘内侧单独拉出两条细线绝对不能从功率铜皮上直接引。如果直接从功率铜皮分一条线出来铜皮的电阻会叠加到采样电阻上满载时候采样电压就有偏差而且这个偏差会随温度漂移。差分信号线要并行走线等长周围用地包一下。INA240输出到MCU ADC之间串了一个100欧电阻在MCU端再接100nF电容到地组成RC滤波。这里RC的时间常数不能太大否则电流采样的实时响应会变慢。3.3 热设计10A可不是闹着玩的100W级别的输出热设计做不好整个方案就是废的。MOS管和电感的损耗必须提前估算。以10A负载为例如果MOS管Rds(on)是8m欧两个低边MOS并联等效电阻4m欧这时导通损耗是I²R等于10²乘以4m欧等于0.4W高边MOS同样并联等效4m欧Buck模式下占空比比如D0.5导通损耗大概0.2W。再算开关损耗开关频率400kHz每次开关都有交叠损耗这部分跟电压电流和开关时间有关估算下来每颗MOS总损耗大约在1W级别。四颗MOS就是4W左右铜皮如果不做散热处理温度会轻松超过100度。我的做法是功率MOS和电感的焊盘下方大面积铺铜并且打过孔到背面背面再铺一整片铜皮散热。所有功率级的铜皮宽度按每安培至少1mm计算10A电流路径至少10mm宽。电感本体如果发热严重可以用导热垫压到外壳上或者加一个温控风扇。STM32F103这边我用一个NTC热敏电阻贴到电感或者MOS散热铜皮附近MCU每500ms读一次温度超过80度就降额输出或者关断。4. 上电调试与常见问题排查4.1 三段式调试流程从空载到满载我调试这种电源板有一条固定流程直接上满载电大概率会炸管子。第一步是上电前检查。先用万用表二极管档测一下输入正负极之间有没有短路重点检查MOS管三个引脚之间有没有直通短路。再测3.3V和GND之间的阻抗如果低于几十欧就要先排查电源部分。确认不短路后不焊MCU直接用DAP-Link或者USB转I2C工具挂在SC8701的I2C总线上读它的寄存器ID确认SC8701已经正常工作然后再喂给它一个输出电压寄存器值比如先设5V限流设1A。这时候用万用表量VOUT能到5V说明功率级没问题。第二步是焊上MCU烧录一个最简单的固件功能只做两件事I2C配置SC8701输出5V同时读取ADC显示电压电流。这时测试轻载接一个100欧电阻看输出电流是否在0.05A左右电压是否依然5V。没问题就继续加大负载变成10欧、5欧电流逐级拉高。第三步才是满负载和动态测试。在输出端接电子负载或者大功率电阻把限流先设到2A逐步往10A拉。每一步都要盯着SC8701的die温度同时也看输出电压波形是否出现抖动。满载运行十分钟后用手摸MOS和电感温度能连续稳定运行并且温度在可接受范围这块板子才算基本调通。4.2 常见问题排查速查表做这块板子时我遇到和收集了一系列典型问题整理成速查表基本覆盖大多数人的第一板问题。现象可能原因排查方向SC8701 I2C无应答上拉电阻没接、SC8701供电异常、地址配置错测VDD电压检查ADDR引脚电平确认I2C地址与固件一致输出电压一直是0VEN没拉高、限流点设置为0、输入未到位测EN电压读寄存器看配置值是否写入成功输出电压比设定值低电流进入CC模式、采样电阻误差、电压分压电阻选错先看是否限流再核对分压电阻实际值带载超过3A电压就跌落电感饱和、MOS驱动电阻过大、输入供电能力不足用电流探头看电感电流是否出现畸形尖峰输出纹波很大输出电容不够、环路补偿没调好、PCB布局差增加MLCC检查SW振铃优化地平面电流采样跳动超过0.2A采样走线引入了噪声、RC滤波不够、ADC采样太密集检查开尔文走线加大均值滤波窗口一上电就烧低边MOS驱动死区不够、栅极走线太长、自举电容没靠近IC检查SC8701外围驱动电阻和BST电容位置补充一个很常见的坑SC8701的限流寄存器设置为0的时候芯片会认为限流值是0输出直接被拉死。很多人以为自己没配置成功其实是把“限流寄存器的初始值”当成0x0去写了。第一次配置一定要先写一个非零限流值再写输出电压值顺序不要反。4.3 固件与硬件配合的几个细节硬件没问题不代表整体没问题固件和硬件的配合细节往往决定最终体验。SC8701的I2C通信速率我建议不超过400kHz实测400kHz下工作稳定。每次写寄存器之后要加一个毫秒级延时确认写入完成再读回校验尤其是输出电压寄存器返回值和写入值不一致时要重新写入否则可能出现偶发的电压跳变。ADC采样用DMA的好处是不占用CPU但要注意DMA缓冲区是共享的主循环读buffer的时候需要做临界区保护或者双缓冲切换否则读到一半DMA又写了新数据数据是撕裂的。我实际用的是双buffer方案DMA半传输中断和全传输中断交替切换每次只处理已经稳定写入的那半个缓冲区。SC8701的使能脚EN我接到了STM32F103的一个普通GPIO软件里做了掉电保存标志。开机的时候先让SC8701保持EN拉低等MCU完成I2C配置和自检后再拉高EN开启输出。这样可以避免上电瞬间输出电压失控或者限流点没配置好就带载的尴尬。5. 核心BOM选型与采购避坑5.1 关键元件参数参考表给出一份我实际打板验证过的关键BOM参考型号不是唯一解但参数范围可以参考。位号型号或参数关键指标备注U1STM32F103C8T664引脚128KB Flash主控U2SC87014开关Buck-BoostI2C控功率变换Q1-Q450V/10m欧 N-MOS5m欧并联使用注意散热焊盘L110uH铁硅铝电感饱和电流20A以上禁止用普通贴片电感U3INA240A3 或 A2增益50倍或20倍电流采样运放R sense5m欧合金电阻1%精度温度系数50ppm以内开尔文接法R分压100k/10k 1%最大36V对应3.27V并联10nF滤波U4ME6211或LM1117-3.3低压差LDOMCU供电F115A保险丝或PPTC直流15A输入保护5.2 采购和替换的避坑经验电感是最容易买假或者买错的地方。很多商家标注10uH/20A饱和电流实际用电流探头加功率负载测的时候8A就明显饱和电感电流波形出现尖峰输出电压抖动。如果是网购优先选有品牌和datasheet的厂商货不要图便宜买散新或者拆机件。到手之后用一个可调负载拉一下额定电流量电感温度就知道顶不顶得住。MOS管替换时不要只看耐压和电流Qg这个参数特别关键。SC8701这类控制器驱动电流有限如果换成Qg很大的大管子开关速度会明显变慢开关损耗骤增效率反而更低。规格书推荐范围内的MOS型号尽量别换要换也得挑Rds(on)和Qg两个指标都不差的。采样电阻和分压电阻的精度会影响整机显示精度和校准量程建议用贴片合金电阻和0402或者0603的1%薄膜电阻。有些便宜的碳膜电阻温漂大板子温度升高之后电压显示值会慢慢漂排查起来非常痛苦。PCB打样时记得要求板材至少是FR-42盎司铜厚大电流层用2盎司铜皮可以明显降低发热。如果只按默认1盎司打样10A电流路径的铜皮温升会高很多。6. 个人实际调试体会几个容易被忽视的细节这块板子我从原版工程文件改到最终打样反复折腾了三版最大的体会是效率高不高、稳不稳往往不取决于芯片本身而取决于PCB布局和采样走线。第一版我图省事把INA240的差分采样线从功率铜皮中间直接引出来结果空载时候电流显示正常一上5A负载显示电流比实际偏大0.3A就是铜皮电阻叠加进去造成的。改成开尔文走线后问题立刻消失。第二个感受是SC8701的寄存器配置顺序要比想象中敏感。我之前在固件初始化里先写电压、再写限流某一次上电后发现电压失控查了半天才发现限流值在出厂默认状态下是0而我写的电压值又让芯片试图输出大电流触发了保护。后来改成先写一个保守的限流值、再写电压值最后再上调限流再也没有出过这个问题。最后一个小技巧如果手上没有电子负载调试大电流输出时可以用电热水壶的加热管或者汽车灯泡代替成本低而且它们的冷态电阻和热态电阻差异很大反而能顺便考验一下电源的动态响应。只是一定要在旁边放一个温度表或者手背靠近感受发热别真把实验室烧了。