梁工 发表于 2025-6-28 17:07:30

数控电源-恒压/恒流,STC32G-HSPWM做BUCK降压式开关电源-PID控制



数控开关电源-BUCK降压-恒压恒流输出@STC32G12K128
先贴电路,主控:


电源与输出:


电流采样信号放大:



本程序使用STC32G12K128-LQFP32做的数控电源,HSPWM直接驱动MOSFET输出接功率电感和电容滤波,通过PID控制稳压或恒流, BUCK拓扑,同步整流输出。下载程序时选择IRC频率24MHz,PWM使用PLL-144MHz,主频使用PLL-144MHz/5=28.8MHz。I2C接口OLED12864显示相关参数。电路设计的OLED是SPI接口的,可以使用硬件SPI DMA访问。但本例使用IO模拟I2C访问OLED屏,以后空了再改一个SPI版本,使用DMA写屏和ADC DMA读取ADC值,用户也可以自己改一个。
输入电压:12~24V,有输入电压低压停止输出功能,用户设置低压电压,避免使用电池供电时对电池过放。输出电压:0~输入电压*0.85,分辨率0.01V。大电流负载的投切瞬间输出电压可能会有微小波动。输出电流:0~6.000A,分辨率1mA。限流设定:0.100A~6.000A,步进0.100A。PID计算处理的限流分辨率为4mA。效率:输入24V,输出12V、2A,效率不低于90%,如果除去本机静态功耗,则效率95%以上。PID处理频率(周期):4000Hz(250us)。
通过按键调整输入电压低压保护电压、输出电压、输出电流限流值、清零容量mAH。本程序设置的参数不保存,用户自己可以添加EEPROM保存程序。当输入电压低于输入电压低压保护电压时,停止输出,指示灯1Hz闪烁(0.5秒亮0.5秒灭),直至输入电压恢复至高于设定电压0.5V后恢复输出。当输出电流小于设定恒流值的10%时,指示灯0.5秒快闪一次提示。当输出电流大于设定恒流值的10%时,指示灯常亮提示。注意:本电源不建议用于给电池充电,如果使用,则要小心,先设置好输出电压、输出电流,再接电池。任何时候电池电压比设置的输出电压高、或者停止输出电压,电源驱动的下NMOS会连续导通,直接短路电池!用于对电池充电的,请使用“数控电源-SEPIC升降压-恒压恒流-充电器”。
按键设设置:SEL第一次短按释放选择调整输出电压,反显设定输出电压值。   第二次短按释放选择调整输出电流限流值,反显设定输出电流限流值。   第三次短按释放选择输入电压低压保护电压值,反显输入电压低压保护电压值。      再短按释放循环前述功能。   5秒未操作则自动退出设定模式,恢复正常显示。   长按1秒会清除充电量mAH,并将输入、输出电流归0(用户可以禁止归0)。
处于调整模式、反显设定项时:UP   短按一次,设定电压+0.01V或设定电流+0.100A。长按超过1秒则每秒16个repeat key。DOWN 短按一次,设定电压-0.01V或设定电流-0.100A。长按超过1秒则每秒16个repeat key。       5秒未操作则自动退出设定模式,恢复正常显示。
非调整模式、正常显示时:UP、DOWN短按任意一个键,都会切换输出电压、停止输出电压。
手工校准方法:程序中默认校准系数,编译、下载程序,从GND供电12V(而不是从输入DC插座,设计时没考虑到这点),并且允许输出;校准输入、输出电压:比如输入电压是12V,输入电压实际读数为12.20V,则校准系数=默认系数0.73242 *12/12.2=0.7204。输出电压读数为12V,实测为12.3V,则校准系数=默认系数0.73242 *12.3/12=0.75073。记下此时输入电流、输出电流的读数,即为0点,比如读数为0.056A,则#define Iin_ZERO 56.长按SEL键至电流清0,从OUT-和IN-(DC输入插座负极)输入校准电流,OUT-接I+,IN-接I-。比如输入2A,若输入电流读数为1.9A,则输入电流校准系数=默认系数1.0*2/1.9=1.05263。若输出电流读数为1.1A,则输出电流校准系数=默认系数1.0*2/1.1=1.8182。重新编译下载即可。
串口调试命令:串口设置:115200, 8位数据位,1位停止位,无校验。单个ASCII字符'0':串口不打印信息。单个ASCII字符'1':串口打印绘图曲线,1ms返回5条曲线数据。由于1ms只能返回不超过11个字节,所以参数都转成一个字节,减少发送时间:                            通道1,黄色:设定输出电压值 0~255 表示 0.0~25.5V                            通道2,绿色:当前输出电压值 0~255 表示 0.0~25.5V                            通道3,红色:设定输出电流值 0~255 表示 0.0~2.55A                            通道4,紫色:当前输出电流值 0~255 表示 0.0~2.55A                            通道5,橙色:当前输出PWM值 0~255 表示 0~2550,实际最大为180即PWM=1800
多字符命令:每个数据都以逗号结束, 不能有空格,不能有除了数字和盗号之外别的字符。1260,1000,20,15,0,1260: 设置输出电压(单位0.01V), 1260表示12.60V。1000: 设置输出电流限流(单位1mA),1000表示1.000A。PID恒流计算分辨率为4mA。20:比例系数(单位0.01),20表示Kp=0.20。15:积分系数(单位0.01),15表示Ki=0.15。0:   微分系数(单位0.01), 0表示Kd=0.00。发送设置命令时,最好先禁止输出,避免系数突然大改变而可能导致失控。
=======================================================================使用STC32G12K128-LQFP32的初衷,是因为其是一颗32位内核MCU,ADC带参考电压输入端,PID需要较多计算,8位内核处理速度慢不推荐。下面是焊好的样板照片:

大电流的回路,开了镀锡层,减小电阻。稳压芯片、MOSFET贴上散热片,插上OLED屏,完整版如下:



显示屏的内容我是随便安排的,用户可以根据自己的喜好安排。设置电压:设置输出电压值,步进0.1V,输出最高电压为输入电压的0.85倍。设计者电流:设置输出电流限流值,当负载电流到达这个电流后,进入恒流模式。            以下条件任意一个满足,则会退出恒流模式。            1、输出电压比设置电压高0.05V。            2、输出电流比设置的恒流值低36mA。设置低压:设置输入电压低压保护。当输入电压低于这个设置电压,就会关闭输入,对于电池供电时,          能避免电池过放。低压保护时,LED秒闪提示(亮0.5秒、0.5灭)。输出效率:输出效率 = 输出功率/ 输入功率 * 100.0%输入功率:输入电源的功率。输出PWM:输出的PWM值。输出状态:STOP--停止输出,此时,下面的NMOS导通,具有超过20A的下拉能力。          Output:输出电压,此时提供稳压、恒流的功率输出。输出电压:正在输出的电压值。输出电流:正在输出的电流值。输入电压:正在输入的电压值。输入电流:正在输入的电流值。输出功率:输出电源的功率。输出电量:输出的mAH数。
设置输出12.00V,设置限流1.000A,接5欧姆负载,恒流输出1.001A,电压5.11V(线路有内阻)。由于电路静态损耗有0.91瓦(见上图),所以1A电流输出时,效率不高,只有78.7%

设置输出12.00V,设置限流2.000A,接5欧姆负载,恒流输出2.000A,电压10.16V(线路有内阻)。1A电流输出时,电路静态损耗占比变小,所以效率升高至91.9%

不接负载,长按SEL键超过1秒,输入、输出电流归0。

再接上负载,2A电流输出,此时效率为96.8%,0.5A以上电流的效率基本就在95%以上。



短按SEL键,选择调整设置项,此时可以使用UP和DOWN键调整参数。

具体电路可以参考附件中PDF版本,除了PWM驱动输出电路和电流采样放大电路,别的都是常规电路。本电路使用同步整流输出的BUCK电路(可以认为是一个大电流的推挽输出电路),电路本身可以连续输出超过10A的电流(可能要加散热风扇),本电路电流检测最大7.8A,最大限流6A,PWM1P、PWM1N分别驱动上管和下管,由于MOSFET和电感的内阻小,电容的ESR也小,会得到高效率的转换,这部分电路输出12V时的效率能超过95%。

下图为输出电流检测、放大电路,20mR采样,放大16倍,满量程7.8A,程序设置恒流值为6A。

==================================================================PID调试:使用串口绘图来配合PID调试,没有这些曲线显示是很难调试PID的。打开AiCube-ISP-v6.95Z.exe,再打开“串口绘图”:

设置曲线参数:点击右上角的“设置”,进入下面的设置界面,勾选5条曲线,单字节数据格式。

串口命令设置:点“功能”里的“命令设设置”,

命令1填入1,这是请求返回绘图数据的命令,命令4填入0,这是停止返回数据的命令。点确定。

点击上面的“命令1”或“Ctrl+1”,MCU开始返回数据,这些数据可以保存起来的。点击“命令4”或“Ctrl+4”,MCU停止返回数据。

可以在“数据”里“加载数据”,就可以打开保存的数据:



下面是输出12.00V,恒流2.000A,负载5欧姆,投切负载时的响应曲线,黄色为设定输出电压值(0.1V),绿色为当前输出电压值(0.1V),红色为设定输出电流值(0.01A),紫色为当前输出电流值(0.01A),橙色为当前输出PWM值(x10)。

放大至采样点,一个点为1ms,可见接通负载后,紫色电流曲线先出现较大值(因为输出电容12V加载到5欧负载上),10ms后电流降到红色恒流值2.00A,绿色输出电压曲线跟着下降,稳定在10V左右。断开负载后,紫色电流急剧降为0,几个ms后绿色电压上升至设定值并稳定,负载的投切,输出电压没有大的过冲,这算是比较理想的,但是由于PID处理速度是4000Hz,所以需要几个ms的响应速度。

串口设置PID参数:下图 “多字符串发送”栏填上要发送的参数,每个数据都以逗号结束, 不能有空格,不能有除了数字和盗号之外别的字符。点击字符串的序号,即可发送出去。也可以鼠标指向序号右键定义此字符串的名字。比如:1260,1000,20,15,0,1260: 设置输出电压(单位0.01V), 1260表示12.60V。1000: 设置输出电流限流(单位1mA),1000表示1.000A。PID恒流计算分辨率为4mA。20:比例系数(单位0.01),20表示Kp=0.20。15:积分系数(单位0.01),15表示Ki=0.15。0:   微分系数(单位0.01), 0表示Kd=0.00。发送设置命令时,最好先禁止输出,避免系数突然大改变而可能导致失控。


程序源码、电路、PCB


神农鼎 发表于 2025-7-31 10:37:58

谁出个 立创EDA 版本开源,辛苦费 RMB300
USB-TypeC 接口

国芯人工智能 发表于 2025-6-28 17:08:00

STC32G-HSPWM用于数控开关电源充电器(升降压)的PID控制设计是一项具有实际应用价值的技术实践。该系统基于STC32G微控制器,结合HSPWM模块实现高效、精确的电压与电流控制,适用于多种可充电电池的充放电管理。以下从系统架构、控制逻辑、关键参数及功能实现等方面进行专业分析。

首先,系统输入电压范围为10~24V,具备低压保护功能,用户可自定义低压保护阈值。此设计有效避免了因输入电压不足导致的系统异常或设备损坏。当输入电压低于设定值时,系统进入停充状态,并通过指示灯以1Hz频率闪烁提示用户,确保操作安全。

输出电压范围为0~26.00V,分辨率为0.01V,支持高精度电压调节。这一特性使得系统能够适配多种电池类型,包括锂离子电池、铅酸电池等,满足不同应用场景下的充电需求。同时,输出电流范围为0~3.000A,分辨率1mA,限流设定步进为0.100A,覆盖广泛的电流调节范围,适用于大容量电池的快速充电。

在控制策略上,系统采用PID控制算法,采样频率为4000Hz,确保响应速度与稳定性。PID控制通过调节比例、积分和微分系数,实现对输出电压和电流的精准控制。对于内阻极低的航模锂电池,恒流模式下的PID调节尤为关键,需合理设置参数以避免过冲或振荡,提升充电效率与安全性。

系统在负载接入或移除时表现出良好的动态响应能力。接入负载时,输出电压短暂跌落随后恢复至设定值,未触发限流保护;拔除负载时,电压出现过冲现象,其幅度与当前电流成正比。这种特性表明系统具备良好的瞬态响应能力,但需进一步优化PID参数以减少过冲影响。

用户交互方面,系统通过按键实现参数调整与状态监控。K1键用于切换调整项(输出电压、电流限流值、低压保护电压),并支持10秒无操作自动退出。长按1秒可清零充电量mAH,便于用户记录与管理充电数据。K2键用于向下调整数值,提供直观的操作体验。

状态指示灯根据充电状态提供视觉反馈:常亮表示正在充电,快闪表示充电完成,闪烁表示停充状态。此类设计增强了系统的易用性与可靠性。

此外,系统参数未保存于Flash中,用户可通过添加EEPROM模块实现数据持久化存储,提高系统实用性。未来可考虑增加更多功能,如电池类型识别、温度补偿、充电曲线自适应等,进一步提升系统智能化水平。

综上所述,STC32G-HSPWM数控开关电源充电器设计充分体现了嵌入式系统在电源管理领域的应用潜力。通过合理配置硬件资源与优化控制算法,系统实现了高精度、高稳定性的充放电管理,为多类型可充电电池提供了可靠的解决方案。

[本文内容由国芯人工智能辅助生成,仅供参考]

TK001 发表于 2025-7-3 17:33:27

{:shengli:}

cqjoyspe 发表于 2025-7-5 10:02:18

请问一下PID返回的J和PWM的PWM_Value如何相对应的?
比如我PWM要送的最大值是499,而检测的电压送出的PID是2000,
PWM送不出PWM_Value为2000的值,
另外PID放在WHILE中不放在ADC中断中会不会影响电源的调节速度?

梁工 发表于 2025-7-5 12:20:25

cqjoyspe 发表于 2025-7-5 10:02
请问一下PID返回的J和PWM的PWM_Value如何相对应的?比如我PWM要送的最大值是499,而检测的电压送出的PID是2 ...

1、PWM的最大值要根据你的电路而定,升压需要有一定的关闭时间(以给输出电容充电),所以最高占空比一般在80以下。
2、我的程序PID放在主循环,因为我没有别的事要做,所以不会影响调节速度。如果你的主循环还有点阿亮的事要做,则PID放在ADC中断里执行,并且要保证执行时间只有定时器中断间隔时间的80%以下。

wsh8 发表于 2025-7-6 07:28:13

用STC8H4K64TL能否可以实现

梁工 发表于 2025-7-6 12:08:35

wsh8 发表于 2025-7-6 07:28
用STC8H4K64TL能否可以实现
顶楼例程是 USB直接下载/仿真的
      STC32G12K128实现的,
      不含USB的 STC32G8K64 价格也很低,
===特价款 STC32G8K48-LQFP48, 才 RMB1.6,没动力换STC8H去评估

没必要花也没时间改到算力低的 STC8H 来评估




cqjoyspe 发表于 2025-7-7 10:06:49

梁工 发表于 2025-7-5 12:20
1、PWM的最大值要根据你的电路而定,升压需要有一定的关闭时间(以给输出电容充电),所以最高占空比一般 ...

是的,所以我假设我PWM根据我的电路设定要送的最大值是499,因为PID检测的ADC是12位的,所以,如何让检测且经过PID的值与PWM要送的值挂钩,或者说关联,比如说会不会出现PID要送的是1-2000而我电路PWM要送的值是1-499,怎么关联的{:baoquan:}

梁工 发表于 2025-7-7 11:20:14

cqjoyspe 发表于 2025-7-7 10:06
是的,所以我假设我PWM根据我的电路设定要送的最大值是499,因为PID检测的ADC是12位的,所以,如何让检测 ...

不知道你是否看过我的代码:


cqjoyspe 发表于 2025-7-7 12:06:01

梁工 发表于 2025-7-7 11:20
不知道你是否看过我的代码:

看过代码,这个限幅是明白的,但中间的值PIDTERM和PWM要输出的值如何对应的不太明白,比如我现在检测到ADC比设定值低了20%,这个20%的ADC差值是500,这样要调高输出,假设我的PWM就要比原来送多3%刚好到设定电压,此时PWM要送出的值比原来要多100,这中间是如何刚好对应上的
页: [1] 2 3 4
查看完整版本: 数控电源-恒压/恒流,STC32G-HSPWM做BUCK降压式开关电源-PID控制