立创开源手撕USB可调电源V5从零打造你的Buck-Boost电源最近在捣鼓一个便携的调试电源市面上的成品要么太贵要么功能不满足需求。于是我花了差不多一年的时间从零开始“手搓”了一个功能强大的USB可调电源。它不仅能从普通的USB充电器取电还能通过PD/QC协议“诱骗”出最高20V的电压然后经过我设计的Buck-Boost电路输出0.4V到36V宽范围可调的电压最大电流能达到5A。最关键的是这个项目的软硬件全部开源如果你也对开关电源设计、单片机控制特别是小华半导体的HC32F334以及USB快充协议感兴趣想亲手做一个属于自己的实验室电源那这篇教程就是为你准备的。我会带你一步步理解这个项目的核心设计思路和实现方法。1. 项目概览它到底能干什么简单来说这个项目就是一个高度自主、功能强大的可编程直流电源。咱们先看看它的核心能力宽范围可调输出输出电压可以从0.4V 到 36V连续调节输出电流最大5A并且限流值可以在10mA 到 5A之间设置。这意味着它既能给3.3V的单片机供电也能给12V的电机或者24V的灯带供电非常灵活。智能协议诱骗支持USB PD 3.0和QC 2.0快充协议。当你插上一个支持快充的充电宝或充电器时它能自动协商让充电器输出5V、9V、12V、15V 或 20V的电压作为整个系统的输入电源。这样你就不需要专门找一个20V的电源适配器了一个普通的氮化镓充电头就能搞定。实时监控与交互通过一块2.8寸的TFT屏幕或者连接上位机软件可以实时看到输入电压、输出电压和电流。调节电压和电流限值只需要拧一个旋转编码器就像调节音响音量那样或者在电脑上设置即可非常方便。强大的扩展性硬件上已经预留了蓝牙和Wi-Fi模块的位置后续通过软件升级就能实现无线控制、手机小程序监控等更多玩法。整个系统分为三块核心板卡协议板基于CH543单片机负责与USB充电器“谈判”获取合适的输入电压。功率板基于HC32F334单片机这是大脑负责控制Buck-Boost电路实现精准的电压转换和限流。显示/交互板负责驱动屏幕、处理编码器按键并预留了无线通信接口。2. 核心原理Buck-Boost是如何工作的这个电源最核心的部分就是Buck-Boost 拓扑电路。你可以把它理解为一个“电压魔术师”无论输入电压比输出电压高还是低它都能变出你想要的电压。2.1 四种工作模式为了实现从0.4V到36V的全范围调节并且保证高效率我的设计里让电路在四种模式下智能切换Buck模式降压模式何时启用当输入电压比输出电压高1V以上时。比如输入是20V你要输出5V。怎么工作此时电路主要作为一个降压器Buck工作。Boost那边的高侧MOS管只需要一个很小的占空比固定4%维持自举电容充电真正调节输出电压的是Buck这边的PWM占空比。Boost模式升压模式何时启用当输入电压比输出电压低1.2V左右时。比如输入是9V你要输出12V。怎么工作此时电路主要作为一个升压器Boost工作。Buck那边固定输出最小占空比4%调节输出电压靠的是Boost这边的PWM占空比。Buck-Boost混合模式 当输入和输出电压非常接近时单纯用Buck或Boost效率不高控制也不稳定。所以设计了两种混合模式Mix-UP模式当输入电压略低于输出电压差值在1V以内。这时固定Buck端占空比为85%通过调节Boost端来稳定输出。Mix-DW模式当输入电压略高于输出电压差值在0.2V~1V以内。这时固定Boost端占空比为14%通过调节Buck端来稳定输出。注意这里提到的1V、1.2V等阈值是为了实现模式平滑切换而设置的滞回区间防止电压在临界点附近时模式频繁跳动。2.2 控制核心增量式PI算法电源要稳定不能输出电压忽高忽低。这就需要闭环控制。我采用的是增量式PI控制器。你可以把它想象成一个智能的空调遥控器目标设定值你设定的房间温度比如26°C。现状反馈值温度传感器测得的当前室温。PI控制器比较目标温度和当前温度计算出“误差”。然后根据这个误差的大小比例P和持续的时间积分I决定把空调风力调大还是调小控制量。执行器空调压缩机对应我们的PWM波。在这个电源里我们有两个这样的“空调遥控器”电压环PI目标是让输出电压紧紧跟随你设定的电压值。电流环PI目标是让输出电流不超过你设定的限流值。控制器计算出的“控制量”最终会被映射成PWM波的占空比去驱动MOS管开关从而精确控制输出电压/电流。2.3 高效的数据搬运DMA为了实时监控电压和电流我们需要频繁地进行ADC模数转换采样。如果每次采样都让CPU去读取数据会占用大量计算资源。这里我用到了DMA直接存储器访问。DMA就像一个勤快的搬运工可以独立于CPU工作。我配置好ADC和DMA后ADC每转换完一次数据DMA就自动把这个数据搬运到内存中指定的数组里。CPU只需要定期去检查这个数组里的数据就行了大大提高了系统效率。3. 快充协议如何“诱骗”——CH543的作用想让普通的USB充电器输出20V需要和它进行“通信”。这就是协议板上的CH543单片机的工作。CH543是一颗专门用于USB充电协议的MCU它内部集成了PD协议的物理层PHY我们只需要在它上面实现协议层的代码即可。我把协议栈分成了三层来理解物理层硬件引脚电平。对于QC协议就是控制D和D-引脚上的特定电压0.6V, 3.3V等来触发充电器升压。对于PD协议则是通过CC引脚使用BMC双相标记编码协议进行单线通信。协议层我手写的代码实现了PD和QC协议的状态机。它按照协议规范与充电器进行报文交互最终协商出一个双方都支持的电压如20V。应用层协议协商成功后CH543会通过I2C总线将获取到的输入电压信息告诉主控MCUHC32F334以便进行后续的Buck-Boost控制。这样做的好处是自主性强以后想支持新的协议比如UFCS只需要修改协议层的代码即可。4. 动手实战硬件组装与固件下载理论讲完了咱们来看看怎么把它做出来。所有开源文件原理图、PCB、代码都可以在文章末尾的链接里找到。4.1 硬件组装这个项目主要由两块PCB构成功率板包含HC32F334主控、Buck-Boost功率电路、采样电路等。显示板包含屏幕、旋转编码器、无线模块接口等。你需要准备一些结构件来固定它们亚克力前面板和后面板各1片。三种不同高度的铜柱M3规格各4颗用于分层固定板子。M3螺丝8颗。一条FPC软排线连接功率板和显示板。按照3D结构图用铜柱和螺丝将两块PCB和亚克力板组装起来即可。4.2 给三个MCU下载程序这是最关键的一步三个芯片都需要烧录固件。1. 主控MCU (HC32F334) 下载工具使用小华半导体官方的ISP下载工具HC32F334-固件下载工具.zip。接线需要一个USB转串口TTL电平工具。连接方式如下USB转串口的TX接 板子的PA9 (UART0_RX)USB转串口的RX接 板子的PA10 (UART0_TX)USB转串口的GND接 板子的GND进入下载模式给板子上电后短接一下板子上标注的NRST和GND测试点短接后立即松开MCU就会复位进入ISP模式。操作在工具中选择正确的串口号设置波特率建议115200或更低加载buck-boost-HC32F334-V1.3.hex文件点击下载即可。2. 协议MCU (CH543) 下载工具沁恒的CH543 ISP工具CH543-ISP-下载工具.zip。接线最简单直接用一根USB-C线连接协议板和电脑。进入下载模式如果芯片是全新的无需任何操作插上USB工具就能识别。如果芯片里已有旧程序则需要持续短接板子上的3V3和PD_UPG测试点直到下载完成。操作工具识别到设备后选择open-pd-ch543仓库里编译生成的.hex文件点击下载。3. 显示MCU (W800) 下载工具联盛德W800的下载工具W800-固件下载工具.rar。接线同样使用USB转串口工具。USB转串口的TX接 板子的W_RXUSB转串口的RX接 板子的W_TXUSB转串口的GND接 板子的GND进入下载模式首先短接板子上的W_BOOT和GND测试点下载期间保持短接。然后短接一下W_RST和GND测试点并松开使其复位进入下载模式。操作在工具中选择串口波特率设置为115200最稳妥加载w800_usr_app_v1.3.fls文件开始下载。提示下载时如果遇到问题首先检查串口号是否正确其次尝试降低波特率最后确认测试点短接操作无误。5. 如何使用旋转编码器的妙用硬件组装好程序也下载完了怎么用呢整个设备只有一个旋转编码器作为输入设备但通过不同的按键逻辑实现了所有功能。旋转编码器有三个动作顺时针旋转 (CW)、逆时针旋转 (CCW)、按下 (CENTER)。基本操作逻辑如下开机上电后屏幕会显示当前输入、输出电压和电流。使能设置双击编码器中间键CENTER此时输出电压或电流限值会有一个框框选中表示可以调节。切换调节对象在设置使能状态下再次双击中间键可以在“调节电压”和“调节电流限值”之间切换。调节数值顺时针旋转 (CW)增加数值逆时针旋转 (CCW)减少数值。开关输出单击编码器中间键可以打开或关闭电源输出。退出设置调节完毕后长按中间键可以退出设置模式。这个交互逻辑非常直观稍加熟悉就能盲操作。6. 开源资源与后续这个项目所有的代码和设计文件都已开源你可以直接拿来学习、修改甚至生产。HC32F334主控软件https://gitee.com/Bryan_He/open-buck-boost-v5-hc32f334.gitCH543协议软件https://gitee.com/Bryan_He/open-pd-ch543.gitW800显示/无线软件https://gitee.com/Bryan_He/open-w800-bt-wifi.gitSquareline Studio UI工程https://gitee.com/Bryan_He/usb-ps-v5-sqline-prj.git项目演示视频【手撕USB可调电源-V5】这个项目从电路拓扑、控制算法到协议栈都是我自己一步步实现的过程中踩了不少坑也学到了很多东西。比如模式切换的逻辑、PI参数的整定、ADC采样的抗干扰等等。希望这个开源项目能成为一个很好的学习平台无论是想深入研究开关电源还是想学习HC32F334、USB PD协议都能从中找到有价值的参考。后续我还会更新软件加入蓝牙和Wi-Fi的远程控制功能让这个电源变得更智能。