找回密码
 立即注册
楼主: 梁工

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

  [复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2026-07-04 17:13:30

83

主题

7888

回帖

1万

积分

超级版主

积分
16827
发表于 2026-1-20 20:30:46 | 显示全部楼层
Lex*** 发表于 2026-1-20 17:42
代码直接操作寄存器,看着有点晕,想问一下,输入12V,设定输出5v0.5A,短接输出端,进入CC模式下电流0.5A ...

恒流与设置电压无关,只要电流大于设定值,就会恒流。
恒压、恒流原理,你要看下程序,PID部分。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-01-21 18:16:48
已绑定手机

0

主题

2

回帖

8

积分

新手上路

积分
8
发表于 2026-1-21 18:18:37 | 显示全部楼层
梁*** 发表于 2026-1-20 20:30
恒流与设置电压无关,只要电流大于设定值,就会恒流。
恒压、恒流原理,你要看下程序,PID部分。 ...

现在是5v0.5A短路输出横流,增加输入电压电流值跟着增加了,这应该调整哪里可以解决这个问题?

点评

PID计算和控制要兼顾响应速度和稳定性。 因为短路时负载电阻很小,等于采样电阻+线路电阻,可能小于100毫欧,此时PI系数要适当减小。 [attachimg]130014[/attachimg] 短路属于小于2R负载,使用上面红框内的参数。  详情 回复 发表于 2026-1-21 20:08
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:896
  • 最近打卡:2026-07-05 00:45:32
已绑定手机

6

主题

95

回帖

2760

积分

金牌会员

积分
2760
发表于 2026-1-21 20:08:10 | 显示全部楼层
做的好漂亮呀
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2026-07-04 17:13:30

83

主题

7888

回帖

1万

积分

超级版主

积分
16827
发表于 2026-1-21 20:08:40 | 显示全部楼层
Lex*** 发表于 2026-1-21 18:18
现在是5v0.5A短路输出横流,增加输入电压电流值跟着增加了,这应该调整哪里可以解决这个问题? ...

正常的PID控制输出不会出现恒流电流值跟输入电压相关的情况,如果出现了,就是PID异常,一般是振荡了,此时要适当调整PID参数。
PID计算和控制要兼顾响应速度和稳定性,响应快了,但是短路时恒流电流会出现振荡,短路能稳定恒流,但响应较慢。
因为短路时负载电阻很小,等于采样电阻+线路电阻,可能小于100毫欧,微小的电压变化都能引起较大的电流变化而导致振荡,此时PID系数要适当减小。
截图202601212008213864.jpg
短路属于小于2R负载,使用上面红框内的参数。


回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:896
  • 最近打卡:2026-07-05 00:45:32
已绑定手机

6

主题

95

回帖

2760

积分

金牌会员

积分
2760
发表于 2026-1-22 15:54:47 | 显示全部楼层
梁工这个如果做成60伏输入,最大48伏输出,其它不变,除了改12伏供电电路和MOS管,还用改其他地方吗?

点评

1、12电源的产生需要改变。 2、MOSFET耐压要使用100V的。 3、输入电容耐压使用75~100V的,输出电容耐压要使用63V的。 4、输出电压低时,输入、输出压差大,要加大电感量。 5、输入电压、输出电压的ADC检测输入电阻要  详情 回复 发表于 2026-1-22 18:20
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2026-07-04 17:13:30

83

主题

7888

回帖

1万

积分

超级版主

积分
16827
发表于 2026-1-22 18:20:31 | 显示全部楼层
qizhi*** 发表于 2026-1-22 15:54
梁工这个如果做成60伏输入,最大48伏输出,其它不变,除了改12伏供电电路和MOS管,还用改其他地方吗?
...

1、12电源的产生需要改变。
2、MOSFET耐压要使用100V的。
3、输入电容耐压使用75~100V的,输出电容耐压要使用63V的。
4、输出电压低时,输入、输出压差大,要加大电感量。
5、输入电压、输出电压的ADC检测输入电阻要改变。
6、R9不焊接。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:896
  • 最近打卡:2026-07-05 00:45:32
已绑定手机

6

主题

95

回帖

2760

积分

金牌会员

积分
2760
发表于 2026-1-22 21:12:55 | 显示全部楼层
梁*** 发表于 2026-1-22 18:20
1、12电源的产生需要改变。
2、MOSFET耐压要使用100V的。
3、输入电容耐压使用75~100V的,输出电容耐压要 ...

感谢您的回复。好的,我改试试,行的话贴上来。中途有问题再请教您
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:306
  • 最近打卡:2026-07-04 11:49:30
已绑定手机

14

主题

41

回帖

485

积分

中级会员

积分
485
发表于 2026-3-10 22:00:52 | 显示全部楼层
梁工你好,请教一下下面的代码怎样理解呢

  1. while (1)
  2. {
  3.                 if(B_adc_ok)
  4.                 {
  5.                         B_adc_ok = 0;
  6.                         adc_filter[VOL_OUTPUT]  = (adc_filter[VOL_OUTPUT] *3)/4  + adc[VOL_OUTPUT];
  7.                          j = adc_filter[VOL_OUTPUT] / 4;        //输出电压, 低通滤波结果为14位,取值12位
  8.                         voltage = (u16)((float)j * Uo_SCALE);        //输出电压, ADC结果12位, 分压电阻33K+3K,5V基准,量程30.00V,则V=adc*3000/4096 = adc*0.73242(实测为准), 计算结果分辨率0.01V, 2位小数
  9.                         adc_filter[CUR_OUTPUT]  = (adc_filter[CUR_OUTPUT] *3)/4  + adc[CUR_OUTPUT];        
  10.                         j = adc_filter[CUR_OUTPUT] / 2;        //输出电流, 低通滤波结果为14位,取值13位
  11.                         if(j >= Io_adc_zero)        j -= Io_adc_zero;        //计算电流
  12.                         else                                        j = 0;
  13.                         current = (u16)((float)j * Io_SCALE);                //输出电流, ADC结果13位,20mR采样放大24/1.5=16倍,电流量程=2.5/16/0.02=7.8125A,则校准系数 = 7812.5/8192 = 0.9536,则电流 = adc * 0.9536
  14.                         j = PID_Compute((float)pid_Vol_Set, (float)voltage);                //(float setpoint, float input)
  15.                         if(B_BAT_low || B_stop)        j = 0, integral = 0;        //电池低压 或 停止输出 则禁止PID
  16.                         PWM_Value = j;
复制代码

一、请问行7代码:adc_filter[VOL_OUTPUT]  = (adc_filter[VOL_OUTPUT] *3)/4  + adc[VOL_OUTPUT];
这里的低通滤波算法是什么呢?
二、请问低通滤波结果为14位是怎样推算出来的呢?
三、请问输出电压、电流采样滤波后的结果分别取12位和13位是基于什么原因呢?
谢谢!


点评

1、这是最简单的数字低通滤波算法:数字一阶低通滤波,Y(n) = Y(n-1)*(1-a) + X(n)*a,a  详情 回复 发表于 2026-3-11 10:51
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2026-07-04 17:13:30

83

主题

7888

回帖

1万

积分

超级版主

积分
16827
发表于 2026-3-11 10:51:59 | 显示全部楼层
kpf*** 发表于 2026-3-10 22:00
梁工你好,请教一下下面的代码怎样理解呢

1、这是最简单的数字低通滤波算法:数字一阶低通滤波,Y(n) = Y(n-1)*(1-a) + X(n)*a,a<1,对应的是硬件一阶(一节)RC低通滤波,a值越小,对应的RC值越大,滤波效率越好,但响应越慢,要选择合适的a值。我的算法是为了避开小数计算而又不会出现截断误差,而使用整数计算,我这种算法很少看到有人这样用过的。我的算法实际是Y(n) = Y(n-1)*(1-1/4) + X(n)*1/4*4,即Y(n) = Y(n-1)*3/4 + X(n),结果扩大了4倍,但不会出现截断误差。

2、上述描述,结果扩大了4倍,所以12位的ADC变成了14位。

3、电压使用12位,是因为我要的电压范围是0~40V,12位ADC最大值4095,对应40.95V。
     电流使用13位,是因为我要的电流范围是0~8V, 13位ADC最大值8191,对应8.191A。
    也就是说,我要求ADC分辨率跟我的显示分辨率一致。

关于数字滤波,说来话长,您可以去搜索一下相关知识,或者向AI询问。
2 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:306
  • 最近打卡:2026-07-04 11:49:30
已绑定手机

14

主题

41

回帖

485

积分

中级会员

积分
485
发表于 2026-3-12 12:09:50 | 显示全部楼层
梁*** 发表于 2026-3-11 10:51
1、这是最简单的数字低通滤波算法:数字一阶低通滤波,Y(n) = Y(n-1)*(1-a) + X(n)*a,a ...

感谢梁工的详细解答。关于第一点问题,我理解梁工你是采用将算法转为整数运算的思路。按照梁工你的思路,关于y(n)放大4倍,4*y(n)=( Y(n-1)*(1-1/4) + X(n)*1/4)*4= Y(n-1)*3 + X(n),这与梁工你程序中的公式不一样,请问4*y(n)=Y(n-1)*3 + X(n)是否正确呢?

点评

本来的计算:Y(n)=Y(n-1)*3/4 + X(n)*1/4。 小数计算是正确的,但是使用整数计算,则原始信号X(n)*1/4倍缩小为1/4,丢失2bit。 我的计算是:Y(n)=Y(n-1)*3/4 + X(n)。相当于将 X(n)*1/4*4,即扩大4倍,这样+X(n)就不  详情 回复 发表于 2026-3-12 14:58
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 08:15 , Processed in 0.074835 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表