基于PID控制算法的电阻加热炉温度控制系统设计-本科毕业设计论文.doc
- 文档编号:26315290
- 上传时间:2023-06-17
- 格式:DOC
- 页数:31
- 大小:1.95MB
基于PID控制算法的电阻加热炉温度控制系统设计-本科毕业设计论文.doc
《基于PID控制算法的电阻加热炉温度控制系统设计-本科毕业设计论文.doc》由会员分享,可在线阅读,更多相关《基于PID控制算法的电阻加热炉温度控制系统设计-本科毕业设计论文.doc(31页珍藏版)》请在冰豆网上搜索。
计算机控制系统课程设计报告
基于PID控制算法的电阻加热炉温度控制系统设计
摘要:
温度控制是人们日常生活中经常遇到的问题,传统的控制方法都存在控制慢,精度低等问题,而计算机控制系统能够利用微型处理器加上科学的控制算法使温度控制实现控制快而且精度高。
在本设计中,控制对象为电阻加热炉,通过控制加在电阻丝两端电压的工作时间,从而可控制输入电阻加热炉的功率,继而达到控制其温度的目的。
此系统以单片机为核心,采用固态继电器为执行电路,实现对电炉的自动控制。
算法采用增量型PID控制。
另外本文还阐述了PID控制器的设计,硬件结构和软件设计,实现了一套温度采集和控制的方案。
该系统具有硬件成本低,控温精度较高,可靠性好,抗干扰能力强等特点。
关键词:
电加热炉;单片机;温度控制;PID算法
1、单片机温度控制系统方案简介
单片机温度控制系统是数控系统的一个简单应用。
在冶金、化工、建材、机械、食品、石油等各类工业中,广泛使用着加热炉、热处理炉、反应炉等,因此,温度是工业对象中一个主要的被控参数。
由于炉子的种类不同,因而所使用的燃料和加热方法也不同,例如煤气、天然气、油、电等;由于工业不同,所需要的温度高低不同,因而所采用的测温原件和测温方法也不同;产品工业不同,控制温度的精度也不同,因而对数据采集的精度和所采用的控制算法也不同。
本系统所使用的加热炉为电加热路,炉丝功率为2kw,系统要求测试水杯恒温,误差为,超调量尽可能小,温度上升较快且有良好的稳定性。
单片机温度控制系统是以STC89C52RC单片机为控制核心,辅以采样反馈电路,驱动芯片,固态继电器对电炉进行控制的微机控制系统。
其系统结构框图可表示为:
系统采用单闭环形式,其基本控制原理为:
将温度设定值(即输入控制量)和温度反馈值同时送入控制电路部分,然后经过单片机运算得到输出控制量,输出控制量控制I/O得到一定占空比的PWM波控制固态继电器,固态继电器接通220V市电给电炉,调节PWM占空比使电炉达到一定的温度。
其控制系统框图如图1-1所示。
图1-1系统框图
2、单片机简介
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,有512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52还可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
其直插式芯片引脚图及内部结构如图2-1图所示。
图2-1
STC89C52单片机具体信息如下:
1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051;
2.工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机);
3.工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz
4.用户应用程序空间为8K字节;
5.片上集成512字节RAM;
6.通用I/O口(32个),复位后为:
P0/P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片;
8.具有EEPROM功能;
9.共3个16位定时器/计数器,即定时器T0、T1、T2;
10.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒;
11.通用异步串行口(UART),还可用定时器软件实现多个UART;
12.工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级);
13.PDIP封装。
STC89C52芯片实物图如下图所示:
3硬件电路设计
3.1测温电路
采用DS18B20数字式温度传感器。
DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化,低功耗,高性能,抗干扰能力强,易配微处理器等优点,可直接将温度转化成数字信号处理器处理。
测量的温度范围是—55~125℃,测温误差0.5℃。
可编程分辨率9~12位,对应的可分辨温度分别为0.5℃,0.25℃,0.125℃和0.0625℃。
相较热电偶传感器而言可实现高精度测温
3.2矩阵键盘
采用的按键是独立的立式4引脚按键。
3.3显示电路
采用的是共阴极7段数码管。
由于一般的数码管每一段亮至少需要10个毫安的电流,而单片机的I/O口送不出如此大的电流,所以我们需要加数码管的驱动电路,可以用上拉电阻的方法,也可以使用专门的驱动芯片。
由于我们使用的开发板使用的是74HC573,其输出电流较大,足够点亮数码管。
3.4执行电路
SSR-40DA固态继电器
4系统软件设计
4.1软件程序设计
整个温度控制系统的软件程序由主程序、中断服务程序和子程序三部分组成。
其中主程序主要是对系统的运行进行初始化,包括实现各种参数的初始化,使显示,键盘,报警装置等部分开始工作,最后是控制电加热炉的正常运行。
而系统初始化包括设置控制量的初始值、采样周期、中断方式和状态、定时器的工作状态,中断的开关等。
主程序中也要实现数据采集的任务,通过调用数据采集的子函数,检测出电加热炉的炉温信号,讲采集到的温度值显示到数码管上,同时调用键盘设置的子函数,获取设置的温度,显示在数码管的另外三位,最后根据采集到的温度,与设定温度值,调用PID算法子函数,进行PID计算,输出的结果进入到中断函数中,以影响、产生的PWM波的占空比,从而就可利用PWM波对炉温进行控制。
主程序流程图如下图所示。
开始
系统控制参数的初始化化
电阻加热炉的实时温度采集和设置温度的获取
实际温度与设置温度的显示以及报警装置的工作与否
实际温度与设定温度差值是否大于5?
Y
调用PID算法
全功率加热
开定时器中断
显示子程序:
开始
数据转换为七段码
译码选择显示位
子程序返回
PWM波子程序:
进入中断程序
timer=0
Timer=PID结果?
N
Y
IO口输出0
IO口输出1
Timer++,Timer=100?
N
返回采样温度
4.2算法设计
电阻加热炉是一个非线性、时变系统,所以在本控制系统中采用的是智能控制算法,即PID控制算法,通过对于设定温度与实际温度的差值的比例,微分,积分三者结合得到的算法结果来控制执行机构的执行状态,从而可以让控制系统中的控制时间,超调量,滞后反应以及最后的稳定程度都能有较明显的改善。
4.2.1PID算法参数整定
在PID算法中,最重要的就是对于三个控制参数即KP,KI,KP的整定,以下是PID的整
定过程。
整定方法:
临界比例度法
1.构建闭环回路,确定稳定极限。
2.根据公式计算控制器参数。
稳定极限是由P原件决定的。
当出现稳态振荡时就达到这个极限。
产生临界振荡增益K和临界振荡周期T。
确定两个参数之后通过下表来确定其他参数。
首先建立闭环系统,采用阶跃输入,不加PID控制器及其仿真输出,如下图所示:
先使积分和微分系数为0,即只有比例控制,调节P参数,使系统出现稳态振荡,当时,等到下图所示曲线:
由上图可知,临界振荡增益:
K=1.5;临界振荡周期T=750.35-447.25=303.1,计算PID参数如下:
输入相应PID参数得到如下输出:
由上面输出结果可知,还有一定的超调量,所以将积分系数适当减小,比例和微分系数进行微调,最后当时曲线如下图所示。
5、控制系统测试过程
5.1开环测试
5.1.1开环测试1
设定温度T:
60℃
进入±2℃时间t:
860S
最大超调量:
测试曲线图如下图所示:
5.1.2开环测试2
设定温度T:
60℃
进入±2℃时间t:
840S
最大超调量:
测试曲线图如下图所示:
5.2PID参数调节
5.2.1最终PID参数及测试曲线
设定温度T:
60℃
进入±2℃时间t:
600S
PID参数:
P=0.9,I=0.005,D=33
最大超调量:
测试曲线图如下图所示:
设定温度T:
60℃
进入±2℃时间t:
640S
PID参数:
P=0.9,I=0.005,D=33
最大超调量:
测试曲线图如下图所示:
5.2.2最终PID参数测试其他温度
设定温度T:
80℃
进入±2℃时间t:
320S
PID参数:
P=0.9,I=0.005,D=33
最大超调量:
测试曲线图如下图所示:
5.2.3进入PID温度调节的测试
55℃时进入PID调节
设定温度T:
60℃
进入±2℃时间t:
860S
PID参数:
P=0.9,I=0.005,D=33
最大超调量:
测试曲线图如下图所示:
50℃时进入PID调节
设定温度T:
60℃
进入±2℃时间t:
680S
PID参数:
P=0.9,I=0.005,D=33
最大超调量:
测试曲线图如下图所示:
57℃时进入PID调节
设定温度T:
60℃
进入±2℃时间t:
700S
PID参数:
P=0.9,I=0.005,D=33
最大超调量:
测试曲线图如下图所示:
5.2.4其他PID温度调节的测试
设定温度T:
60℃
进入±2℃时间t:
940S
PID参数:
P=1.2,I=0.005,D=33
最大超调量:
测试曲线图如下图所示:
设定温度T:
60℃
进入±2℃时间t:
820S
PID参数:
P=1.7,I=0.015,D=650
最大超调量:
测试曲线图如下图所示:
设定温度T:
60℃
进入±2℃时间t:
980S
PID参数:
P=2.2,I=0.015,D=650
最大超调量:
测试曲线图如下图所示:
设定温度T:
60℃
进入±2℃时间t:
400S
PID参数:
P=2.5,I=0.015,D=650
最大超调量:
测试曲线图如下图所示:
设定温度T:
60℃
进入±2℃时间t:
620S
PID参数:
P=2.5,I=0.015,D=650
最大超调量:
测试曲线图如下图所示:
6、单片机程序清单:
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitPWM=P2^1;//控制产生PWM波
sbitDS=P2^2;//连接DS18B20传感器
sbitbeep=P2^3; //控制蜂鸣器接口
sbitdula=P2^6; //段选控制接口
sbitwela=P2^7; //位选控制接口
unsignedinttemp,shangxian,xiaxian,max_temp=1000,min_temp=0;
unsignedcharadval;//signoftheresultpositiveornegative
unsignedinti=100;
unsignedintj,k,temp,key1,key2,key3,key11,set_temper,timer1,num1;
doublePID;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-f不带小数点编码
unsignedcharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};//带小数点编码。
unsignedintrout;//PID输出
unsignedintrin;//PID输入(实际温度)
unsignedintrealtemp;
unsignedintProportion;//比例常数
unsignedintIntegral;//积分常数
unsignedintDerivative;//微分常数
unsignedintTError;//温度误差
unsignedintTDerror;//温度误差的误差
unsignedintTout;//温度输出值
/*******************************************************************************
*函数名:
PIDInit()
*函数功能 :
PID参数初始化
*输入:
无
*输出:
无
*******************************************************************************/
voidPIDInit(void)
{
realtemp=rin;
TError=0;
TDerror=0;
Proportion=1.2;//设置PID参数
Integral=0.005;
Derivative=33;
Tout=0;//设置PID定点SetPIDSetpoint
}
/*******************************************************************************
*函数名:
PIDCalc()
*函数功能 :
PID计算
*输入:
rin:
实际温度
*输出:
Tout
*******************************************************************************/
unsignedintPIDCalc(unsignedintrin) //NextPoint=rin,监测到的温度
{
unsignedintddError,dError,Error;
realtemp=rin;
Error=set_temper-realtemp;//温度的偏差
dError=Error-TError;//温度偏差的偏差
ddError=dError-TDerror;//温度偏差的偏差的偏差
TError=Error;
TDerror=dError;
Tout=Tout+(Proportion*dError+Integral*Error+Derivative*ddError);
if(Tout>max_temp-1)
Tout=max_temp;
if(Tout<0)
Tout=0;
return(Tout);
}
/*******************************************************************************
*函数名:
delay()
*函数功能 :
短延时函数
*输入:
i
*输出:
无
*******************************************************************************/
voiddelay(uchari)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voiddsreset(void)//发送初始化及复位信号
{
uinti; //DS18B20初始化
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bittmpreadbit(void)//readabit 读一位
{
uinti;
bitdat;
DS=0;i++;//i++fordelay 小延时一下
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
uchartmpread(void)//readabytedate读一个字节
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat); //将一个字节数据返回
}
voidtmpwritebyte(uchardat)//写一个字节到DS18B20里
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//write1 写1部分
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;//write0 写0部分
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
voidtmpchange()//DS18B20beginchange 发送温度转换命令
{
dsreset(); //初始化DS18B20
delay
(2); //延时
tmpwritebyte(0xcc);//跳过序列号命令
tmpwritebyte(0x44);//发送温度转换命令
}
/*******************************************************************************
*函数名:
tmp()
*函数功能 :
返回温度函数
*输入:
无
*输出:
temp:
当前温度
*******************************************************************************/
uinttmp()//getthetemperature获得温度
{
floattt;
uchara,b;
dsreset();
delay
(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);//发送读取数据命令
a=tmpread(); //连续读两个字节数据
b=tmpread();
temp=b;
temp<<=8;//twobytecomposeaintvariable
temp=temp|a; //两字节合成一个整型变量。
tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。
temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
returntemp; //返回温度值
}
/*******************************************************************************
*函数名:
display()
*函数功能 :
数码管显示
*输入:
num:
设置温度,temp:
实际温度
*输出:
无
*******************************************************************************/
voiddisplay(unsignedintnum,unsignedinttemp)//num和temp都是一个三位数,如392,则实际温度为39.2度
{
unsignedintA1,A2,A3,A2t;
unsignedintB1,B2,B3,B2t;
A1=num/100;
A2t=num%100;
A2=A2t/10;
A3=A2t%10;
B1=temp/100;
B2t=temp%100;
B2=B2t/10;
B3=B2t%10;
/*************************///温度显示
dula=0;
P0=table[B1]; //显示十位
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
delay
(1);
dul
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 PID 控制 算法 电阻 加热炉 温度 控制系统 设计 本科 毕业设计 论文