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

数控电源-恒压/恒流,STC32G-HSPWM做充电器(升降压)-PID控制

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-07-12 09:53:22

75

主题

6219

回帖

1万

积分

超级版主

积分
13128
发表于 5 天前 | 显示全部楼层
cqjo*** 发表于 2025-7-7 12:06
看过代码,这个限幅是明白的,但中间的值PIDTERM和PWM要输出的值如何对应的不太明白,比如我现在检测到AD ...

PID计算的结果PIDTERM就是PWM值。
你现在检测到ADC比设定值低了20%,这个20%的ADC差值是500,那么经过PID计算后就会得到一个PWM值。
我的PID计算是根据实际电压值、电流值来计算的,不是原始ADC值。在恒压模式下,如果当前的电压值比设定的低,则误差是整数,误差*比例系数 + 积分*积分系数 + 微分*微分系数 = PID输出,这个输出就是PWM值。

不知道这样解释你明白了吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-07-08 13:53:56
已绑定手机

0

主题

5

回帖

26

积分

新手上路

积分
26
发表于 5 天前 | 显示全部楼层
梁*** 发表于 2025-7-7 16:59
PID计算的结果PIDTERM就是PWM值。
你现在检测到ADC比设定值低了20%,这个20%的ADC差值是500,那么经过PID ...

还有待消化,这个SEPIC电路用的是位置式PID吗,为什么很多人说电源用增量式PID会比较好?

点评

位置式PID:计算的是控制量的绝对值,输出u(k)直接对应执行机构应该达到的目标位置(例如,阀门开度、电机目标角度、期望电压值),按指定位置作为目标值。 增量式PID:计算的是控制量的变化量(增量),输出Δu(k)  详情 回复 发表于 5 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-07-12 09:53:22

75

主题

6219

回帖

1万

积分

超级版主

积分
13128
发表于 5 天前 | 显示全部楼层
cqjo*** 发表于 2025-7-7 18:03
还有待消化,这个SEPIC电路用的是位置式PID吗,为什么很多人说电源用增量式PID会比较好? ...

位置式PID:计算的是控制量的绝对值,输出u(k)直接对应执行机构应该达到的目标位置(例如,阀门开度、电机目标角度、期望电压值),按指定位置作为目标值。

增量式PID:计算的是控制量的变化量(增量),输出Δu(k)表示控制量相对于上一次输出需要增加或减少多少,只控制增量值。

所以,对于这种有绝对设定位置的,我个人喜欢使用位置式PID。
对于设定的温度值、电压值、电流值、阀门开度、电机转速等等,这种给定绝对目标值的,我没用过增量式,要不你给个例子我学习下?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-07-08 13:53:56
已绑定手机

0

主题

5

回帖

26

积分

新手上路

积分
26
发表于 4 天前 | 显示全部楼层
让你学习下版主太抬举我了,我也是一知半解,胡乱改了下,不知道可不可行,不行的话版主就当个笑话看看
data   float Ui[3];  //新增积分数组
data   int ERR[3];  //新增误差数组
data  int pidTerm;

void        PID_nitialization(void)
{
        Kp =  0.5f;                        // 比例系数
        Ki =  0.07f;                // 积分系数
        Kd =  0;                        // 微分系数
        integral = 0;                // 积分累计值
        iMax =  24000.0f;        // 积分高限幅
        iMin = -24000.0f;        // 积分低限幅
        prev_input = 0;                // 上一个输入
        prev_error = 0;                // 上一次误差
        output  = 0;                // 输出值
        out_min = 0;                // 输出最小值
        out_max = 1500.0f;                // 输出最大值

        Ui[0]=0;
        Ui[1]=0;
        ERR[0]=0;
        ERR[1]=0;
        ERR[2]=0;
                pidTerm=0;
}

//增量式PID算法
u16        PID_Compute(float setpoint, float input)
{
        ERR[0] = setpoint - input;                //ERR[0]可能为正也可能为负  
       Ui[0] =  Ui[1]+((float)ERR[0] * Ki);     //积分环节 前一个Ui+现在误差*KI
       if( fabs(Ui[0]) > iMax )//积分限幅
         {
        Ui[0] = Ui[0] > 0 ? iMax :-iMax;
        }                       
      pidTerm =pidTerm+ERR[0]*Kp+ ERR[1]*Ki+ERR[2]*Kd ;       
       ERR[2]=ERR[1];             
       ERR[1]=ERR[0];       
       Ui[1] = Ui[0];          //保留到下次
     if(pidTerm >  out_max)        pidTerm = out_max;        // 输出限幅
     if(pidTerm <  out_min)        pidTerm = out_min;        // 输出限幅
     return (u16)pidTerm;
}

点评

ERR[0] = setpoint - input; 这个实际也是拿绝对位置与当前位置的偏差去计算,觉得跟位置式没有质的区别。 你实际测试效果如何?特别是给低内阻的电池充电时的响应。  详情 回复 发表于 4 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-07-12 09:53:22

75

主题

6219

回帖

1万

积分

超级版主

积分
13128
发表于 4 天前 | 显示全部楼层
cqjo*** 发表于 2025-7-8 13:53
让你学习下版主太抬举我了,我也是一知半解,胡乱改了下,不知道可不可行,不行的话版主就当个笑话看看
dat ...

ERR[0] = setpoint - input; 这个实际也是拿绝对位置与当前位置的偏差去计算,觉得跟位置式没有质的区别。

你实际测试效果如何?特别是给低内阻的电池充电时的响应。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-12 15:38 , Processed in 0.122465 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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