目录

前言

一、功能与需求分析

二、拓扑介绍

2.1传统控制方式

2.2 等效BUCK\BOOST控制方式

2.2.1 BUCK模式

2.2.2 BOOST模式

三、关键参数计算

3.1 电感感量计算

3.1.1 Buck 模式最恶劣工况

3.1.2 Boost 模式最恶劣工况

3.2 电感峰值电流计算

3.2.1 Buck 模式峰值电流计算

3.2.2 Boost 模式峰值电流计算

3.3 输入输出电容计算

3.3.1 基于稳态电压纹波限制计算容量

3.3.2 基于瞬态负载响应计算容量

3.4 校验电感有效值电流与电容纹波电流

3.4.1 电感有效值电流 

3.4.2 电容有效值电流 

3.5 电感选型

3.6 输入输出电容选型

四、2025.09.28(初版设计)

4.1 主功率回路与栅极驱动器(器件选型不具备参考价值)

4.2 电流电压采样电路

4.3 辅助电源

4.4 单片机最小系统

4.5 其它外围电路

4.6 PCB展示

4.7 成品展示

4.8 伪代码

数控电源控制系统架构

状态机设计思路

HRTIM中断回调中的PID控制


前言

        这个项目在25年9月的时候就已经完成初版的制作,当时是为了快速入门程控电源并丰富自己的简历,所以在制作这一版的时候电容电感的计算比较粗糙,主要是为了能先让板子“跑起来”。在前段时间实习结束后,决定深入研究开关电源理论计算这部分的内容(也决定未来向电源方向发展),在计算电感电容等参数时发现初版设计时存在些许问题(主要是电感电容和开关管的选型),所以在第一版实物设计部分会与理论计算有偏差,在后续本篇文章也会持续更新,逐渐产出第二版的实物设计

UP制作本项目的主要目的,是为了学习运算放大器与PID环路控制,电流和电压检测由运算放大器构成采样放大电路,可选择专用检流、检压芯片以获得更高控制精度。在学习该设计前,建议先深入理解斩波变换、PID控制原理,以便更快上手该项目设计。

一、功能与需求分析

        我们需要打造一款电流方向能在两级之间自由切换、输出电压可程序控制的电源板,由于需求的特殊性,常规的拓扑结构如BUCK、BOOST、BUCK-BOOST,单一拓扑只能满足单一方向的升压或降压,无法满足电流双方向的升降压功能需求,基于此我们选用四开关Buck-Boost拓扑结构Four-Switch Buck-Boost,通常缩写为 FSBB),进行电路设计

图1.初版主功率回路(器件选型仅供参考)

二、拓扑介绍

2.1传统控制方式

对于四开关BUCK-BOOST,它本身具有一种传统的控制模式,Q1与Q3为一组,Q2和Q4为1组,两组MOS管交替导通,这种拓扑结构,在CCM模式下输入输出电压公式如下:

V_{in}*D=V_{out}*(1-D)

V_{out}=V_{in}*\frac{D}{1-D}

此公式在稳态条件下基于伏秒平衡得出,推导过程这里大家可以自行查阅资料。由此可得出这种拓扑结构的输入输出电压公式,与CUK(丘克)拓扑是一样的,这种控制方式不涉及V_{in}=V_{out}时的模态切换(后面会提及),控制较为简单,但是四个管子都在工作,损耗较大。

2.2 等效BUCK\BOOST控制方式

BUCK模式与BOOST模式拓扑结构其实相似度很高,仔细观察可发现斩波MOSFET是以电感为对称轴镜像对称,所以可以根据电流流向,分别控制3颗MOS组合成BUCK\BOOST拓扑,对电压进行斩波变换

2.2.1 BUCK模式

在BUCK模式下,以电流从VA流向VB为例:

Q3为常开状态Q4为常闭状态,在导通阶段Q1导通Q2断开,输出电压上升,电感储存电能,电感电压左正右负(红色线路)续流阶段Q1断开Q2导通,电源不再直接为负载提供能量,输出电压下降,由电感与输出电容为负载提供能量(蓝色线路)

此时BUCK模式下输入电压与输出电压的数学关系式为:

V_{out}=V_{in}*D

其中,V_{out}为输出电压,V_{in}为输入电压,D为开关管的占空比,即PWM波的高电平时间与周期之比。

如果电流从VB流向VA,则为Q1常开Q2常闭,Q3与Q4交替导通,输入与输出公式亦然如上。

2.2.2 BOOST模式

在BOOST模式下,以电流从VA流向VB为例:

Q1为常开状态Q2为常闭状态,在储能阶段Q4导通Q3断开,负载由输出电容供电,电感储存电能,电感电压左正右负(红色线路)升压阶段Q4断开Q3导通,电感电压串联在电源上,电感电压左负右正,电感与电源共同输出能量实现实现升压(蓝色线路)

此时BOOST模式下输入电压与输出电压的数学关系式为:

V_{out}=V_{in}*\frac{1}{1-D}

其中,V_{out}为输出电压,V_{in}为输入电压,D为开关管的占空比,即PWM波的高电平时间与周期之比。

如果电流从VB流向VA,则为Q3常开Q4常闭,Q1与Q2交替导通,输入与输出公式亦然如上。

若想详细了解BUCK、BOOST控制原理分析,推荐阅读这篇大佬写的博客:

BUCK、BOOST、BUCK-BOOST电路原理分析_buck电路-CSDN博客

三、关键参数计算

在进行参数计算之前,还需要确定固定的工作工作背景,即输入输出电压范围、最大电流、和开关频率

A侧电压范围(左侧半桥)V_{A}

7V\sim 25V
B侧电压范围(左侧半桥)V_{B} 7V\sim 25V
额定输出电流I_{out} 10A
开关频率f_{sw} 300KHz

在制作这块板子之前,UP曾买过一块数控电源的开发板调试过,发现商家给出的历程是传统控制模式(交替导通),等效BUCK-BOOST模式的参数计算是翻阅TI的LM5175设计手册找到的,网上的简化通用公式计算出来也没有太大差距(膜拜万能的TI),感兴趣的读者可以通过半导小芯或立创商城等平台查阅相关数据手册:

LM5175 德州仪器-TI_PDF_数据手册_Datasheet_规格书_德州仪器-TI产品 - 半导小芯 | 42V 宽输入电压 4 开关同步降压/升压控制器

详细的理论推导可阅读这位技术大拿的博客:

手撕Buck!Buck公式推导过程_buck电路输出电压公式-CSDN博客

这里我就直接采用TI的LM5175设计手册 9.2.2.3 InductorSelection (第21页)中的公式进行计算

3.1 电感感量L计算

由于本设计输入输出电压在一个范围内变化,电压大小与电流流向需要随程序变换,所以根据 TI 手册,Buck-Boost 拓扑的电感选型必须分别计算降压(Buck)和升压(Boost)模式的最恶劣边界条件,然后取最大值。

3.1.1 Buck 模式最恶劣工况

工况设定:输入最高压V_{in(max)}=25V;输出最低压V_{out(min)}=7V;满载电流I_{out}=10A

TI手册公式:

L_{min(buck)}=\frac{V_{out}*(V_{in(max)}-V_{out})}{V_{in(max)}*K_{ind}*V_{out}*f_{sw}}=\frac{7*(25-7)}{25*0.4*10*300000}=4.2uH

其中K_{ind}表示纹波电流系数,这里取 0.4(即允许峰峰值纹波电流 \Delta I=4A )。对于大电流应用,通常推荐在 0.2~0.4 之间取值。

3.1.2 Boost 模式最恶劣工况

工况设定:输入最低压V_{out(min)}=7V;输出最高压V_{in(max)}=25V;满载电流I_{out}=10A

TI手册公式:

L_{min(Boost)}=\frac{V_{in(min)}^{2}*(V_{out(max)}-V_{in(min)})}{V_{out(max)}^{2}*K_{ind}*I_{out}*f_{sw}}=\frac{7^{2}*(25-7)}{25^{2}*0.4*10*300000}\approx 1.18uH

对比可知,4.2μH>1.18μH,电感量由 Buck 模式决定。考虑工程降额裕量,最终推荐选用标准值 4.7μH 或 5.6μH 的功率电感。

3.2 电感峰值电流I_{pk}计算

计算开关电源电感的峰值电流I_{pk}是确保电感不发生磁饱和、避免开关管过流烧毁的关键步骤。根据数据手册和电源设计理论,峰值电流由电感平均电流I_{avg}纹波电流的一半\frac{\Delta L}{2}叠加而成:

I_{pk}=I_{avg}+\frac{\Delta L}{2}

由于这是一个双向 Buck-Boost 电路,我们需要分别计算 Buck(降压) 和 Boost(升压) 两种极端工况下的峰值电流,并取其中的最大值作为最终选型的依据。

3.2.1 Buck 模式峰值电流计算

工况设定:输入最高压V_{in(max)}=25V;输出最低压V_{out(min)}=7V;满载电流I_{out}=10A

在 Buck 拓扑中,电感的平均电流直接等于负载输出电流,即I_{avg}=10A 。基于前文设定的 40% 纹波系数,\Delta I=4A  可得出峰值电流

I_{pk(Buck)}=10A+\frac{4A}{2}=12A

3.2.2 Boost 模式峰值电流计算

工况设定:输入电压最低V_{in(min)}=7V,输出电压最高V_{out(max)}=25V,满载输出I_{out}=10A

在 Boost 拓扑中,电感串联在输入端,其平均电流等于输入侧的平均电流。假设系统转换效率

\eta=90% ,则电感平均电流:

I _{avg(Boost)}=\frac{V_{out}*I_{out}}{V_{in}*\eta }=\frac{25*10}{7*0.9}\approx 39.68A

同样纹波系数取40%

I_{pk(Boost)}=39.68A+\frac{10*0.4}{2}\approx 41.68A

3.3 输入输出电容计算

在双向系统中,任意一端都可能作为 Boost 模式的输入源,承受极大的高频 RMS 纹波电流。电容选型需同时满足稳态纹波和瞬态响应要求。

3.3.1 基于稳态电压纹波限制计算容量

在实际电路中,输出电压纹波由两部分叠加而成:

  1. ESR 压降\Delta V_{ESR}=\Delta I_{L}*ESR (纹波电流流过等效串联电阻产生的瞬时压降)。

  2. 容抗充放电压降: \Delta V_{C}(电容本身吸收或释放电荷引起的电压变化)。
    为了推导出纯粹的电容容量需求,我们通常假设使用极低 ESR 的陶瓷电容阵列,此时总纹波主要由容抗部分决定,即 \Delta V_{out(pp)}\approx \Delta V_{C}

公式推导:

在连续导通模式(CCM)下,电感的纹波电流近似为三角波。在一个完整的开关周期 T_{sw} 内,电容充放电各占一半时间。

充电或放电的时间跨度:\Delta t=\frac{T_{sw}}{2}=\frac{1}{2*f_{sw}}

流过电容的交流电流幅值:由于平均直流电流全部流向负载,电容仅承担交流分量,其峰值为 \frac{\Delta I_{L}}{2}​​ 。根据几何学,半个周期内电容充放的电荷量(三角波面积)为:

\Delta Q=\frac{1}{2}* 底 * 高 =\frac{1}{2}*(\Delta t)*\frac{\Delta t}{2}=\frac{\Delta I_{L}}{8*f_{sw}}

结合电容基本方程.根据电容的基础物理定义,电荷的变化量等于电容乘以电压的变化量:

\Delta Q=C_{out}*\Delta V_{c}

\Delta V_{c}表示输出纹波大小,此处取50mV,即为0.05V

代入\Delta Q表达式得出方程:

C_{out}\geq \frac{2*\Delta I_{L}}{8*f_{sw}*\Delta V_{C}}= \frac{4}{8*300000*0.05}\approx 33.3uF

3.3.2 基于瞬态负载响应计算容量

当负载发生剧烈阶跃时,控制环路尚未反应过来,电容必须独自“扛下”所有能量缺口,为负载提供响应滞后时间内的所有能量。

假设负载电流突然增加了一个巨大的阶跃量 \Delta I_{out}(例如增加了 10A)。由于电感电流不能突变,这额外的 10A 只能完全由输出电容放电来提供。
在开关电源的控制环路中,检测到电压跌落并调整占空比使电感电流跟上新的负载需求,通常需要约 2个开关周期 的时间(即2*T_{sw})。在这 2 个周期的“空窗期”内,电容必须以恒定的电流差值 \Delta I_{out} 持续放电。

公式推导:

利用电容电荷守恒定律(安秒积):

根据电荷放电公式I*\Delta T=\Delta Q=C*\Delta U

电容放电电流等于阶跃电流:I=\Delta I_{out}

电容放电持续时间两个周期:\Delta T=2*T_{sw}=\frac{2}{f_{sw}}

允许的电压最大跌落幅度:\Delta U=\Delta V_{out(transient)}

在这段最恶劣的时间内,电容需要释放的总电荷量为:\Delta Q=\Delta I_{out}*\frac{2}{f_{sw}}

将上述电荷量代入电容的基本方程 \Delta Q=C_{out}*\Delta V_{out(transient)}移项后可得瞬态响应的电容计算公式: 

假设发生最恶劣的阶跃情况——从空载瞬间跳变至满载,即 \Delta I_{out}=10A。由于这是一个双向宽范围电源,我们以最高输出电压 25V 作为基准,允许其跌落 5%,即最大电压跌落幅度 \Delta V_{out(transient)}=25*0.05=1.25V 。

       C_{out}\geq \frac{2*\Delta I_{out}}{f_{sw}*\Delta V_{out(transient)}}=\frac{2*10}{300000*1.25}=53.33uF

综上述计算可知道,输入输出电容有效容值必须大于 53.33uF 

3.4 校验电感有效值电流I_{L(rms)}与电容纹波电流I_{C(rms)}

无论是电感的铜线绕组,还是电容内部的等效串联电阻(ESR),它们本质上都是纯阻性发热元件。根据焦耳定律 P=I2×RP=I2×R ,器件的发热损耗完全取决于流过它的交流有效值电流(RMS),而不是平均直流电流(DC)。

对于电感:如果 RMS 电流过大,其内部漆包线的铜损I_{L(rms)}^{2}*ESR会急剧增加,导致温升过高,绝缘层老化甚至短路。

对于电容:电容并非理想器件,内部存在 ESR。纹波电流流过 ESR 产生的热量I_{C(rms)}^{2}*ESR是电容内部温升的唯一来源。长期超温会导致电解电容寿命下降电解液干涸、鼓包甚至爆裂。

因此,计算 RMS 的根本目的只有一个:确保所选择的器件在最恶劣工况下的热应力在安全范围内。

3.4.1 电感有效值电流 I_{L(rms)}

开关电源中的电感电流是一个带有三角波纹波的直流波形。我们可以将其分解为两部分:

  • 直流分量 ( IAVGIAVG​ ):代表稳态的平均电流。

  • 交流分量 ( iaciac​ ):代表以 0 为中心上下波动的三角波,其峰峰值为 \Delta I_{L}​ 。

根据均方根(RMS)的积分定义,一个包含直流和交流分量的周期性信号,其总 RMS 等于各分量 RMS 平方和的平方根

I_{L(rms)}=\sqrt{I_{avg}^2+I_{ac(rms)}^2}=\sqrt{I_{avg}^2+(\frac{\Delta I_{L}}{2\sqrt{3}})^2}\approx 40.3A

(对于一个标准的等腰三角形交流波形,其 RMS 值为幅值除以\sqrt{3}。因为三角波的峰峰值是\Delta I_{L} ,单边幅值是\frac{\Delta I_{L}}{2}​,所以交流有效值I_{ac(rms)}=\frac{\Delta I_{L}}{2\sqrt{3}}

这意味着您选用的电感温升额定电流必须大于 40A,否则电感会迅速烫手。

3.4.2 电容有效值电流 I_{C(rms)}

电容只负责吸收高频的交流脉动,阻断直流,以最严苛的 Boost 模式输入电容为例:

当开关管导通(占空比 D )时,输入电源直接给电感充电,此时输入电容需要独自向后续电路放电,提供全部负载电流;当开关管关断(时间 1-D)时,电感释放能量给输出,输入电容开始从电源充电。

这就形成了一个周期性的充放电矩形脉冲电流。根据 RMS 的定义,对这个矩形脉冲进行积分计算:

I_{C(rms)}=I_{in(avg)}*\sqrt{D*(1-D)}

(注:如果是 Buck 模式的输出电容,由于电感电流直接流入电容节点,其 RMS 公式则简化为I_{C(rms)}=\frac{\Delta I_{L}}{2\sqrt{3}})

对于 7-25V 双向变换器,当一端处于 Boost 模式(例如 7V 升压至 25V @ 10A)时,该端的“输出电容”实际上充当了另一侧的“输入电容”,承受着极大的高频脉动电流。如果忽略此项,电容极易过热烧毁。带入参数计算可得:

Boost 模式占空比D

D=1-\frac{V_{in(min)}}{V_{out(max)}}=1-\frac{7}{25}=0.72

输入平均电流I_{in(avg)}:

I_{in(avg)}=\frac{V_{out(max)*I_{out}}}{V_{in(min)*\eta }}=\frac{25*10}{7*0.9}\approx 39.68A

(此时效率 \eta 取90%)

电容承受的 RMS 纹波电流:

I_{C(rms)}=I_{in(avg)}*\sqrt{D*(1-D)}=39.68*\sqrt{0.72*(1-0.72)}\approx17.85A

3.5 电感选型

对比两种工况可知,该电路的电感峰值电流I_{pk}与电感有效值电流 I_{L(rms)}主要由 Boost 模式(7V 升压至 25V) 决定,最大峰值电流达到了惊人的 41.68A,最大有效值电流达到40.3A

在实际工程选型中,为了防止电感在高温或大直流偏置下发生磁芯饱和导致失效,必须为饱和电流预留充足的安全裕量。通常要求电感的饱和电流至少大于峰值电流的 1.3 倍,即电感饱和电流至少大于51.2A,同时电感温升电流大于于电感有效电流40.3A

如下图所示:可选择PQ3220封装6.8uH贴片电感,该电感饱和电流75A、温升电流60A

3.6 输入输出电容选型

综合稳态纹波、瞬态响应与RMS 纹波电流指标,输入输出电容必须满足以下要求:

1.电容容值C总有效容值必须大于 53.33μF。考虑到陶瓷电容在高压直流偏置下会有严重的容值衰减(通常衰减至额定值的50%~60%),建议实际配置的标称总容值至在 100μF∼150μF 之间。

2.RMS 额定电流:所选电容阵列的总 RMS 纹波电流额定值必须严格大于 17.85 A。

单靠普通贴片陶瓷电容或电解电容无法同时兼顾大容量和高 RMS 电流,此时可采用电解电容(固态电容更佳)与MLCC并联组合的方式,以达到上述要求

以这颗 松下35V\82uF顶级固态电容数据手册为例:

纹波电流  

Ripple current(单位mAr.m.s)

4A

等效串联电阻

ESR

20mΩ

纹波电流频率修正系数

Frequency correction factor for ripple current

1

在300KHz条件下,纹波电流修正系数为1,此时单颗松下35V\82uF固态电容:能提供82uF容值和4A的纹波电流额定值。为了容量额定值与总纹波电流额定值,至少需要并联 5 颗 这种规格的电容,此时总容值达到400uF,纹波电流最大提供20A,ESR降低至3.5mΩ,完全满足设计需求

(当然松下的电容也是巨巨巨贵的,不差钱或者高端产品的可以用松下的电容,UP还是学生,实在无力承受5块一颗的电容……这里UP就选用国产的电容替代,由下图可知,需要并联至少7颗35V 100uF 6.3*9尺寸的固态电容)

四、2025.09.28(初版设计)

这一版为初版设计,在电感电容和MOSFET选型上存在问题,与上文计算结论存在出入,主功率回路器件选型部分不具备参考价值,还请各位谅解,UP近期将会更新第二版设计过程,可以点个免费的关注支持一下UP

4.1 主功率回路与栅极驱动器(器件选型不具备参考价值)

这里选用CJAC80SN10作为开关管 ,源极与漏极耐压100V,R_{ds(on)10V}在25℃ V_{gs}=10V条件下内阻为6.2mΩ ,栅极驱动器选用IR2104自举型半桥驱动器,存在高侧MOSFET无法100%导通的问题,并且这款驱动器死区时间高达520ns,在300KHz开关频率下周期仅为3333ns。同时开关滞后时间分别为680ns(开通)和150ns(关断),巨大的传播延迟会导致反馈存在滞后,不利于控制环路的设计,所以这款半桥驱动芯片不适用于高频开关电源。电感电容选型也需要按上述计算进行修改

4.2 电流电压采样电路

电压采样采用同向放大电路,放大倍数0.1倍,计算可知最大采样电压33V,同向放大器与单片机ADC引脚间使用电压跟随器隔离输入与输出,提高输入端输入阻抗,降低输出端输出阻抗,提高总体采样精度。

电流采样电路采用差分放大电路,考虑电阻额定功率,此处串联1206封装 额定1W 3mΩ 0.1%精度采样电阻对电流进行双向采样,计算可知差分放大倍数为53.6倍。当有10A电流流过采样电阻时,采样电阻产生0.03V压降,经差分放大器放大53.6倍,输出正负1.605V电压到后级加法器,将输出电压增压+1.65V直流偏置,将正负10A电流转为+0.45~+3.25V 的可供单片机ADC采样的正电压

(注:此处为学习差分放大器与加法器,单独使用了一个加法器进行+1.65V直流偏置,此处直流偏置可集成到差分放大电路中)

4.3 辅助电源

为了给单片机和运算放大器提供稳定的直流电源,采用DC-DC搭配LDO的电源结构,将AB端输入的电源转化为5V和3.3V;选用德州仪器TPS60403电荷泵电压逆变器,将+5V转为-5V为运算放大器提供稳定的负电源;选用0.1%精度10K电阻分压3.3V,采用电压跟随器对电源进行隔离,提供稳定的+1.65V直流偏置。

4.4 单片机最小系统

主控芯片采用STM32G4系列单片机,采用COTEX-M4内核,具有170M主频,且G4系列单片机自带专为数字电源设计高精度定时器HRTIM,具有多路互补PWM输出通道,并且HRTIM 可以在 PWM 周期的严格中点(占空比 50% 处)精确产生同步触发脉冲,强制 ADC 在此刻启动转换。这恰好处于开关管的“静默期”,有效规避了高频开关噪声耦合导致的采样失真。

4.5 其它外围电路

集成0.96寸SSD1306 OLED屏幕,相比插件模块该模块直接集成在板子上,不易晃动且更加美观。

集成RGB灯珠、五向按键、正交编码器、CAN、无线调试接口,方便显示并配置当前输入输出电压

4.6 PCB展示

4.7 成品展示

由于这块板子是去年9月做的,这半年的时间借给学弟拿去学习,学弟保存不当把板子给压变形了,现在板子没办法正常工作,目前手机里只有做好板子上电测启动阶跃的照片,后续继续改进第二版会在立创开源广场完全开源,各位可以一键三连,关注这篇博客最新消息

实物正面:

实物反面:

去年上电测试空载启动波形:

简单调整PID参数后,可以观察到示波器电压波形缓慢上升,在20ms左右电压线性地从0V上升到5V并稳定收敛

4.8 伪代码

数控电源控制系统架构

状态机设计思路

本系统采用有限状态机(FSM)架构实现电源管理的模块化控制,将复杂的电源保护、启动流程分解为6个独立状态:

  初始化 → 输入电压检测 → 输出电压检测 → 输出电流检测 → 上位机命令处理 → 软启动


 核心状态说明

1. Task_0_Initial_state(初始化状态):

1.1 复位所有变量和标志位

1.2 初始化PID控制器

1.3 点亮红色LED指示待机状态

2.Task_1_Vin_detc(输入电压保护)

2.1 过压保护(OVP):当 Vin ≥ Vin_ovp 时触发错误,需降至 Vin_ovp - 2V 才恢复

2.2 欠压保护(UVP):当 Vin ≤ Vin_uvp 时触发错误,需升至 Vin_uvp + 2V 才恢复

2.3 采用滞回比较机制防止临界点抖动

3. Task_2_Vout_detc(输出电压监控)

3.1 连续1000次检测到 Vout ≥ Vout_ovp 才判定为故障

3.2 通过计数器滤波避免瞬时干扰误触发

4. Task_3_Iout_detc(输出电流监控)

4.1连续1000次检测到 Iout ≥ Iout_ocp 才判定为过流

4.2 与电压保护采用相同的去抖策略

4.3 检测上位机启动指令 flag_start_Control

4.4 未收到指令时循环返回电压检测状态

4.5 延时1秒确保系统稳定

4.6 点亮绿色LED指示运行状态

4.7 使能软启动标志,进入PID闭环控制

HRTIM中断回调中的PID控制

在HRTIM定时器A的重复事件中断中执行实时控制:

每周期执行 {
    1. ADC采样更新:
       - 读取输入/输出电压、电流值
       - 应用传感器校准系数
    
    2. PID闭环控制:
       if (系统已启动) {
           执行双环PID控制(电压环+电流环)
           
           if (软启动进行中) {
               Vref += 0.01V  // 电压参考值斜坡上升
               Iref += 0.01A  // 电流参考值斜坡上升
               
               if (Vref ≥ Target_voltage && Iref ≥ Target_Current)
                   退出软启动模式
               
               更新PID目标值
           }
       }
}

核心代码:

由于板子还需优化,这里就只发布初版的状态机控制的代码,完整代码将在下一版完全开源

//状态机控制
void state_machine(void)
{
	Next_State=Current_State=Task_0_Initial_state;
	
	while(1)
	{
		Current_State = Next_State;
		switch (Current_State)
		{
			case Task_0_Initial_state:
			{
				Reset_VAR();	
				LED_Red_ON();
				PID_Init();
				Next_State = Task_1_Vin_detc;
			}	break;
			case Task_1_Vin_detc: //输入电压检测
			{
				/*-------过压检测-------*/
				if(Vin >= Vin_ovp)
				{
					flag_Vin_ovp = Error;
					Next_State = Task_0_Initial_state;
					break;
				}
				if(flag_Vin_ovp == Error)
				{
					if(Vin <= Vin_ovp - 2.0f){flag_Vin_ovp = Normal;}
					else{Next_State = Task_0_Initial_state;break;}						
				}
				/*-------欠压检测-------*/
				if(Vin <= Vin_uvp)
				{
					flag_Vin_uvp = Error;
					Next_State = Task_0_Initial_state;
				}
				if(flag_Vin_uvp == Error)
				{
					if(Vin >= Vin_uvp + 2.0f){flag_Vin_uvp = Normal;}
					else{Next_State = Task_0_Initial_state;break;}						
				}
				Next_State = Task_2_Vout_detc;			
			}	break;
			
			case Task_2_Vout_detc://输出电压检测
			{
				if(Vout >= Vout_ovp)OVP_CNT++;
				else{OVP_CNT = 0;}				
				if(OVP_CNT >= 1000) {flag_Vout_ovp = Error;Next_State = Task_0_Initial_state;break;}
				Next_State = Task_3_Iout_detc;			
			
			}	break;
			case Task_3_Iout_detc://输出电流检测
			{
				if(Iout >= Iout_ocp)OCP_CNT++;
				else{OCP_CNT = 0;}				
				if(OCP_CNT >= 1000) {flag_Iout_ovp = Error;Next_State = Task_0_Initial_state;break;}
				Next_State = Task_4_PC_command;	
			
			}	break;
			case Task_4_PC_command:
			{
				if(flag_start_Control != STOP)Next_State = Task_5_Soft_start;	
				else Next_State = Task_1_Vin_detc;
			
			}	break;
			case Task_5_Soft_start:
			{
				Delay_ms(1000);
				LED_Green_ON();
				flag_Soft_start = Run;		
			
			}	break;
		}	
	}
}
//高精度定时器回调函数
void HAL_HRTIM_RepetitionEventCallback(HRTIM_HandleTypeDef *hhrtim,uint32_t TimerIdx)
{
  if (TimerIdx == HRTIM_TIMERINDEX_TIMER_A ) // 判断是否是TIMA定时器
  {
		Vin  = (float)((ADC1_DMA_Value[1]*3300)>>12)*0.011f; 		
		Iin  = (float)((ADC1_DMA_Value[0]*3300)>>12)*0.00757575f-12.49998f;
		Vout = (float)((ADC2_DMA_Value[0]*3300)>>12)*0.011f;		
		Iout = (float)((ADC2_DMA_Value[1]*3300)>>12)*0.00757575f-12.49998f;
		if(flag_start_Control==STOP)
		{
			PID_control(Vout,Iout);
			if(flag_Soft_start!=STOP)
			{		
				if(Vref>Target_voltage && Iref>Target_Current){flag_Soft_start=STOP;} 
				if(Vref<Target_voltage)Vref+=0.01f;	
				if(Iref<Target_Current)Iref+=0.01f;
				PID_tatgrt_value_modify(Vref,&Voltage_control);	
				PID_tatgrt_value_modify(Iref,&Current_control);	
			}
		}		
	}	
}

更新时间 2026.6.6

此次更新为第一次更新,发布了理论计算与初版设计


Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐