计算机温度测控系统实践报告.docx
《计算机温度测控系统实践报告.docx》由会员分享,可在线阅读,更多相关《计算机温度测控系统实践报告.docx(18页珍藏版)》请在冰豆网上搜索。
计算机温度测控系统实践报告
课程设计报告
课程名称计算机控制技术
题目名称_计算机温度测控系统
学生学院自动化学院
专业班级自动化
学号
学生姓名
任课教师李传芳_
同组同学
2011年6月24日
目录
一、实验目的---------------------------------2
二、预习与参考-------------------------------2
三、实验(设计)的要求与数据-------------------2
四、实验(设计)仪器设备和材料清单--------------2
五、实验过程---------------------------------2
(一)硬件的连接---------------------------------2
(二)软件的设计---------------------------------3
(三)测试--------------------------------12
(四)实验数据--------------------------------14
六、实验过程遇到问题与解决--------------------14
七、实验心得--------------------------------15
八、参考资料-------------------------------15
一、实验目的
设计制作和调试一个由工业控制机控制的温度测控系统。
通过这个过程学习温度的采样方法,A/D变换方法以及数字滤波的方法。
通过时间过程掌握温度的几种控制方式,了解利用计算机进行自动控制的系统结构。
二、预习与参考
C语言、计算机控制技术、自动控制原理
三、实验(设计)的要求与数据
温度控制指标:
60~80℃之间任选;偏差:
1℃。
1.每组4~5同学,每个小组根据实验室提供的设备及设计要求,设计并制作出实际电路组成一个完整的计算机温度控制测控系统。
2.根据设备情况以及被控对象,选择1~2种合适的控制算法,编制程序框图和源程序,并进行实际操作和调试通过。
四、实验(设计)仪器设备和材料清单
工业控制机、烘箱、温度变送器、直流电源、万用表、温度计等
五、实验过程
(一).硬件的连接
图1硬件接线图
1.按上述接线图接线。
2.为了使温度变动不大,把烘箱的地线与直流电源的地线相连。
3.为了更好的测到烘箱的温度,把温度计的检测点与温度变送器捆绑在一起。
4.用万用表测试电磁继电器两端的电压,室温时应该差不多在1.5v左右,若不是,适当调整变阻器的阻值。
最后,我们把35摄氏度时电磁继电器两端的电压调到2.51V.
(二).软件的设计
1.控制算法的选择:
趋近控制:
基本思想是把控制分为许多个区间,在各个区间加不同的加热时间或者吹风时间,越接近设定值就分得越细。
2.实际温度与数字量的转换
a.用公式HL=H*256+L-2048,其中HL为速度变送器送回的完整的12位数,H为高位,L为低位。
b.通过测试,取得以下列表,温度与变换后的数字量的比较如下表。
(每次都降到室温才重新开始通过加热棒升温,测试三组,并取其平均值。
35
40
45
50
55
60
65
70
75
80
85
980
1024
1068
1109
1156
1198
1245
1286
1240
1350
1400
上述测试所用的源程序如下:
#include
#include
intmain(void)
{
intd1=0,d2=0;
outportb(0x030a,0x00);
outportb(0x0309,0x00);
outportb(0x030d,0x00);
do{
delay(5000);
delay(5000);
delay(5000);
delay(5000);
outportb(0x030c,0xff);
delay(5000);
delay(5000);
delay(5000);
delay(5000);
d1=inportb(0x0305);
d2=inportb(0x0304);
d1=d1*256+d2-2048;
printf("\nval%d",d1);
}while
(1);
}
c.通过统计与推算,温度与数字量的转换关系基本可以用以下两公式进行正反转换。
settem=settem*9.35+630b=(HL-530)/9.35
3.程序思路图
图2思路图
4.程序
#include
#include
#include
voidinitgr(void)/*BGI初始化*/
{
intgd=VGA,gm=VGAHI;
initgraph(&gd,&gm,"d:
\\turboc2");
}
voidwangge(void)/*画图纸*/
{inti,j;
charbuffer[10];
setcolor(RED);
line(40,50,40,440);
line(40,440,650,440);
settextjustify(CENTER_TEXT,CENTER_TEXT);
j=440;
setcolor(WHITE);
for(i=0;i<90;i+=5)/*写坐标尺寸*/
{line(35,j,40,j);
itoa(i,buffer,10);
outtextxy(10,j,buffer);
j=j-20;
}
setcolor(BLUE);
for(i=420;i>70;i-=20)/*画竖网格线*/
{line(40,i,650,i);
}
for(i=60;i<650;i+=20)/*画横网格线*/
{line(i,70,i,440);
}
}
voidInitdevice()
{outportb(0x030d,0x00);
outportb(0x030a,0x00);
outportb(0x0309,0x00);
}
voidbdelay(inti)
{for(i;i>=0;i--)
{
delay(1000);}
}
main()
{intH=60,L=0,m,HL=0,settem,temph,templ,k,xy,y,g=0,x=0,a=0;
charc,buffer[10];
floatb,n=40;
time_tstart,runtime;
initgr();
AA:
gotoxy(12,15);
printf("pleaseinputthetemperture:
");/*设定要保持的温度*/
scanf("%d",&settem);
cleardevice();
wangge();
setcolor(YELLOW);
line(40,440-settem*4,650,440-settem*4);
Initdevice();
settem=settem*9.35+530;
time(&start);
gotoxy(5,25);
printf("\n\n\n\nStarttime:
%s",ctime(&start));/*开始时间*/
while
(1)
{
delay(1000);
H=0;
L=0;
for(k=0;k<4;k++)
{outportb(0x030c,0xff);
delay(1000);
temph=inportb(0x0305);
H=H+temph;/*采样*/
templ=inportb(0x0304);
L=L+templ;
}
H=(int)H/4;
L=(int)L/4;
HL=H*256+L-2048;
y=x;
x=HL;
xy=x-y;
itoa(HL,buffer,10);
outtextxy(150,50,"Currenttemperitureis:
");/*当前温度*/
gotoxy(32,4);
b=(HL-530)/9.35;
m=b;
printf("%2.2f%d",b,HL);
time(&runtime);
printf("\tcurrentime:
%s",ctime(&runtime));/*当前时间*/
putpixel(n,440-b*4,15);
n=n+0.8;
if(n>=640)
{cleardevice();
wangge();
gotoxy(5,25);/*满640点后清屏*/
printf("\n\n\n\nStarttime:
%s",ctime(&start));
n=40;
}
/*升温、温度保持、受干扰后恢复的控制*/
/*全速加温阶段*/
if(HL{outportb(0x030d,0x01);
bdelay(3000);
}
/*对不同温度段,实施不同的加热和吹风时间,使温度上升下降不会太过剧烈*/
elseif(a==1&&HL<=(settem-28))
{
outportb(0x030d,0x01);
bdelay(4000);
if(HL>=(settem-20))
a=0;
}
elseif(HL>settem+18)
{outportb(0x030d,0x02);
bdelay(4000);
outportb(0x030d,0x00);
bdelay(4000);
}
elseif(HL>settem+15&&HL<=settem+18)
{if(xy>0)
{outportb(0x030d,0x02);
bdelay(2500);
outportb(0x030d,0x00);
bdelay(2000);
}
else
{outportb(0x030d,0x02);
bdelay(1000);
outportb(0x030d,0x00);
bdelay(500);}
}
elseif(HL>(settem+10)&&HL<=(settem+15))
{if(xy>0)
{
outportb(0x030d,0x02);
if(a==0)
{bdelay(1000);
outportb(0x030d,0x00);
bdelay(2000);
a=1;
}
else
bdelay(1500);
outportb(0x030d,0x00);
bdelay(1000);}
else
{outportb(0x030d,0x02);
bdelay(1000);
outportb(0x030d,0x00);
bdelay(2000);}
}
elseif(HL>(settem+5)&&HL<=settem+10)
{if(xy>0)
{
outportb(0x030d,0x02);
bdelay(500);
outportb(0x030d,0x00);
bdelay(1000);
}
else
{outportb(0x030d,0x02);
bdelay(500);
outportb(0x030d,0x00);
bdelay(2000);}
}
elseif(HL>(settem+1)&&HL<=settem+5)
{
if(xy>0)
{
outportb(0x030d,0x02);
bdelay(200);
outportb(0x030d,0x00);
bdelay(1000);
}
}
elseif(HL>=(settem-30)&&HL<(settem-15))
{
if(xy>=0)
{
if(a==1)
outportb(0x030d,0x01);
else
outportb(0x030d,0x00);
bdelay(2000);
}
else
{outportb(0x030d,0x01);
bdelay(4000);
outportb(0x030d,0x00);
bdelay(2000);}
}
elseif(HL>=(settem-15)&&HL<(settem-10))
{if(xy>=0)
{
if(a==0)
{outportb(0x030d,0x02);
bdelay(1000);
outportb(0x030d,0x00);
bdelay(1000);
}
else
{
outportb(0x030d,0x00);
bdelay(2000);}
}
else
{outportb(0x030d,0x01);
bdelay(2000);
outportb(0x030d,0x00);
bdelay(2000);
}
}
elseif(HL>=(settem-10)&&HL<(settem-8))
{if(xy>=0)
{
if(a==0)
{outportb(0x030d,0x02);
bdelay(5000);
}
else
{outportb(0x030d,0x02);
bdelay(1000);
}
}
else
{outportb(0x030d,0x01);
bdelay(2000);
outportb(0x030d,0x00);
bdelay(2000);
}
}
elseif(HL>=(settem-8)&&HL<(settem-7))
{if(xy>=0)
{
outportb(0x030d,0x02);
if(a==0)
{outportb(0x030d,0x02);
bdelay(5000);
}
else
{bdelay(500);
outportb(0x030d,0x00);
bdelay(1000);
}
}
else
{
if(a==1)
{outportb(0x030d,0x01);
bdelay(1000);
outportb(0x030d,0x00);
bdelay(1000);
}
else
{bdelay(600);
outportb(0x030d,0x00);
bdelay(2000);
}
}
}
elseif(HL>=(settem-7)&&HL<(settem-4))
{if(xy>=0)
{outportb(0x030d,0x00);
bdelay(2000);
}
else
{outportb(0x030d,0x01);
bdelay(400);
outportb(0x030d,0x00);
bdelay(2000);}
}
elseif(HL>=(settem-2)&&HL<(settem))
{if(xy>=0)
{outportb(0x030d,0x00);
bdelay(2000);
}
else
{outportb(0x030d,0x01);
bdelay(600);
outportb(0x030d,0x00);
bdelay(2000);}
}
elseif(HL>(settem-80)&&HL<=(settem-30))
{if(xy>=0)
{outportb(0x030d,0x00);
bdelay(4000);
}
else
{outportb(0x030d,0x01);
bdelay(8000);
}
}
}
getch();
end:
getch();
return0;
}
(三).测试
1.升温测试
图3温度上升曲线
烘炉温度能在十分钟内从室温升到指定温度70摄氏度,并保持。
(具体数据在本报告下文会给出)
2.保温测试
图4温度保温曲线
烘炉温度能在指定温度保持超过30分钟。
曲线波动大原因是程序细调部分做得不够好,只能完成粗调,曲线也只能勉强满足要求。
(具体数据在本报告下文会给出)
3.干扰测试
图5干扰恢复曲线
干扰后能在8分钟后恢复。
(具体数据在本报告下文会给出)
(四).实验数据
时间
15∶12
15:
17
15:
22
15:
25
15:
30
15:
35
15:
40
15:
45
15:
50
15:
52
15:
56
显示
35.55
60.34
69.73
69.73
68.14
70.78
69.30
70
68.35
63.8
69
实际
34
72
68
67
67
68
69
66.7
69
57
71
注:
最后两列是干扰测试。
数据分析:
显示温度基本满足了偏差为1℃的基本要求,这说明程序满足控制要求,是一个合理的程序。
而实际温度差别比较大,最低温下降到66℃.最高温达到了73℃,造成这样的情况的原因有以下几个:
1.在推算转换公式时,有偏差,不能完全达到消除偏差的目的。
2.人为误差跟机器误差的存在。
六、实验过程遇到问题与解决
1.硬件方面:
刚开始温度计的测头没绑到测量棒上,离测量棒太远,导致显示温度与实测温度不一致。
取数据时无论调到哪个电阻值都无法取到相隔较大的值。
所以我们在取数据这部分花费了太多时间。
2.软件方面:
主要方面是由于加热跟抽风时间不妥,导致了保温时,出现了较大的误差。
虽然软件程序运行的数据在1℃。
范围内,但实际的温度的极限差值达到了8度。
通过修改吹风和加热的时间,偏差略有变小,但仍未能很完美的符合设计要求。
七、实验心得
此次课程设计可谓有喜有悲,当我们确定了用趋近控制算法,读懂了程序后,便开始动手试验。
我们大部分时间都花在前面的取数据环节,由于温度计测头没绑到测量棒上,导致了很大的测量偏差,一直在重复这个工作,最后经同学提醒,才改了过来。
程序调试部分我们算是做得比较快的。
因为看懂程序后,只要多试几次,根据实际情况调整延时时间就可以了。
可惜最后验收的时候还不是很完美,还可以再修改一下让系统的精度更小。
的确,课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此次课程设计,至今我仍感慨颇多,的确,从读题到设计,从理论到实践,在短短几天的日子里,不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
这次课程设计使我充分领略到将所学应用到实际中的无穷乐趣,极大地激发了我对这门课程的学习兴趣,在今后的学习中我除了认真掌握书本的理论知识,还会更加注重实践的重要性。
此外,很感激跟我同一组的同学,同时也很感激老师对我们的悉心教导和对我们的设计提出的宝贵的意见和建议!
八、参考文献
【1】谭浩强C语言程序设计.
【2】朱玉玺、崔如春、邝小磊编.计算机控制技术.电子工业出版社.
【3】孙炳达编.自动控制原理.机械工艺出版社.