温度的PID控制及程序示例

上传人:woxinch****an2018 文档编号:38999020 上传时间:2018-05-10 格式:DOC 页数:9 大小:75KB
返回 下载 相关 举报
温度的PID控制及程序示例_第1页
第1页 / 共9页
温度的PID控制及程序示例_第2页
第2页 / 共9页
温度的PID控制及程序示例_第3页
第3页 / 共9页
温度的PID控制及程序示例_第4页
第4页 / 共9页
温度的PID控制及程序示例_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《温度的PID控制及程序示例》由会员分享,可在线阅读,更多相关《温度的PID控制及程序示例(9页珍藏版)》请在金锄头文库上搜索。

1、 温度的 PID 控制一温度检测部分首先要 OK.二、PID 调节作用PID 控制时域的公式)()(1)()(dttdeTdteTiteKpty分解开来:(1) 比例调节器y(t) = Kp * e(t) e(k) 为当前的温差(设定值与检测值的插值)y(k) 为当前输出的控制信号(需要转化为 PWM 形式)# 输出与输入偏差成正比。只要偏差出现,就能及时地产生与之成比例的调节 作用,使被控量朝着减小偏差的方向变化,具有调节及时的特点。但是, Kp 过大会导致动态品质变坏,甚至使系统不稳定。比例调节器的特性曲线.(2) 积分调节器y(t) = Ki * (e(t)dt Ki = Kp/Ti T

2、i 为积分时间#TI 是积分时间常数,它表示积分速度的大小,Ti 越大,积分速度越慢,积分 作用越弱。只要偏差不为零就会产生对应的控制量并依此影响被控量。增大 Ti 会减小积分作用,即减慢消除静差的过程,减小超调,提高稳定性。(3) 微分调节器y(t) = Kd*d(e(t)/dt Kd = Kp*Td Td 为微分时间#微分分量对偏差的任何变化都会产生控制作用,以调整系统输出,阻止偏差变 化。偏差变化越快,则产生的阻止作用越大。从分析看出,微分作用的特点是: 加入微分调节将有助于减小超调量,克服震荡,使系统趋于稳定。他加快了系 统的动作速度,减小调整的时间,从而改善了系统的动态性能。3PID

3、 算法:由时域的公式离散化后可得如下公式: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)记

4、录下来,方便分析。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 替

5、代振荡周期 TS 计算。系统衰减振荡曲线 图中,TS 为衰减振荡周期,Tr 为响应上升时间。 据表中所给的经验公式计算 、TI 及 TD 的参数。表衰减曲线法整定计算公式衰减率 整定参数调节规律(1/Kp)T IT DP S PI1.2 S0.5T S 0.75PID0.8 S0.3T S0.1T SP S PI1.2 S2T r 0.9PID0.8 S1.2T r0.4T r大致计算出 Kp,Ti,Td 后代入公式,然后完善算法。让系统运作多测试几次。直到满 意为止。以下是网上找的一个示例程序 #include #include #define N0 40536 #define nop()

6、_nop_() #define uchar unsigned char #define uint unsigned int/*程序中变量 数组定义*/ uchar idata table=“Real-time Temp:“;/第一行显示“Real-time Temp:“ uchar idata table15; uchar data1,kp,ki,kd; uint t,hightime,count; /占空比调节参数 uint rltemp,settemp=350; int e1,e2,e3,duk,uk;/*引脚定义*/ sbit EOC=P26; sbit OE=P25; sbit STA

7、RT=P27; sbit lcden=P32; sbit lcdrw=P31; sbit lcdrs=P30; sbit pwm=P33;/* 延时子程序 */ void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=29;y0;y-); /* LCD 忙检测 */ bit lcd_busy() bit result; lcdrw = 1; lcdrs = 0; lcden = 1; nop();nop();nop();nop(); result = (bit)(P0 lcden = 0; return(result); /* LCD 写命令子程序

8、*/ 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);lcden = 1; delay(5); lcden = 0; /* LCD 初始化 */ void lcd_init() lcden

9、 = 0; write_com(0x38); delay(5); write_com(0x0f); delay(5); write_com(0x06); delay(5); write_com(0x01); delay(5); write_com(0x80); delay(5); write_com(0x01); /* 定时器初始化 */ void time_init() EA = 1; ET0 = 1; ET1 = 1; TR0 = 1; TR1 = 1; TMOD = 0x11;TH0 = N0/256;TL0 = N0%256; TH1 = 0X3C; TL1 = 0XB0; /* PI

10、D 算法系数装载 */ void Pid_init() hightime= 0; /输出的占空比 e1 = 0; /本次的温度差 e2 = 0; /前一次的温度差 e3 = 0; /两次前的温度差 kp = 10; /需要根据试验确定参数 ki = 5; /需要根据试验确定参数 kd = 5; /需要根据试验确定参数 /* 温度比较 PID 算法 */ void pid_ys() if(rltemp20) / 如果相差 20 度(根据实际情况确定是多少) hightime=100;/全速加热 else /否则运行 PID 算法进行平滑加热 e1 = settemp-rltemp; duk=(k

11、p*(e1-e2)+ki*e1+kd*(e1-e2*2+e3)/10; / 式(1) 因为 Kp 是 10, 输入放大了 10 倍,所以 duk 的输出结果需要除以 10 uk = uk+duk; /*式(1)与上面提到的公式类似 y(k) = y(k-1)+(Kp+Ki+Kd)*e(k)-(Kp +2*Kd)*e(k-1) + Kd*e(k- 2) 可以写成 y(k)-y(k-1)=(kp*(e(k)-e(k)+ki*e(k)+kd*(e(k)-e(k-1)*2+e(k-2) 式(1)中 duk 相当于 y(k)-(k-1) */if(uk100) uk = 100; /设置饱和控制, el

12、se if(uk=settemp)/如果实际温度大于设定值 if(rltemp-settemp 0) /只要实际温度与设定值不相等 hightime=0; /停止加热 else / e1 = rltemp-settemp; duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3); uk = uk+duk; if(uk100) uk = 100; else if(uk-100) uk = -100;e3 = e2; e2 = e1; /* 主函数 */ void main() uint i; time_init();/定时器初始化 Pid_init();/ PID 初始化 l

13、cd_init();/ LCD 初始化 table15=0x43; table14=0xdf; table12=0x2e;/小数点 摄氏度符号 ASCII 码for(i=0;i15;i+) /带循环第一行显示“Real-time Temp:“ write_data(tablei); delay(20); while(1) t=data1*196/100; table13=(t%100)%10+0x30; table11=(t%100)/10+0x30; table10=t/100+0x30; /以上温度数据转化 rltemp = t; /给 PID 算法装载实际值write_com(0x80+0x45);/写 LCD 第二行的初地址 for(i=0;i5;i+) /该循环显示温度值 write_data(table1i); delay(20); pid_ys();/运行温度比较 PID 算法 /* 温度采集转换的定时中断0.5s 刷新一次数据 */ void timer0() interrupt 1 uint j; j+; if(j=

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号