温度的PID控制及程序示例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

温度的PID 控制

一.温度检测部分首先要OK. 二、PID 调节作用 PID 控制时域的公式

))()(1)(()(⎰++

=dt

t de Td t e Ti t e Kp t y 分解开来:

(1) 比例调节器

y(t) = Kp * e(t)

e(k) 为当前的温差(设定值与检测值的插值) y(k) 为当前输出的控制信号(需要转化为PWM 形式)

# 输出与输入偏差成正比。只要偏差出现,就能及时地产生与之成比例的调节

作用,使被控量朝着减小偏差的方向变化,具有调节及时的特点。但是, Kp 过大会导致动态品质变坏,甚至使系统不稳定。比例调节器的特性曲线. (2) 积分调节器

y(t) = Ki * ∫(e(t))dt Ki = Kp/Ti Ti 为积分时间

#TI 是积分时间常数,它表示积分速度的大小,Ti 越大,积分速度越慢,积分作用越弱。只要偏差不为零就会产生对应的控制量并依此影响被控量。增大Ti 会减小积分作用,即减慢消除静差的过程,减小超调,提高稳定性。 (3) 微分调节器

y(t) = Kd*d(e(t))/dt Kd = Kp*Td Td 为微分时间

#微分分量对偏差的任何变化都会产生控制作用,以调整系统输出,阻止偏差变化。偏差变化越快,则产生的阻止作用越大。从分析看出,微分作用的特点是:加入微分调节将有助于减小超调量,克服震荡,使系统趋于稳定。他加快了系统的动作速度,减小调整的时间,从而改善了系统的动态性能。

三.PID 算法:

由时域的公式离散化后可得如下公式:

y(k) = y(k-1)+(Kp+Ki+Kd)*e(k)-(Kp +2*Kd)*e(k-1) + Kd*e(k-2)

y(k) 为当前输出的控制信号(需要转化为PWM形式)

y(k-1)为前一次输出的控制信号

e(k) 为当前的温差(设定值与检测值的插值)

e(k-1) 为一次前的温差

e(k-2) 为二次前的温差

Kp 为比例系数

Ki = Kp*T/Ti T为采样周期

Kd = Kp*Td/T

四.PID参数整定(确定Kp,Ts,Ti,Td):

温度控制适合衰减曲线法,需要根据多次采样的数据画出响应曲线。

所以需要通过串口将采样时间t, 输出y(t)记录下来,方便分析。

1)、不加入算法,系统全速加热,从常温加热到较高的温度的时间为Tk, 则采样时间一般设为 T = Tk/10。

2)、置调节器积分时间TI=∞,微分时间TD=0,即只加比例算法:

y(k) = y(k-1)+Kp*e(k)

比例带δ置于较大的值。将系统投入运行。(δ = 1/Kp)

3)、待系统工作稳定后,对设定值作阶跃扰动,然后观察系统的响应。若响应振荡衰减太快,就减小比例带;反之,则增大比例带。如此反复,直到出现如图所示的衰减比为4:1的振荡过程时,记录此时的δ值(设为δS),以及TS 的值(如图中所示)。当采用衰减比为10:1振荡过程时,应用上升时间Tr替代

振荡周期TS计算。

系统衰减振荡曲线

图中,TS为衰减振荡周期,Tr为响应上升时间。

据表中所给的经验公式计算δ、TI及TD的参数。

大致计算出Kp,Ti,Td后代入公式,然后完善算法。让系统运作多测试几次。直到满意为止。

以下是网上找的一个示例程序

#include

#include

#define N0 40536

#define nop() _nop_()

#define uchar unsigned char

#define uint unsigned int

/*程序中变量数组定义*/

uchar idata table[]={"Real-time Temp:"};//第一行显示"Real-time Temp:"

uchar idata table1[5];

uchar data1,kp,ki,kd;

uint t,hightime,count; //占空比调节参数

uint rltemp,settemp=350;

int e1,e2,e3,duk,uk;

/*引脚定义*/

sbit EOC=P2^6;

sbit OE=P2^5;

sbit START=P2^7;

sbit lcden=P3^2;

sbit lcdrw=P3^1;

sbit lcdrs=P3^0;

sbit pwm=P3^3;

/******************************

延时子程序

*******************************/

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=29;y>0;y--);

}

/******************************

LCD忙检测

*******************************/ bit lcd_busy()

{

bit result;

lcdrw = 1;

lcdrs = 0;

lcden = 1;

nop();nop();nop();nop();

result = (bit)(P0&0x80);

lcden = 0;

return(result);

}

/****************************** LCD写命令子程序

*******************************/ void write_com(uchar com)

{

while(lcd_busy());//忙等待

lcdrs = 0;

lcdrw = 0;

P1 = com;

delay(5);

lcden = 1;

delay(5);

lcden = 0;

}

/****************************** LCD写数据子程序

*******************************/ void write_data(uchar date)

{

while(lcd_busy()); //忙等待

lcdrs = 1;

lcdrw = 0;

P1=date;

delay(5);

相关文档
最新文档