硬件上位机链接: UF4UpperPower
PC上位机链接: F4CP
立创开源硬件:数字电源
觉得不错的话点个star吧
qq交流群 : 871340927
本仓库是 UF4 数字电源的下位机固件工程,面向基于 STM32G474CBT6 的四开关同步整流 Buck-Boost 数字电源控制板。
固件负责 ADC 采样、PWM 调制、Buck/Mix/Boost 模式切换、电压电流闭环、保护逻辑、USB CDC 通信、DAPLink 辅助烧录和固件版本发布。
注意: 由于焊接的水平不同和实际硬件的差异,作者不对任何人使用本项目造成的任何直接或间接损失负责,使用前请务必做好充分的风险评估和安全防护措施。
本项目是一套基于 STM32G474 的双向四管升降压数字电源
- 设计输入:
5V - 40V10AMAX - 输出范围:
0.5V - 40V, - 功率拓扑: 四开关同步整流 Buck-Boost
- 正反向电流均可以到0-10A
固件提供电压/电流设定、实时状态上报、保护阈值配置、调试量读取和固件版本信息接口,便于接入外部控制或调试工具。
板载了DAPLINK(STM32F103),如果您需要在线烧录固件,你还需要将DAPLink固件烧录到STM32F103上
注意: 作者使用的MOS可能不够理想 ,因此在高压低压两端的效率和稳定性可能不够好,你在可以选择更适合的MOSFET以提升性能。
当前作者测试使用到的硬件参数及其计算详情见 计算记录
- 主控 MCU:
STM32G474CBT6 - 板载DEBUG:
STM32F103C8T6(DAPLink) - 栅极驱动器:
UCC27211 - 辅助电源1: VIN->5V
LMR36520F用于运放,基准电压和风扇供电 - 辅助电源2: 5V->3V3
LM1117-3.3用于MCU 与外设控制逻辑供电 - 辅助电源3: 5V->11.1V
SY7304DBC用于栅极驱动器供电
当前板卡定位是四开关同步整流 Buck-Boost 数字电源控制板,下位机负责控制、采样、保护和通信接口。
当前功率拓扑是四开关 Buck-Boost,固件中划分三种模式:
-
Buck- 输入明显高于输出
- Buck 桥主调制
- Boost 桥承担同步整流或固定导通辅助角色
-
Mix- 输入电压接近输出电压
- 两侧桥臂共同参与调制
- 用于平滑跨越 Buck 和 Boost 边界
-
Boost- 输入明显低于输出
- Boost 桥主调制
- Buck 桥承担同步整流或固定导通辅助角色
当前 IOC 与固件约定中:
HRTIM Timer A对应 Buck 桥HRTIM Timer D对应 Boost 桥PA8/PA9为一组互补 PWMPB14/PB15为另一组互补 PWM
项目使用 UCC27211 半桥驱动器。该器件高边驱动采用 bootstrap 供电思路:
- 高边供电使用
HB-HS - 需要
HB-HS自举电容,使用100nF的贴片电容 - 需要
HS周期性回到较低电位,bootstrap 电容才能补电
这意味着在 Mix 或 Boost 模式中,如果某一侧高边长期接近常开,不给 bootstrap 刷新窗口,就可能出现高边驱动电压下跌,进而表现为:
- 模式不稳定
- 输入被突然拉低
- 无法顺利进入
Mix/Boost - 模式反复抖动
因此控制代码中不能只看理论占空比,还必须兼顾驱动器刷新条件。
当前固件的主要采样量如下:
VINIINVOUTIOUTBoard TEMP1Board TEMP2CPU TEMP
采样与换算特性:
-
电压采样采用分压进入 ADC,再由软件恢复真实电压值,使用 GS8558-SR 运放
-
电流采样基于
7 mΩ分流电阻、20x放大增益和1.65 V中点偏置,使用INA240A1 进行差分采样并放大 -
ADC1规则组用于VIN/IIN/VOUT/IOUT -
温度由
ADC2/ADC3/ADC5配合temp.c完成换算 使用10k NTC热敏电阻
- 外部参数存储:
W25Q64 - 风扇:
TIM8_CH3PWM 控制 - 三色 LED:红 / 黄 / 绿状态指示
DIV_SW、驱动使能等 GPIO 作为板级辅助控制
本章对应当前实际参与运行的 C 代码。
固件主体是一个面向四开关 Buck-Boost 数字电源的实时控制程序。代码按职责可以分为五层:
- 板级外设层
- 由
adc.c、hrtim.c、tim.c、gpio.c、spi.c、usart.c等文件完成。 - 负责 ADC 触发采样、HRTIM 互补 PWM、死区、风扇 PWM、Flash、USB CDC 和串口等底层资源初始化。
- 由
- 采样与物理量换算层
- 主要在
function.c中的ADCSample()和ADC_calculate()。 ADC1采样VIN / IIN / VOUT / IOUT,再经过校准参数、分压比例和电流采样比例换算成实际电压电流。
- 主要在
- 状态机与保护层
- 主要在
function.c。 StateM()管理Init / Wait / Rise / Run / Err主状态。ShortOff()、OVP()、OCP()、OTP()负责短路、过压、过流、过温保护。StateMRise()负责软启动,当前输出参考从 0 开始爬升,同时逐步放开 Buck/Boost 最大占空限制,降低启动输入电流过冲。
- 主要在
- 模式判定与切模准备层
- 主要在
BBMode()和PowerControl_PrepareModeSwitch()。 - 固件根据实际输出电压和输入电压关系切换
Buck / Mix / Boost。 - 模式判定带回差,避免在临界点抖动。
- 切入 Mix 时,Boost 支路和 PID 种子从当前硬件状态起步,避免理论占空直接注入造成突跳。
- 主要在
- 快速闭环控制层
- 主要在
pid.c的BuckBoostVILoopCtlPID()。 - 由 HRTIM 快环中断调用,负责电流环、电压环、anti-windup、模式对应 duty 计算和 HRTIM 比较值刷新。
- Buck、Mix、Boost 分别有不同的输出路径;Mix 区有独立补偿器初值、专用限幅和 anti-windup。
- 电压环采样加入轻量 IIR 滤波,
u0/u1内部状态会按当前模式可实现占空范围限幅,避免隐藏积分跑飞。 - 电流环加入 CC/CV 滞回、释放保持时间和更温和的 Vref 拉低/释放步进,减少限流边界抖动。
- 主要在
当前固件的主要实时节拍如下:
TIM6 1 ms -> 毫秒计数、喂狗
TIM7 5 ms -> ADC 平均、保护、主状态机、模式判定、UF4 流 tick
TIM16 10 ms -> ADC 平均值换算成 VIN/VOUT/IIN/IOUT 浮点上报值
HRTIM 200kHz -> BuckBoostVILoopCtlPID() 快速闭环与 PWM 刷新
通信接口由 uf4_transport.c 承担。它把 UF4COM V3 数据 ID 映射到固件内部变量,支持参数设置、状态读取、实时流数据、固件版本信息和调试量上报。
下位机执行节拍分为三层:
main.c
- 负责所有外设初始化
- 启动 ADC、DMA、USB、定时器、HRTIM、看门狗
TIM75 ms 中断
- 负责采样平均、保护、主状态机推进、模式判断、协议流 tick
HRTIM快环中断
- 负责电流环、电压环、模式对应 duty 计算和 PWM 比较值刷新
整体上是“中断驱动 + 全局控制变量共享”的经典数字电源固件结构。
作用:
- 系统入口
- 启动所有底层外设
- 启动风扇 PWM
- 启动
TIM6 / TIM7 / TIM16 - 启动 ADC 与 HRTIM
- 在主循环里运行慢速后台任务
关键点:
TIM6负责毫秒计数与喂狗TIM7负责控制主节拍TIM16负责把 ADC 平均值换算成物理量- 主循环负责:
StatusLed_Update()Update_Flash()UF4Transport_RunTask()
作用:
- 保存全局控制变量
- 实现 ADC 平均
- 实现主状态机
- 实现 Buck / Mix / Boost 模式判定
- 实现 OVP / OCP / OTP / Short 保护
- 实现参数默认值、Flash 初始化与读写
- 实现风扇 PWM 控制
- 实现模式切换占空注入准备
核心职责可以分成六类:
- 数据与状态变量
CtrValueDFSADCSET_Value
- ADC 采样平均
ADCSample()ADC_calculate()
- 主状态机
StateM()StateMInit()StateMWait()StateMRise()StateMRun()StateMErr()
- 模式切换
BBMode()PowerControl_PrepareModeSwitch()
- 保护
ShortOff()OVP()OCP()OTP()
- 辅助
PowerControl_DisableOutput()FAN_PWM_set()Init_Flash() / Read_Flash() / Update_Flash()
当前重要变更也集中在这个文件:
- 已删除输入欠压保护
- 已删除固件自动风扇策略,改为通过通信接口控制
- 新增切模前 duty 预计算与注入准备
作用:
- 实现双环控制
- 根据当前模式输出 Buck / Boost 支路占空比
- 直接刷新 HRTIM 比较寄存器
当前快环结构:
- 电流环先生成电压参考修正量
- 电压环再根据当前模式生成主 duty
- 根据
Buck / Mix / Boost决定:
- 哪一侧主调制
- 哪一侧固定占空或平滑逼近目标占空
- 最后写入:
Timer A Compare1Timer A Compare3Timer D Compare1
当前代码已经加入三类关键增强:
Buck模式下,Boost 支路对齐为同步整流安全占空Mix模式进入改成平滑爬升,避免一刀切到高占空Boost模式进入改成平滑爬升,避免 Buck 支路瞬时拉到极高占空
另外还增加了 TI 思路的切模注入:
- 切换到
Buck前先按D = Vout / Vin计算目标 duty - 切换到
Mix前先按D = Vout / (Vin + Vout)计算目标 duty - 切换到
Boost前先按D = (Vout - Vin) / Vout计算目标 duty - 切模时把 duty 与环路种子直接装入快环,避免沿用旧模式积分硬跳
作用:
- 把固件控制变量绑定到
UF4COM V3协议 ID - 处理 USB CDC / USART DMA 收发
- 处理
READ / WRITE / REPORT / STREAM - 负责把外部写入同步到控制变量
主要内容:
- 固定传输端口选择
- UF4 ID 表绑定
- 读寄存器镜像刷新
- 写寄存器应用
- CDC / UART DMA 输入处理
- 流发送调度
这部分是固件对外提供 UF4COM V3 控制与状态接口的桥。
作用:
- 按当前状态机、故障和输出状态更新三色 LED
- 保持项目当前定义的状态语义
该文件不参与功率控制本身,但负责把运行状态转换成板上可视反馈。
作用:
- NTC 温度换算
- MCU 温度换算
它为 OTP()、上报温度和风扇控制数据源提供支持。
作用:
- SPI Flash 底层驱动
- 提供读、写、擦除接口
上层由 function.c 中的 Init_Flash() / Read_Flash() / Update_Flash() 调用。
这些文件大多由 CubeMX 或 HAL 模板生成,但在项目运行中实际承担关键底层角色,因此也应当纳入说明。
- 配置
ADC1 / ADC2 / ADC3 / ADC5 - 定义采样通道、触发源、过采样、DMA 方式
ADC1是主功率量采样入口
- 配置
HRTIM1 - 定义
Timer A和Timer D - 配置死区
- 配置 ADC 触发点
- 配置互补输出引脚
这是功率控制的底层核心之一。
- 配置
TIM6 - 配置
TIM7 - 配置
TIM8 - 配置
TIM16
其中:
TIM6:1 msTIM7:5 msTIM16:10 msTIM8_CH3:风扇 PWM
- 配置 LED
- 配置 PWM 引脚复用
- 配置
DIV_SW等辅助引脚
- 配置
USART1 / USART2 - 配合
UF4Transport处理串口通信
- 配置
SPI1 - 供
W25Q64.c使用
- 配置 DMA 控制器
- 为
ADC1 DMA、UART DMA 等提供底层支持
- 配置独立看门狗
- 由固定节拍任务喂狗
- 中断入口
- 把 HRTIM、TIM、DMA、USB 等中断交给 HAL 和用户逻辑
- MSP 初始化
- GPIO AF、DMA 链接、时钟使能等底层板级装配
- 系统时钟基础支持
- 核心启动时钟框架
除了 Core/Src,还有几类 C 文件同样是固件运行必需部分:
- USB CDC 收发桥接
- 把收到的 USB 数据转发到
UF4Transport_OnUsbCdcRx()
STM32 HALCMSISUSB Device
这些代码不是本项目手写控制逻辑,但属于最终可运行固件的一部分。
可以把当前控制链概括为:
main.c初始化外设TIM7周期调用:
ADCSample()- 保护逻辑
StateM()BBMode()
HRTIM快环中断调用:
BuckBoostVILoopCtlPID()
UF4Transport
- 处理外部控制命令
- 回传状态与流数据
- 主循环
- 更新状态灯
- 保存参数
- 处理通信后台任务
本项目不是从零开始完全自写。下面按“来源 -> 用到什么”列出。
这是当前 UF4DigitalPower 最直接的代码来源,借鉴内容包括:
- 控制变量组织方式
- 主状态机结构
Buck / Mix / Boost模式判定框架pid.c的双环控制结构- 软启动框架
- Flash 参数存储方式
- 温度换算与风扇 PWM 基础接口
当前工程并不是简单复制,而是做了以下方向上的重构:
- 从
D/FHRTIM 映射迁移到当前A/D映射 - 删除按键和 OLED 本地人机交互
- 改为基于
UF4COM V3的外部控制接口 - 去掉
FMAC / CRC硬件依赖,改为纯软件路径 - 修复多处模式切换、占空钳位、保护与上报问题
借鉴内容:
UF4COM V3帧结构- CRC16-CCITT
- TV 数据项编码
READ / WRITE / REPORT / STREAM交互范式
当前固件的 uf4_transport.c 基于这一协议核心实现控制、状态与流数据传输。
借鉴内容:
- 外设初始化代码骨架
- HRTIM、ADC、TIM、USART、SPI、USB CDC 配置模板
- 中断框架
- HAL 驱动与启动文件
这些内容主要体现在:
adc.chrtim.ctim.cgpio.cusart.cspi.cdma.cstm32g4xx_it.cstm32g4xx_hal_msp.c
标题:
Multimode control for a four-switch buck-boost converter
借鉴内容:
Buck / Buck-Boost / Boost多模态 duty 公式- 切模前先按目标模式计算 duty,再把目标 duty 注入控制环的思路
- 认识到模式切换时不应依赖旧模式积分慢慢追
当前项目里新增的“切模前预计算 duty 并注入”机制直接参考了这条思路。
标题:
Buck-boost converter using the STM32F334 Discovery kit
借鉴内容:
- HRTIM 在 Buck-Boost 电源中的使用方法
- ADC 触发和 PWM 协调方式
- 高分辨率定时器在数字电源中的组织思路
借鉴内容:
- 半桥高边 bootstrap 驱动机制
HB / HS / HO / LO含义- 高边长期近似常开时 bootstrap 刷新约束
这对当前 Mix / Boost 模式稳定性分析非常重要。
UF4DigitalPower/
├─ Core/
│ ├─ Inc/
│ └─ Src/
├─ Drivers/
├─ Middlewares/
├─ USB_Device/
├─ docs/
├─ scripts/
├─ storage/
└─ UF4DigitalPower.ioc
git clone https://github.com/UF4OVER/UF4DigitalPower_Firmware
cd UF4DigitalPower_Firmware
git submodule update --init
cmake --build cmake-build-debug -- -j4












