1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > PID温度控制参数整定方法

PID温度控制参数整定方法

时间:2020-12-03 03:55:06

相关推荐

PID温度控制参数整定方法

@TOCPID温度控制参数整定方法

出处:/pengzhihui/article/details/50380780

最近做了一个温度控制相关的项目,在此记录一下,方便以后查找,同时也供大家参考,欢迎指正,所有数据均为实验数据,绝对真实。

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

控制对象:加热/制冷器(在2分钟内不能再加热至冷之间切换)控制密封的腔体(空间体积大小15cm*20cm*65cm)温度。

控制原理:利用MCU的输出比较模块(OCM)产生PWM波驱动H桥电路(通过目标温度和环境温度对比决定加热或者制冷)。

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.

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

3):根据个人需要采用哪种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。

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

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

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

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

INT32 PID_calculate(double CurTemp)

{

INT32 RetValue;doubleresult_value;// Keep previouserrormPID.PrevError =mPID.Error;// calculatecurrent errormPID.Error =mPID.Target - CurTemp;// calculateintegralmPID.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 temperaturecontrol.

//

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);}elseif(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;elseOC4RS +=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}elseif(fabs(mPID.Current - mPID.Target) <= TempControlStartPoint){if(mPID.Target > 5.1)OC3RS =INITPWMPERIOD16 * 70 / 100.0;elseOC3RS =INITPWMPERIOD16 * 78 / 100.0;ret = 0;return ;}else{ret = 0;}if( (DutyValue+ ret) > mPID.MaxDuty)OC3RS =mPID.MaxDuty;elseif(DutyValue + ret < mPID.MinDuty)OC3RS =mPID.MinDuty;elseOC3RS +=ret;}else{}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。