# 基于STM32的同步整流Buck-Boost数字电源 开源

**URL:** <https://bbs.eeclub.top/t/topic/114>\
**Category:** 开源项目 / Open-Source Project\
**Tags:** Power, Buck-Boost, STM32, Open-Source\
**Created:** [2025 年10 月 30 日 15:13 UTC](https://bbs.eeclub.top/t/topic/114 "2025-10-30T15:13:56Z")\
**Posts on this page:** 20\
**Page:** 2

<div class="post-metadata">

作者： ![SHX2567](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/s/9d8465/32.png) [@SHX2567](https://bbs.eeclub.top/u/SHX2567)\
发布日期： [2026 年3 月 24 日 10:06 UTC](https://bbs.eeclub.top/t/topic/114/21 "2026-03-24T10:06:58Z")

</div>

具体怎么说啊佬，没懂为啥不能空载开环

---

<div class="post-metadata">

作者： ![七里香](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/%E4%B8%83/9e8a1a/32.png) [@七里香](https://bbs.eeclub.top/u/%E4%B8%83%E9%87%8C%E9%A6%99)\
发布日期： [2026 年3 月 24 日 10:07 UTC](https://bbs.eeclub.top/t/topic/114/22 "2026-03-24T10:07:47Z")

</div>

如果焊接方面没有问题的话，我看见ADC采集的输入输出电压电流不准确会不会是ADC处理数据的算法问题，因为我改了一下数值处理的一些代码，误差就没那么大了

---

<div class="post-metadata">

作者： ![zeruns](https://bbs.eeclub.top/user_avatar/bbs.eeclub.top/zeruns/32/7_2.png) [@zeruns](https://bbs.eeclub.top/u/zeruns)\
发布日期： [2026 年3 月 24 日 12:39 UTC](https://bbs.eeclub.top/t/topic/114/23 "2026-03-24T12:39:57Z")

</div>

自己去了解一下boost的原理吧，下面给你个AI回复：

* * *

简单来说，Boost（升压）变换器在 **空载（无负载）且开环（无反馈控制）的情况下运行，会导致输出电压无限上升** ，最终烧毁电容、开关管或二极管。

以下是深度解析其背后的物理逻辑：

### 1. 能量“只增不减”的累积效应

Boost 电路的工作分为两个阶段：

- **充电阶段：** 开关管导通，电感 L 储能。
- **放电阶段：** 开关管断开，电感 L 将储存的能量与电源 V\_{in} 一起叠加，向输出电容 C 充电。

 ![a boost converter circuit diagram，AI 生成](https://s3.eeclub.top/original/2X/9/9872845a027ba6a2d6a039603518743b0fa809d8.jpeg)

在 **正常带载** 情况下，电感每个周期传递给电容的能量，会被负载消耗掉，从而达到能量平衡。

但在 **空载** 情况下，负载电流为零。这意味着每个开关周期从电感“泵”进电容的能量 **无处可去** 。根据电容储能公式 E = \frac{1}{2}CV^2，能量不断堆积，电压 V 必然会节节攀升。

* * *

### 2. 数学模型的推导

在理想状态下（连续导通模式 CCM），Boost 变换器的输出电压公式为：

V\_{out} = \frac{V\_{in}}{1 - D}

（其中 D 是占空比）

- **开环状态：** 意味着占空比 D 是固定不变的（例如 $D=0.5$）。
- **理想与现实的冲突：** 理论公式是在“动态平衡”下成立的。但在空载时，由于没有电流输出，电路会进入**断续导通模式 (DCM)**。在 DCM 模式下，如果占空比固定且负载趋近于无穷大，理论上的输出电压会趋向于无穷大。

* * *

### 3. 灾难性的后果

由于实际电路中不存在“无限大”的电压，系统会由于达到物理极限而崩溃：

1. **电容击穿：** 输出滤波电容的耐压值（VDC）被超过，电容炸裂或短路。
2. **开关管/二极管损毁：** MOSFET 的 V\_{ds} 或二极管的反向耐压被击穿。
3. **反馈失效：** 虽然你说是“开环”，但即使有反馈电路，如果反馈速度不够快或者没有设计**过压保护 (OVP)**，在空载瞬间产生的电压尖峰也足以致命。

* * *

### 总结与预防措施

| **特性** | **表现** | **结果** |
| --- | --- | --- |
| **能量传递** | 每个周期强制向输出端“泵”入能量 | 电荷在电容上不断堆积 |
| **电压反馈** | 缺失（开环），无法通过减小占空比来降压 | 电压失去约束 |
| **最终归宿** | 电压超过元器件耐压极限 | **硬件烧毁** |

**实际工程中如何解决？**

- **闭环控制：** 使用 PWM 控制器，当检测到电压升高时，自动减小占空比 D。
- **假负载 (Dummy Load)：** 在输出端并联一个大电阻，确保即使在空载时也有微小电流消耗多余能量。
- **过压保护 (OVP)：** 增加硬件层面的电压钳位电路。

---

<div class="post-metadata">

作者： ![zeruns](https://bbs.eeclub.top/user_avatar/bbs.eeclub.top/zeruns/32/7_2.png) [@zeruns](https://bbs.eeclub.top/u/zeruns)\
发布日期： [2026 年3 月 24 日 12:42 UTC](https://bbs.eeclub.top/t/topic/114/24 "2026-03-24T12:42:14Z")

</div>

你提问的信息太少了，回答不了，没有图，没有数据，没有详细描述（做了什么修改？）…

推荐阅读：[https://bbs.eeclub.top/t/topic/109](https://bbs.eeclub.top/t/topic/109)

---

<div class="post-metadata">

作者： ![zeruns](https://bbs.eeclub.top/user_avatar/bbs.eeclub.top/zeruns/32/7_2.png) [@zeruns](https://bbs.eeclub.top/u/zeruns)\
发布日期： [2026 年3 月 24 日 12:51 UTC](https://bbs.eeclub.top/t/topic/114/25 "2026-03-24T12:51:19Z")

</div>

基于STM32G474设计数字Buck-Boost电路的环路补偿参数，是一个从 **连续域（模拟）设计** 向 **离散域（数字）转化** 的过程。STM32G474 凭借其高分辨率定时器 (HRTIM) 和内置的数学加速器 (FMAC/CORDIC)，非常适合这种高频数字电源控制。

计算和设计数字环路补偿参数通常分为以下几个关键步骤：

### 第一步：获取功率级的小信号模型 (s域)

首先，你需要知道被控对象（Buck-Boost功率级）的连续时间传递函数 G\_{vd}(s) （控制到输出电压的传递函数）。  
对于四管同步Buck-Boost，通常分为三种工作模式，其传递函数各不相同：

1. **Buck模式** ：属于最小相位系统，存在LC双极点和输出电容的ESR零点。
2. **Boost模式 / Buck-Boost模式** ：属于非最小相位系统，除了LC极点和ESR零点外，还存在**右半平面零点 (RHPZ)**。
  - RHPZ 会导致相位延迟增加，同时幅值增加，极易引起系统不稳定。
  - RHPZ 的频率公式通常为：f\_{RHPZ} = \frac{R\_{load} \cdot (1-D)^2}{2 \pi L}。

**关键点** ：你的环路穿越频率（带宽） f\_c 必须设计在最坏情况下的 RHPZ 频率的 1/5 到 1/3  
以下，以保证足够的相位裕度。

### 第二步：设计模拟补偿器 (s域)

确定了 G\_{vd}(s) 后，设定目标穿越频率 f\_c （通常为开关频率 f\_{sw} 的 1/10 ）和相位裕度（通常为 45^\circ 到 60^\circ ）。

- **电压模式控制 (VMC)**：通常需要 **Type III 补偿器** （PID等效，提供双极点和双零点），以补偿LC谐振带来的 180^\circ 相位掉落。
- **峰值电流模式 / 平均电流模式 (CMC)**：电流环将电感降阶为一阶系统，外环电压环通常只需要 **Type II 补偿器** （PI等效）。

假设使用 PI 控制器，其连续域传递函数为：

G\_c(s) = K\_p + \frac{K\_i}{s}

### 第三步：离散化转换 (s域 → z域)

微控制器无法直接处理 s 域公式，必须将其离散化为 z 域。常用的离散化方法是 **双线性变换（Tustin变换）** ，它能较好地保留频域特性。

代入 Tustin 变换公式：

s \approx \frac{2}{T\_s} \frac{1 - z^{-1}}{1 + z^{-1}}

（其中 T\_s 为控制环路的采样周期）

将上式代入 G\_c(s)，即可得到数字补偿器的传递函数 G\_c(z)。

### 第四步：推导差分方程 (C语言实现)

将 G\_c(z) 转换为时域的差分方程，这是 STM32G474 实际执行的代码逻辑。以标准的 **增量式 PI 控制** 为例，推导后的标准差分方程为：

\Delta u[n] = K\_p \cdot (e[n] - e[n-1]) + K\_i \cdot T\_s \cdot e[n]

u[n] = u[n-1] + \Delta u[n]

- e[n]：当前ADC采样电压与基准电压的误差。
- e[n-1]：上一次的误差。
- u[n]：当前计算出的控制量（HRTIM的占空比比较值）。
- u[n-1]：上一次的控制量。

### 第五步：STM32G474 硬件增益标定

在数字系统中，你计算出的 K\_p 和 K\_i 不能直接套用模拟计算的结果，必须引入 **ADC量化增益** 和 **PWM转换增益** ：

1. **ADC增益 (K\_{ADC})**：例如使用12位ADC，参考电压为 3.3V，反馈分压比为 K\_{div}，则ADC采样值与实际输出电压的关系为：
K\_{ADC} = \frac{2^{12} - 1}{3.3} \cdot K\_{div}
2. **PWM增益 (K\_{PWM})**：G474 的 HRTIM 分辨率极高（约 170ps）。如果 HRTIM 的周期寄存器值为 PER，则占空比与控制量的关系为：
K\_{PWM} = \frac{PER}{1.0}

最终写入 MCU 的参数 K\_{p\_digital} 和 K\_{i\_digital} 需要根据全局系统增益进行等比例缩放：

K\_{digital} = \frac{K\_{analog}}{K\_{ADC} \cdot K\_{PWM}}

### STM32G474 编程优化建议

- **定点数运算** ：为了极速响应，尽量避免使用 `float`（尽管G474有FPU）。使用 Q15 或 Q31 格式的定点数，结合 CMSIS-DSP 库的 `arm_pid_q31` 函数，或者利用 G474 的 **FMAC (滤波数学加速器)** 让硬件自动计算 PI/Type III 补偿。
- **ADC触发机制** ：使用 HRTIM 特定事件（通常是PWM周期的中心点）硬触发 ADC 采样，以避开开关噪声，这被称为“消隐”或平均电流采样。

---

<div class="post-metadata">

作者： ![SHX2567](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/s/9d8465/32.png) [@SHX2567](https://bbs.eeclub.top/u/SHX2567)\
发布日期： [2026 年3 月 25 日 12:47 UTC](https://bbs.eeclub.top/t/topic/114/26 "2026-03-25T12:47:50Z")

</div>

谢谢大佬，原来如此啊

---

<div class="post-metadata">

作者： ![SHX2567](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/s/9d8465/32.png) [@SHX2567](https://bbs.eeclub.top/u/SHX2567)\
发布日期： [2026 年3 月 25 日 12:50 UTC](https://bbs.eeclub.top/t/topic/114/27 "2026-03-25T12:50:12Z")

</div>

![22e0ffb913d2e33b31036a7ab1c3d636](https://s3.eeclub.top/original/2X/6/61629c1a36576a2a0d31e7727be9bb77334e245b.png)大佬，这个输入电流采样的两个输入端为啥这么接啊？这么接会导致输出电压是负值吧，可能是因为输入和输出电流流向不一样吗？规定输出电流为正，那么输入电流就是负的了？而且从同向输入端5号角看进去这个100欧电阻和6.2K的是并联关系呀，怎么理解呢，谢谢大佬

---

<div class="post-metadata">

作者： ![zeruns](https://bbs.eeclub.top/user_avatar/bbs.eeclub.top/zeruns/32/7_2.png) [@zeruns](https://bbs.eeclub.top/u/zeruns)\
发布日期： [2026 年3 月 25 日 13:12 UTC](https://bbs.eeclub.top/t/topic/114/28 "2026-03-25T13:12:25Z")

</div>

1. 自己再细看一下电流流过采样电阻产生的电压正负方向
2. 自己搜一下运放差分放大电路的原理和计算（模电基础）

---

<div class="post-metadata">

作者： ![SHX2567](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/s/9d8465/32.png) [@SHX2567](https://bbs.eeclub.top/u/SHX2567)\
发布日期： [2026 年3 月 25 日 15:26 UTC](https://bbs.eeclub.top/t/topic/114/29 "2026-03-25T15:26:00Z")

</div>

我应该没记错呀，1.电流应该是VOUT+→负载→VOUT-→GND→VIN-→VIN+呀，2.差分运放的R47=R39，R43=R41的时候输出就是Vout=R47/R43（0-VIN-）呀。而且R41和R39合并后就是个反向放大了啊

---

<div class="post-metadata">

作者： ![ABC](https://bbs.eeclub.top/user_avatar/bbs.eeclub.top/abc/32/101_2.png) [@ABC](https://bbs.eeclub.top/u/ABC)\
发布日期： [2026 年3 月 25 日 16:35 UTC](https://bbs.eeclub.top/t/topic/114/30 "2026-03-25T16:35:03Z")

</div>

兄弟，你对外部电流回路的理解稍微反了一下哦。电源是从 VIN 供电的，电流从 VIN+ 流入，经过电路后到达 GND，最后必须经过 R13 从 GND 流回 VIN- 才能回到外部电源负极。因为电流方向是 GND → VIN-，所以相对 GND（0V）来说，VIN- 处的电压其实是一个 **负电压** ！

既然输入信号是负压，运放采用的就是反相放大接法，输出 V\_{out} = -62 \times (\text{负压}) ，负负得正，ADC 采样到的就是正电压啦。

至于你发现的 5 脚电阻并联，观察得很仔细！那是因为反相端（6脚）看进去的等效电阻是 100 欧和 6.2K 并联，为了消除运放输入偏置电流带来的误差，同相端（5脚）也必须接一个阻值相等的等效电阻接地。这在模电里叫 **平衡电阻** ，是为了提高采样精度的标准做法。

---

<div class="post-metadata">

作者： ![SHX2567](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/s/9d8465/32.png) [@SHX2567](https://bbs.eeclub.top/u/SHX2567)\
发布日期： [2026 年3 月 25 日 18:31 UTC](https://bbs.eeclub.top/t/topic/114/31 "2026-03-25T18:31:44Z")

</div>

可是如果这样做的话从5角看出去这俩电阻就是并联的啊，并联后的等效电阻才是真正接入5角的

---

<div class="post-metadata">

作者： ![zeruns](https://bbs.eeclub.top/user_avatar/bbs.eeclub.top/zeruns/32/7_2.png) [@zeruns](https://bbs.eeclub.top/u/zeruns)\
发布日期： [2026 年3 月 26 日 00:59 UTC](https://bbs.eeclub.top/t/topic/114/32 "2026-03-26T00:59:58Z")

</div>

模拟电子技术基础学过没  
开尔文走线了解一下

---

<div class="post-metadata">

作者： ![SHX2567](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/s/9d8465/32.png) [@SHX2567](https://bbs.eeclub.top/u/SHX2567)\
发布日期： [2026 年3 月 26 日 09:26 UTC](https://bbs.eeclub.top/t/topic/114/35 "2026-03-26T09:26:45Z")

</div>

我突然懂了大佬！因为输入端采样电阻的电流是从GND流出来流到VIN-的，所以VIN-是个负值，负电压，所以正相输入端接GND（0V），反向输入端接VIN-，而上面的6.2K是差分放大的标准接法，只不过从形式上看这俩电阻都接地了，R41和R39好像是并联关系，所以说是反向放大好像也没啥问题

---

<div class="post-metadata">

作者： ![SHX2567](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/s/9d8465/32.png) [@SHX2567](https://bbs.eeclub.top/u/SHX2567)\
发布日期： [2026 年3 月 27 日 08:20 UTC](https://bbs.eeclub.top/t/topic/114/36 "2026-03-27T08:20:12Z")

</div>

佬我想问一下，他这个供电方式不是有两种吗，一种是C口供电另一种是DC口供电，而且有电压诱骗芯片，并且三个配置引脚都给悬空了，默认诱骗20V，那也就是说供电只能拿个支持20V5A的100W充电器或者12V以上的带DC口的电源适配器给板子供电吗？

---

<div class="post-metadata">

作者： ![zeruns](https://bbs.eeclub.top/user_avatar/bbs.eeclub.top/zeruns/32/7_2.png) [@zeruns](https://bbs.eeclub.top/u/zeruns)\
发布日期： [2026 年3 月 27 日 10:12 UTC](https://bbs.eeclub.top/t/topic/114/37 "2026-03-27T10:12:09Z")

</div>

最高诱骗20V，不是只能诱骗20V，充电器不支持20V会降档，比如15V/12V

---

<div class="post-metadata">

作者： ![SHX2567](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/s/9d8465/32.png) [@SHX2567](https://bbs.eeclub.top/u/SHX2567)\
发布日期： [2026 年3 月 27 日 10:55 UTC](https://bbs.eeclub.top/t/topic/114/38 "2026-03-27T10:55:58Z")

</div>

哦哦，也就是说诱骗芯片最高支持20V的电压档位，但是低于20V的也行，但是不能低于12V，要不然没法通过第一级的buck芯片降压出来12V给半桥驱动和小风扇供电

---

<div class="post-metadata">

作者： ![zeruns](https://bbs.eeclub.top/user_avatar/bbs.eeclub.top/zeruns/32/7_2.png) [@zeruns](https://bbs.eeclub.top/u/zeruns)\
发布日期： [2026 年3 月 27 日 11:19 UTC](https://bbs.eeclub.top/t/topic/114/39 "2026-03-27T11:19:05Z")

</div>

**是的**

---

<div class="post-metadata">

作者： ![SHX2567](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/s/9d8465/32.png) [@SHX2567](https://bbs.eeclub.top/u/SHX2567)\
发布日期： [2026 年3 月 27 日 17:14 UTC](https://bbs.eeclub.top/t/topic/114/40 "2026-03-27T17:14:36Z")

</div>

对了佬，你做这个项目的时候有没有啥比较大的调试问题，能展开说一下吗，说几个比较大的或者容易犯的调试问题

---

<div class="post-metadata">

作者： ![hzh](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/h/9de0a6/32.png) [@hzh](https://bbs.eeclub.top/u/hzh)\
发布日期： [2026 年4 月 1 日 04:06 UTC](https://bbs.eeclub.top/t/topic/114/41 "2026-04-01T04:06:41Z")

</div>

\_\_HAL\_HRTIM\_SETCOMPARE(&hhrtim1, HRTIM\_TIMERINDEX\_TIMER\_D, HRTIM\_COMPAREUNIT\_1, PERIOD - CtrValue.BuckDuty);

```
// Boost占空比

\__HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_F, HRTIM_COMPAREUNIT_1, CtrValue.BoostDuty);

```

大佬为什么buck反向boost不用呢

---

<div class="post-metadata">

作者： ![hzh](https://bbs.eeclub.top/letter_avatar_proxy/v4/letter/h/9de0a6/32.png) [@hzh](https://bbs.eeclub.top/u/hzh)\
发布日期： [2026 年4 月 1 日 08:09 UTC](https://bbs.eeclub.top/t/topic/114/42 "2026-04-01T08:09:47Z")

</div>

为什么buckpwm 是period-buck  
boost是boost呢  
需不需要进行180度移相呢 已问过dpseek 不确定求解

[上一页](https://bbs.eeclub.top/t/topic/114.md?page=1)

[下一页](https://bbs.eeclub.top/t/topic/114.md?page=3)
