问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

PID温度控制参数整定方法详解

创作时间:
作者:
@小白创作中心

PID温度控制参数整定方法详解

引用
CSDN
1.
https://m.blog.csdn.net/luolt42/article/details/144472943

在温度控制项目中,PID控制器因其良好的控制性能而被广泛应用。本文详细记录了一个基于Ziegler-Nichols方法的PID参数整定过程,通过实验数据和具体计算,展示了如何实现对密封腔体温度的精确控制。

1. PID控制公式

位置式PID控制公式原型:
u(t) = kp * e(t) + ki * [e(1) + e(2) + ....+ e(t)] + kd * [e(t) - e(t-1)]

2. 控制对象与原理

  • 控制对象:加热/制冷器(在2分钟内不能再加热至冷之间切换)控制密封的腔体(空间体积大小15cm20cm65cm)温度。
  • 控制原理:利用MCU的输出比较模块(OCM)产生PWM波驱动H桥电路(通过目标温度和环境温度对比决定加热或者制冷)。

3. PID参数整定

温度控制属于滞后控制系统,采用Ziegler-Nichols参数整定方法:

控制器
Ti
Td
Kp
Ki
Kd
P
×
×
0.5Kc
×
×
PD
×
0.15Pc
0.65Kc
×
Kp*Td/T
PI
0.85Pc
×
0.45Kc
Kp*T/Ti
×
PID
0.5Pc
0.15Pc
0.65Kc
Kp*T/Ti
Kp*Td/T

参数说明:

  • Kc:只采用比例环节控制条件下,控制系统的稳态误差尽量达到最小时的Kp值。
  • Pc:只采用比例环节控制条件下,控制系统的震荡周期。
  • Ti:控制系统的积分时间。
  • Td:控制系统的微分时间。
  • T:PID控制采样计算周期。
  • Kp、Ki、Kd:被整定的参数。

整定步骤:

  1. 获取合适的Kc值,设置Ki,Kd为0。在当前温度进入目标温度3.5°内开始进行PID控制,之前采用90%恒定功率加热。


图一(Kc =5)
图二(Kc =9)
图三(Kc =20)

从上述的四组数据中可以看到,当Kc=5时,控制系统的稳态误差是最小的。在目标范围正负3°之间,选取Kc = 5.

  1. 计算Pc值。从上述的图一(将.csv格式的数据文件在excel中转换图表,将鼠标放在曲线上,会自动显示此点的坐标,如图所示),取4个震荡周期一共720个点,得出一个震荡周期为Pc=720*5/4= 900s。

  2. 根据个人需要采用哪种PID组合来计算Ti、Td、Kp、Ki、Kd。温度控制是属于滞后控制,而PID控制中的,微分项是具有超前调节的作用,因此必须引入;积分项对误差的作用取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,推动控制器的输出向稳态误差减小的方向变化,直到稳态误差等于零。我采用的是PID组合来控制。得出Ti=9000.5=450s。Td=9000.15=135s。

Kp=50.65=3.25;Ki= KpT/Ti=3.255/450=0.036;Kd= KpTd/T=3.25*135s /5=88。

(PID采样周期定为5秒,也可以是其他值,此值不宜过大或过小)

  1. 采用PID控制温度,无论高温低温,稳态误差均在正负0.5°范围之内。如下所示:

一般根据模型计算的参数不一定是适合所有的控制系统(这里实验得到的最佳Kd值为120,而我们算出来的是88),根据特定的环境调节参数范围,找到最优参数,因本系统是滞后系统,微分项起主导作用,我暂时还只做了调整kd值的实验,Ki一般反应在系统达到稳态的时候是否存在稳定误差,从实验结果得出,稳态误差几乎可以忽略。

零下一度的目标温度,连续8小时的温度控制数据:

4. 代码实现

附录://PWM频率为1Khz,定时器的计数周期为5000(mPID.MaxDuty = 5000*90%),PID返回值和上次的的定时器计数值决定本次的占空比。

INT32 PID_calculate(double CurTemp)  
{  
    INT32 RetValue;  
    double result_value;  
    // Keep previous error  
    mPID.PrevError = mPID.Error;  
    // calculate current error  
    mPID.Error = mPID.Target - CurTemp;  
    // calculate integral  
    mPID.SumError += mPID.Error;  
    if(mPID.Kd > 0.0001)  
    {  
        result_value = mPID.Kp * mPID.Error + mPID.SumError * mPID.Ki +  
                       mPID.Kd * (mPID.Error - mPID.PrevError);  
    }  
    else  
    {  
        result_value = mPID.Kp * mPID.Error + mPID.SumError * mPID.Ki;  
    }  
    RetValue = (INT32)result_value;  
    return RetValue;  
}  

// Timer interrupt enable control flag, execute temperature control.  
void TemperatureControl()  
{  
    INT32 ret = 0;  
    if(mPID.type == HEAT)  
    {  
        INT32 DutyValue = OC4RS;  
        if(fabs(mPID.Current - mPID.Target) <= PIDControlStartPoint)  
        {  
            PIDControlStartPoint = 12;  
            ret = PID_calculate(mPID.Current);  
        }  
        else if(fabs(mPID.Current - mPID.Target) <= TempControlStartPoint)  
        {  
            OC4RS = INITPWMPERIOD16 * 50 / 100.0;  
            ret = 0;  
            return ;  
        }  
        else  
        {  
            ret = 0;  
        }  
        if( (DutyValue + ret) > mPID.MaxDuty)  
            OC4RS = mPID.MaxDuty;  
        else if(DutyValue + ret < mPID.MinDuty)  
            OC4RS = mPID.MinDuty;  
        else  
            OC4RS += ret;  
    }  
    else if(mPID.type == COOL)  
    {  
        INT32 DutyValue = OC3RS;  
        if(fabs(mPID.Current - mPID.Target) <= PIDControlStartPoint)  
        {  
            PIDControlStartPoint = 12;  
            ret = PID_calculate(mPID.Current);  
            ret = -ret;// must be negative  
        }  
        else if(fabs(mPID.Current - mPID.Target) <= TempControlStartPoint)  
        {  
            if(mPID.Target > 5.1)  
                OC3RS = INITPWMPERIOD16 * 70 / 100.0;  
            else  
                OC3RS = INITPWMPERIOD16 * 78 / 100.0;  
            ret = 0;  
            return ;  
        }  
        else  
        {  
            ret = 0;  
        }  
        if( (DutyValue + ret) > mPID.MaxDuty)  
            OC3RS = mPID.MaxDuty;  
        else if(DutyValue + ret < mPID.MinDuty)  
            OC3RS = mPID.MinDuty;  
        else  
            OC3RS += ret;  
    }  
    else  
    {}  
}  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号
PID温度控制参数整定方法详解