梁工 发表于 2025-7-7 16:59:54

cqjoyspe 发表于 2025-7-7 12:06
看过代码,这个限幅是明白的,但中间的值PIDTERM和PWM要输出的值如何对应的不太明白,比如我现在检测到AD ...
PID计算的结果PIDTERM就是PWM值。
你现在检测到ADC比设定值低了20%,这个20%的ADC差值是500,那么经过PID计算后就会得到一个PWM值。
我的PID计算是根据实际电压值、电流值来计算的,不是原始ADC值。在恒压模式下,如果当前的电压值比设定的低,则误差是整数,误差*比例系数 + 积分*积分系数 + 微分*微分系数 = PID输出,这个输出就是PWM值。

不知道这样解释你明白了吗?

cqjoyspe 发表于 2025-7-7 18:03:23

梁工 发表于 2025-7-7 16:59
PID计算的结果PIDTERM就是PWM值。
你现在检测到ADC比设定值低了20%,这个20%的ADC差值是500,那么经过PID ...

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

梁工 发表于 2025-7-7 21:11:35

cqjoyspe 发表于 2025-7-7 18:03
还有待消化,这个SEPIC电路用的是位置式PID吗,为什么很多人说电源用增量式PID会比较好? ...

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

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

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

cqjoyspe 发表于 2025-7-8 13:53:56

让你学习下版主太抬举我了,我也是一知半解,胡乱改了下,不知道可不可行,不行的话版主就当个笑话看看
data   float Ui;//新增积分数组
data   int ERR;//新增误差数组
dataint 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;
        Ui=0;
        ERR=0;
        ERR=0;
        ERR=0;
                pidTerm=0;
}

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

梁工 发表于 2025-7-8 16:02:08

cqjoyspe 发表于 2025-7-8 13:53
让你学习下版主太抬举我了,我也是一知半解,胡乱改了下,不知道可不可行,不行的话版主就当个笑话看看
dat ...

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

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

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

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

forstc 发表于 2025-7-31 10:38:25

收藏参考了,感谢版主分享

abc 发表于 2025-7-31 15:52:52

神农鼎 发表于 2025-7-31 10:37
谁出个 立创EDA 版本开源,辛苦费 RMB300
USB-TypeC 接口

星期天画好可以吗

神农鼎 发表于 2025-7-31 16:28:44

abc 发表于 2025-7-31 15:52
星期天画好可以吗

可以

(^v^) 发表于 2025-7-31 20:26:07

神农鼎 发表于 2025-7-31 10:37
谁出个 立创EDA 版本开源,辛苦费 RMB300
USB-TypeC 接口

不需要做实验焊接吧
页: 1 [2] 3 4
查看完整版本: 数控电源-恒压/恒流,STC32G-HSPWM做BUCK降压式开关电源-PID控制