手撕Buck-Boost数字可调电源:从协议解析到四模态控制
1. 项目概述
“手撕buck-boost电源”是一个面向嵌入式电源系统深度学习与工程实践的全栈可控数字可调电源平台。项目名称中的“手撕”并非修辞夸张,而是对开发过程本质的精准概括:从USB Type-C供电协议解析、多模态DC-DC拓扑控制算法、高精度模拟前端采样,到人机交互逻辑与跨MCU通信架构,所有核心模块均未依赖商用SDK或黑盒IP,全部由开发者基于底层寄存器操作与数学建模自主实现。该系统并非仅满足功能演示的原型机,而是一个具备工业级设计约束意识、完整信号链闭环、明确模式切换边界条件与可复现调试路径的工程实体。
项目采用三MCU协同架构:主控MCU为华大半导体HC32F334,承担Buck-Boost功率级实时闭环控制;协议协处理器为沁恒CH543D,专职处理USB PD3.0与QC2.0物理层与协议栈;显示与无线协处理器为W800(RISC-V内核),负责TFT图形界面渲染、蓝牙/WiFi通信及上位机协议桥接。三者通过I²C总线构成确定性通信网络,分工明确,耦合度低,为后续功能扩展(如微信小程序接入、OTA升级、远程监控)预留清晰接口。
系统支持宽范围输入与输出:输入端兼容USB PD3.0(5V/9V/12V/15V/20V)及QC2.0(5V/9V/12V),输出端电压调节范围为0.4 V至36 V,电流限值设定范围为10 mA至5 A。其核心价值在于将传统“黑盒化”的开关电源控制逻辑彻底解构,使每一个工作模式的触发阈值、每一段PI参数的整定依据、每一次占空比更新的计算路径均可追溯、可验证、可修改。对于电源工程师而言,它是一份动态运行的《开关电源设计原理》教科书;对于嵌入式开发者而言,它是一个展示高实时性外设协同与资源调度的典型范例。
2. 系统架构与硬件设计
2.1 整体硬件拓扑
系统硬件划分为两块独立PCB:功率板(Power Board)与显示板(Display Board),采用模块化设计理念,便于测试、维护与功能迭代。两板之间通过标准排针与FPC软板连接,信号包括I²C控制总线、ADC采样电压/电流模拟信号、PWM驱动信号及电源轨。
功率板是整个系统的能量转换核心,集成以下关键子系统:
- USB Type-C输入接口及PD/QC协议处理电路(CH543D)
- Buck-Boost四开关拓扑功率级(含MOSFET驱动、电感、电容、续流二极管)
- 高精度输入/输出电压与输出电流采样网络
- HC32F334主控及其外围时钟、复位、调试接口
显示板则聚焦于人机交互与扩展能力:
- W800 MCU及其配套的2.8英寸320×240分辨率TFT LCD(SPI接口)
- EC11型旋转编码器(带按键功能)
- ESP32-WROOM-32模块(提供Wi-Fi与蓝牙双模能力,本版本固件暂未启用,但硬件已预留)
- 板载USB转串口芯片(CH340G),用于固件下载与调试日志输出
2.2 Buck-Boost功率级设计
本项目采用同步整流四开关Buck-Boost(也称SEPIC-like或Active Buck-Boost)拓扑,相较于传统两开关Buck或Boost,其优势在于输入输出电压可任意升降,且无反向电流路径,效率更高,EMI更易控制。功率级核心器件选型与设计考量如下:
| 器件类型 | 型号 | 关键参数 | 设计依据 |
|---|---|---|---|
| 高侧NMOS (Buck) | SI2302DS | VDS=20V, ID=3.2A, RDS(on)=45mΩ | 输入电压最高20V,需留足裕量;导通损耗与开关损耗权衡后选定中等规格器件 |
| 低侧NMOS (Buck) | SI2302DS | 同上 | 与高侧配对,简化驱动设计,降低BOM成本 |
| 高侧NMOS (Boost) | SI2302DS | 同上 | 输出电压最高36V,但实际工作在升压模式时,其漏源电压承受为VOUT-VIN,故20V耐压足够 |
| 低侧NMOS (Boost) | SI2302DS | 同上 | 同理,与Boost高侧配对 |
| 功率电感 | CD105-100uH | DCR=0.25Ω, Isat=6.5A | 根据最大输出电流5A及目标纹波电流(约20%)计算得出,饱和电流需大于峰值电流 |
| 输入/输出电容 | 电解电容+陶瓷电容并联 | 输入:220μF/35V + 10μF/25V;输出:470μF/50V + 10μF/25V | 电解电容提供储能与低频滤波,陶瓷电容抑制高频开关噪声,降低ESR与ESL |
驱动电路采用分立式自举驱动方案。Buck与Boost的高侧MOSFET均使用自举电容为其栅极驱动IC(如IR2104)提供高于电源轨的电压,以确保完全导通。自举电容容量(1μF X7R)与二极管(1N4148)经计算与实测验证,可在最低输入电压(5V)下维持稳定充电,避免因占空比过高导致驱动失效。所有MOSFET的栅极均串联10Ω电阻,并在栅源极间并联100pF电容,用以抑制振铃与dv/dt引起的误触发。
2.3 协议处理单元:CH543D的深度定制
USB供电协议的实现是本项目“手搓”理念的关键体现。CH543D作为一颗集成了USB-PD PHY与BC1.2识别功能的专用MCU,其内部已固化物理层(PHY)与时钟恢复电路,但完整的协议栈(包括PD的SOP包解析、Policy Engine、Device Policy Manager)及QC的D+/D-电压协商逻辑,均由开发者在裸机环境下用C语言重写。
CH543D的系统框架被严格划分为三层:
- 物理层(PHY Layer):直接调用CH543D SDK中已验证的寄存器配置函数,完成CC1/CC2引脚的BMC编解码初始化、D+/D-引脚的模拟电压检测与输出。
- 协议层(Protocol Layer):此为代码量最大、逻辑最复杂的部分。PD协议部分实现了完整的Message Reception/Transmission State Machine,能正确解析SOP、SOP'、SOP''包,处理VDM(Vendor Defined Message)扩展,并根据接收的Request消息(如Request、Get_Source_Cap)生成对应的Response。QC协议部分则精确模拟了BC1.2规范中定义的D+、D-线电压序列(如0.6V/0.6V、2.0V/2.0V、2.7V/2.0V等),并通过ADC实时监测D+、D-电平变化,执行状态跳转。
- 应用层(Application Layer):通过I²C总线与HC32F334主控通信,将协商成功的输入电压(VIN)与最大可用电流(IMAX)上报,并接收主控下发的“是否允许进入某电压档位”的指令,形成双向闭环。
这种分层设计不仅保证了协议栈的可读性与可维护性,更重要的是赋予了系统前所未有的定制能力。例如,可轻松添加私有VDM命令,用于向主控请求特定的启动参数;或修改QC握手时序,在特定适配器上实现更优的电压匹配。
2.4 模拟前端与高精度采样
电源系统的稳定性与精度,高度依赖于前端采样的准确性与实时性。本项目在HC32F334的12位ADC基础上,构建了一套兼顾速度、精度与抗干扰能力的模拟前端。
输入电压采样(VIN):采用高阻值分压网络(1MΩ + 200kΩ),将0–24V输入衰减至0–4V,送入ADC。分压电阻选用1%精度金属膜电阻,并在ADC输入端增加100nF陶瓷电容进行滤波。ADC配置为12位、单次转换、软件触发,采样周期固定为400ns,理论采样率可达2.5 Msps。实际应用中,为平衡CPU负载与数据有效性,以100 kHz频率进行连续采样,并由DMA自动搬运至环形缓冲区。
输出电压采样(VOUT):结构与VIN类似,但分压比调整为1MΩ + 100kΩ,以覆盖0.4–36V范围。关键改进在于引入了运放跟随器(LM358)作为缓冲,消除分压网络对ADC输入阻抗的影响,确保在不同负载下采样值稳定。
输出电流采样(IOUT):采用低阻值、低温漂的锰铜合金采样电阻(RSENSE= 5 mΩ, ±0.5%, 50 ppm/°C)。其两端压差(0–25 mV @ 5A)经由仪表放大器INA128进行100倍精密放大,输出0–2.5V信号送入ADC。INA128的高共模抑制比(CMRR > 100 dB)有效抑制了功率回路中强烈的开关噪声干扰。
所有模拟信号走线均严格遵循“远离高速数字线、短而直、铺地保护”的PCB Layout黄金法则,并在ADC参考电压引脚(VREF+)处放置10μF钽电容与100nF陶瓷电容并联,为ADC提供极其稳定的基准源。
3. 软件架构与核心控制算法
3.1 多任务实时调度框架
HC32F334软件未采用RTOS,而是构建了一个基于时间片轮询与中断驱动的轻量级实时框架。系统主循环(main loop)以100 μs为基本时间片,依次调用各功能模块的Task_XXX()函数。关键实时任务则由硬件中断保障:
- HRPWM中断(最高优先级):在每个PWM周期结束时触发,用于更新下一周期的占空比寄存器,确保控制律的严格周期性。
- ADC DMA完成中断(次高优先级):当DMA将一轮采样数据搬运完毕后触发,唤醒数据处理任务。
- EC11编码器中断(中优先级):利用MCU的外部中断引脚捕获编码器A/B相信号的边沿,实现无延时的旋转事件检测。
该框架摒弃了复杂上下文切换开销,将宝贵的CPU资源集中于最核心的控制律计算上,同时保证了人机交互的即时响应性。
3.2 四模态Buck-Boost控制策略
Buck-Boost拓扑的精髓在于其工作模式的智能切换。本项目将整个输入/输出电压关系空间划分为四个明确区域,并为每个区域定义了唯一的、物理意义清晰的控制策略,彻底规避了传统“单一PI控制器在宽范围下难以整定”的难题。
| 模式名称 | 触发条件 | 控制方式 | 物理意义 | 关键设计点 |
|---|---|---|---|---|
| Buck模式 | VIN≥ VOUT+ 1V | 固定Boost PWM为4%,调节Buck PWM | 纯降压,Boost支路仅维持自举电容充电 | 4%占空比是经实测验证的最小可靠值,低于此值自举电容无法充分充电 |
| Buck-Boost-Mix-UP模式 | VIN< VOUT≤ VIN+ 1V | 固定Buck PWM为85%,调节Boost PWM | Boost为主,Buck为辅,提升轻载效率 | 85%是经验阈值,确保Buck支路始终处于高效导通区,减少开关损耗 |
| Boost模式 | VIN≤ VOUT- 1.2V | 固定Buck PWM为4%,调节Boost PWM | 纯升压,Buck支路仅维持自举电容充电 | 与Buck模式对称,4%占空比同样服务于自举电容 |
| Buck-Boost-Mix-DW模式 | VIN- 1V < VOUT< VIN- 0.2V | 固定Boost PWM为14%,调节Buck PWM | Buck为主,Boost为辅,优化中载动态响应 | 14%占空比是为Boost支路提供足够“支撑”,防止在模式切换临界点发生振荡 |
模式切换并非简单比较,而是引入了迟滞(Hysteresis)机制。例如,从Buck模式切换到Mix-DW模式的阈值为VOUT= VIN- 0.8V,而从Mix-DW切回Buck的阈值则为VOUT= VIN- 0.4V。这有效防止了在VIN/VOUT比值临界波动时,系统在两个模式间反复抖动。
3.3 增量式PI控制器实现
系统采用双环PI控制:外环为电压环(AVR),内环为电流环(ACR)。两者均使用增量式(Incremental)PI算法,其离散化形式为:
Δu(k) = Kp * [e(k) - e(k-1)] + Ki * e(k) u(k) = u(k-1) + Δu(k)其中,e(k)为当前时刻误差(设定值 - 实际值),u(k)为控制量(即PWM占空比)。增量式算法的优势在于:
- 抗积分饱和(Anti-windup):当输出达到限幅(如0%或100%)时,仅需停止对
u(k)的累加,无需复杂的积分分离逻辑。 - 手动/自动无扰切换:在模式切换或参数修改时,
u(k-1)的值可无缝继承,避免输出阶跃。 - 计算量小:仅需两次乘法与三次加法,非常适合资源受限的MCU。
PI参数(Kp, Ki)并非全局统一,而是根据当前工作模式与负载电流大小进行动态查表。例如,在Boost模式下,Kp值会比Buck模式下略大,以补偿升压拓扑固有的相位滞后;在轻载(<0.5A)时,Ki值会适当减小,以抑制低频振荡。所有参数均通过Matlab/Simulink建模仿真初步整定,并在真实硬件上进行数十小时的老化与扰动测试后最终固化。
4. 人机交互与通信接口
4.1 旋转编码器(EC11)交互逻辑
EC11是本系统唯一物理输入设备,其设计哲学是“以最少的按键实现最丰富的功能”。其行为被抽象为一套完备的状态机,所有操作均围绕“焦点(Focus)”概念展开。
系统存在两个可编辑参数:输出电压(VSET)与输出限流(ISET)。初始状态下,焦点位于VSET。用户通过CENTER键(双击)进入编辑模式,此时LCD上VSET数值周围会出现一个高亮方框。此后:
- CW/CCW旋转直接增减VSET值,步进量根据当前数值范围自动缩放(0–10V时步进0.01V,10–36V时步进0.1V)。
- 再次CENTER双击,焦点切换至ISET,同理编辑。
- SINGLE_CLICK在任何状态下均可快速启停输出。
该设计彻底摒弃了传统菜单树的层级嵌套,所有操作均在“一屏之内”完成,符合电源设备“专注、高效、零思考延迟”的工业交互范式。固件V1.3中加入的硬件消抖与软件滑动平均滤波,彻底解决了早期版本中因机械抖动导致的数值跳变问题。
4.2 显示与无线通信架构
W800 MCU作为显示中枢,运行基于SquareLine Studio生成的LVGL图形库。其UI设计遵循“信息密度最大化”原则:主界面以大字体实时显示VOUT、IOUT、VSET、ISET四个核心参数,并用不同颜色区分状态(绿色=正常,红色=过压/过流,黄色=限流激活)。屏幕底部固定显示输入电压VIN与协议协商结果(如“PD:12V”)。
W800与HC32F334之间的I²C通信协议为自定义精简协议:
- 地址:W800为Slave(0x38),HC32F334为Master。
- 数据帧:1字节命令 + N字节数据。命令包括
READ_VOUT、READ_IOUT、SET_VSET、GET_STATUS等。 - 速率:400 kHz,确保在100 ms内完成一次完整参数刷新。
硬件上已焊接ESP32-WROOM-32模块,其UART接口直连W800。虽然当前固件尚未启用Wi-Fi/Bluetooth功能,但所有底层驱动(AT指令解析、Socket连接管理、BLE GATT服务定义)已在W800代码仓库中开源。这意味着,任何开发者均可基于现有框架,快速开发出手机APP、Web Dashboard或微信小程序,将本电源无缝接入物联网生态。
5. 工程实践要点与调试经验
5.1 固件烧录与开发环境
三颗MCU的开发工具链相互独立,需分别配置:
- HC32F334:使用华大半导体官方ISP下载工具。烧录前必须将板载的NRST引脚与GND短接约1秒后释放,强制MCU进入Bootloader模式。推荐波特率设置为115200,以兼顾速度与稳定性。
- CH543D:使用沁恒官方CH543 ISP工具。首次烧录空片时,无需任何短接,直接USB连接即可识别。后续升级则需在上电前将PD_UPG引脚拉高(通过短接3V3)。
- W800:使用全志官方W800 Flash Download Tool。烧录前需将W_BOOT引脚拉低(短接GND),并短暂拉低W_RST复位。
所有固件均以.hex或.fls格式发布,版本号(如V1.3)与发布日期(2025/11/19)严格对应,修复项(如EC11消抖、小数点显示修正)均有明确记录,确保开发过程可追溯、可复现。
5.2 关键调试技巧
- 模式切换验证:使用示波器同时观测Buck与Boost两路PWM信号。在VOUT缓慢调节过程中,应能清晰观察到:当越过1V阈值时,一路PWM从固定值跳变为可调值,另一路则从可调值跳变为新的固定值。这是验证模式切换逻辑正确性的最直接证据。
- PI参数整定:不建议在满载下直接调试。应先在空载或轻载(<0.5A)下,将Kp设为极小值(如0.1),Ki设为0,仅观察系统对阶跃指令的响应。待获得基本稳定性后,再逐步增大Kp,最后加入Ki消除静差。每次修改后,务必用电子负载施加瞬态电流扰动(如0.1A→5A阶跃),观察VOUT的超调与恢复时间。
- EMI问题定位:若输出纹波异常大,首要检查点是功率地(PGND)与信号地(AGND)是否在单点(通常为采样电阻附近)可靠连接。其次,检查自举电容的充放电波形,若其电压在每个周期内有明显跌落,则需增大电容值或检查驱动IC的灌电流能力。
该项目的全部设计文件——包括原理图(PDF)、PCB(Gerber)、BOM清单(Excel)、源代码(Gitee仓库链接)以及详细的视频制作教程——均已公开。它不承诺一个“开箱即用”的完美产品,而提供了一套经过千锤百炼、每一行代码都有其存在理由、每一个元件选择都有其工程权衡的完整技术路径。对于真正想理解开关电源如何从理论走向实践的工程师而言,这份文档本身,就是最硬核的教材。
