《计算机温度控制系统课程设计.doc》由会员分享,可在线阅读,更多相关《计算机温度控制系统课程设计.doc(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、如有侵权,请联系网站删除,仅供学习与交流计算机温度控制系统课程设计【精品文档】第 20 页目录摘要温度控制是工业生产过程中经常遇到的过程控制,有些工艺过程对其温度的控制效果直接影响着产品的质量,因而设计一种较为理想的温度控制系统是非常有价值的。本设计介绍了以AD590集成温度传感器为采集器、AT89C51为控制器、ADC0809为A/D转换器对温度进行智能控制的温度控制系统。其主要过程如下:利用传感器对将非电量信号转化成电信号,转换后的电信号再入A/D转换成数字量,传递给单片机进行数据处理,并向外围设备发出控制信号。论文首先介绍了单片机控制系统的整体方案设计及原理,然后具体介绍了控制系统的温度
2、传感器部分、A/D转换部分、控制器89C51部分以及数码管显示和键盘控制部分,接着相信介绍了温度控制系统各个单元电路的设计,最后阐述了温度控制系统软件设计的主程序和各个子程序。关键字:单片机89C51 温度传感器 A/D转换器 温度控制计算机温度测控系统1.设计目的设计制作和调试一个由工业控制机控制的温度测控系统。通过这个过程学习温度的采样方法,A/D变换方法以及数字滤波的方法。通过实践过程掌握温度的几种控制方法,了解利用计算机进行自动控制的系统结构。2.设计要求和设计指标1、每组45同学,每个小组根据设计室提供的设备及设计要求,设计出实际电路组成一个完整的计算机温度测控系统。 2、根据设备情
3、况以及被控对象,选择12种合适的控制算法, 框图和源程序,并进行实际操作和调试通过。编制程序温度指标:6080之间任选;偏差:1。3. 总体方案设计 本系统主要由数据采集、信号放大、模数转换等模块构成。设计思想是通过温度传感器将温度信号转变为电流(电压)信号,但我们要知道经温度变化引起电流(电压)信号的改变是非常小的,此时如果被模数转换器采集的话效果是非常不明显的,因此我们将其通过一个信号放大模块进行放大。再通过模数转换器后送入单片机AT89C51,而单片机通过PID算法控制烘箱的电炉加热,并且使数码管显示实时温度,从而实现温度的高精度控制。4.硬件选择以及相关电路设计 4.1温度传感器的选择
4、 传感器的选取目前市场上温度传感器繁多就此我们提出了以下三种选取方案:方案一:选用铂电阻温度传感器,此类温度传感器在各方面特性都比较优秀,但其成本较高。方案二:采用热敏电阻,选用此类元器件有价格便宜的优点,但由于热敏电阻的非线性特性会影响系统的精度。方案三:选用美国Analog Devices 公司生产的二端集成电流传感器AD590,此器件具有体积小、质量轻、线形度好、性能稳定等优点。其测量范围在-50-+150,满刻度范围误差为0.3,当电源电压在510V之间,稳定度为1时,误差只有0.01,其各方面特性都满足此系统的设计要求。比较以上三种方案,方案三具有明显的优点,因此此次设计选用方案三。
5、图4-1 温度采集电路 选用温度传感器AD590,AD590具有较高精度和重复性(重复性优于0.1,其良好的非线形可以保证优于0.1的测量精度,利用其重复性较好的特点,通过非线形补偿,可以达到0.1测量精度)。超低温漂移高精度运算放大器OP-07将“温度-电压”信号放大。便于A/D进行转换,以提高温度采集电路的可靠性。集成温度传感器的输出形式分为电压输出和电流输出两种。电压输出型的灵敏度一般为10mV/K,温度0时输出为0,温度25时输出为2.982V。电流输出型的灵敏度为1A/K。这样便于A/D转换器采集数据。4.2 模数转换器ADC0809是M美国国家半导体公司生产的CMOS工艺8通道,8
6、位逐次逼近式A/D转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换,其转换时间为100s左右。是目前国内应用最广泛的8位通用A/D芯片。图4-2 ADC0809引脚图4.2.1ADC0809内部结构图中多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用一个A/D转换器进行转换,这是一种经济的多路数据采集方法。地址锁存与译码电路完成对A、B、C 3个地址位进行锁存和译码,其译码输出用于通道选择,其转换结果通过三态输出锁存器存放、输出,因此可以直接与系统数据总线相连,表4-1为通道选择表。 图4-3 ADC0809内部结构图表
7、4-1通道选择表4.2.2信号引脚ADC0809的内部结构和外部引脚分别如图4-3和图4-2所示。内部各部分的作用和工作原理在内部结构图中已一目了然,在此就不再赘述,下面仅对各引脚定义分述如下: (1)IN0IN78路模拟输入,通过3根地址译码线ADDA、ADDB、ADDC来选通一路。(2)D7D0A/D转换后的数据输出端,为三态可控输出,故可直接和微处理器数据线连接。8位排列顺序是D7为最高位,D0为最低位。(3)ADDA、ADDB、ADDC模拟通道选择地址信号,ADDA为低位,ADDC为高位。地址信号与选中通道对应关系如表4-1所示。(4)VR(+)、VR(-)正、负参考电压输入端,用于提
8、供片内DAC电阻网络的基准电压。在单极性输入时,VR(+)=5V,VR(-)=0V;双极性输入时,VR(+)、VR(-)分别接正、负极性的参考电压。(5)ALE地址锁存允许信号,高电平有效。当此信号有效时,A、B、C三位地址信号被锁存,译码选通对应模拟通道。在使用时,该信号常和START 信号连在一起,以便同时锁存通道地址和启动A/D转换。(6) STARTA/D转换启动信号,正脉冲有效。加于该端的脉冲的上升沿使逐次逼近寄存止,重新从头开始转换器清零,下降沿开始A/D转换。如正在进行转换时又接到新的启动脉冲,则原来的转换进程被中。 (7)EOC转换结束信号,高电平有效。该信号在A/D转换过程中
9、为低电平,其余时间为高电平。该信号可作为被CPU查询的状态信号,也可作为对CPU的中断请求信号。在需要对某个模拟量不断采样、转换的情况下,EOC也可作为启动信号反馈接到START端,但在刚加电时需由外电路第一次启动。 (8)OE输出允许信号,高电平有效。当微处理器送出该信号时,ADC0808/0809的输出三态门被打开,使转换结果通过数据总线被读走。在中断工作方式下,该信号往往是CPU发出的中断请求响应信号。4.2.3工作时序与使用说明图4-4 ADC0809工作时序图 用单片机控制ADC时,多数采用查询和中断控制两种方式。查询法是在单片机把启动命令送到ADC之后,执行别的程序,同时对ADC的
10、状态进行查询,以检查ADC变换是否已经完成,如查询到变换已结束,则读入转换完毕的数据。中断控制是在启动信号送到ADC之后,单片机执行别的程序。当ADC转换结束并向单片机发出中断请求信号时,单片机响应此中断请求,进入中断服务程序,读入转换数据,并进行必要的数据处理,然后返回到原程序。这种方法单片机无需进行转换时间管理,CPU效率高,所以特别适合于变换时间较长的ADC。本设计采用查询方式进行数据收集。由于ADC0809片内无时钟,故运用8051提供的地址锁存使能信号ALE经D触发器二分频后获得时钟。因为ALE信号的频率是单片机时钟频率的1/6,如果时钟频率为6MHz,则ALE信号的频率为1MHz,
11、经二分频后为500kHz,与AD0809时钟频率的典型值吻合。由于AD0809具有三态输出锁存器,故其数据输出引角可直接与单片机的总线相连。地址码引脚ADDAC分别与地址总线的低3位A0、A1、A2相连,以选通IN0IN7中的一个通道。采用单片机的P2.7(地址总线最高位A15)作为A/D的片选信号。并将A/D的ALE和START脚连在一起,以实现在锁存通道地址的同时启动ADC0809转换。启动信号由单片机的写信号和P2.7经或非门而产生。在读取转换结果时,用单片机的读信号和P2.7经或非门加工得到的正脉冲作为OE信号去打开三态输出锁存器。编写的软件按下列顺序动作:令P2.7=A15=0,并用
12、A0、A1、A2的组合指定模拟通道的地址;执行一条输出指令,启动A/D转换;然后根据所选用的是查询、中断、等待延时三种方式之一的条件去执行一条输入指令,读取A/D转换结果。ADC0809是一个8路8位逐次逼近的A/D转换器。AD0809的转换时间为100s。在CPU启动A/D命令后,便执行一个固定的延时程序,延时时间应略大于A/D的转换时间;延时程序一结束,便执行数据读入指令,读取转换结果。我们只用了其一路AD转换,参考电压2.56V,即一位数字量对应10mV即1。所以用起来很方便。ADC0809是带有8路模拟开关的8位A/D转换芯片,所以它可有8个模拟量的输入端,由芯片的A,B,C三个引脚来
13、选择模拟通道中的一个。A,B,C三端分别与AT89C51的P0.0P0.2相接。地址锁存信号(ALE)和启动转换信号(START),由P2.6和/WR或非得到。输出允许,由P2.6和/RD或非得到。时钟信号,可有89C51的ALE输出得到,不过当采用12M晶振时,应该先进行二分频,以满足ADC0809的时钟信号必须小于640K的要求。4.3控制器89C51AT89C51是美国ATMEL公司生产的低电压 ,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的Flash只读程序存储器和128 bytes的随机存取数据存储器(RAM ),器件采用ATMEL公司的高密度、非易失性存储技术生
14、产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。AT89C51单片机的主要特性:(1)与MCS-51 兼容,4K字节可编程闪烁存储器;(2)灵活的在线系统编程,掉电标识和快速编程特性;(3)寿命为1000次写/擦周期,数据保留时间可10年以上;(4)全静态工作模式:0Hz-33Hz;(5)三级程序存储器锁定;(6)128*8位内部RAM,32可编程I/O线;(7)两个16位定时器/计数器,6个中断源;(8)全双工串行UART通道,低功耗的闲置和掉电模式; (9)片内
15、振荡器和时钟电路;图4-5 AT89C51结构图4.4数码管显示电路4.4.1 LED数码管的组成 LED数码管显示器是由发光二极管显示字段的显示器件,也称为数码管。其结构如图4-6所示。它由8个发光二极管构成,通过不同的组合可用来显示0-9、A-F及小数点“.”等字符。数码管有共阴极和共阳极两种结构规格,电阻为外接。共阴极数码管的发光二极管阴极共地,当某发光二极管的阳极为高电平时,二极管点亮;共阳极数码管的发光二极管是阳极,并接高电平,对于需点亮的发光二极管将其阴极接低电平即可。图4-6 LED数码管显示图4.4.2数码管显示方式(1) 静态显示方式 直接利用并行口输出。LED显示工作于静态
16、显示方式时,各位的共阴极连接在一起接地;每位的段选线分别于一个8位的锁存输出相连。一般称之为静态显示,是由于显示器中的各位相互独立。而且各位的显示字符一经确定,相应锁存器的输出将维持不变,直到显示另一个字符为止。本实验采用串入并出的静态显示方式。利用通信号串行输出。在实际应用中,多位LED显示时,为了简化电路,在系统不需要通信功能时,经常采用串行通信口工作方式0,外接移位寄存器74LS164来实现静态显示。(2) 动态显示方式对多位LED显示器的动态显示,通常都时采用动态扫描的方法进行显示,即逐个循环点亮各位显示器。这样虽然在任一时刻只有一位显示器被点亮,但是由于间隔时间较短,且人眼具有视觉残
17、留效应,看起来与全部显示器持续点亮一样。为了实现LED显示器的动态扫描,除了要给显示器提供的输入之外,还要对显示器加位选择控制,这就是通常所说的段控和位控。因此多位LED显示器接口电路需要有两个输出口,其中一个用于输出8位控信号;另一个用于输出段控信号,其连接图如图4-7所示。图4-7 数码管显示电路表4-2 七段LED段选码表显示字符共阴极段显示字符共阴极段03FHC39H106HD5EH25BHE79H34FHF71H466HP73H56DHU3EH67DH31H707Hy6EH87FH8.FFH96FH“灭”00HA77H/B7CH/5.PID控制算法在工程实际中,应用最为广泛的调节器控
18、制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它 以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的 其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或 不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例、 积分、微分计算出控制量进行控制的。 比例控制 比例控制是一
19、种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差。 积分控制 在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的 或简称有差系统。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积 分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分控制器,可以使系统在进入稳态后无稳 态误差。 微分控制 在微分控制中,控制器的输出与输入误差信号的微
20、分(即误差的变化率)成正比关系。 自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后组件,具有抑制误差的作用, 其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入 “比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能 够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分制器能改善系统在 调节过程
21、中的动态特性。6. 各子程序设计及流程图6.1 PID控制程序流程图取给定值取温度测量值计算偏差Y偏差为零否?N控制输出量不变计算控制输出量求微分分量求积分分量求比例分量6.2 A/D转换程序流程图开始选择通道,允许A/D转换读寄存器转换是否结束NY读取转换值数据处理6.3 显示程序流程图开始取出要显示的数求下一位选码送位段码到输出延时修改显示缓冲区4位数据显示完 返回6.4温度控制总程序流程图调降温处理子程序超过设定值低于设定值调用升温处理子程序测量值设定值相比较调用执行PID程序计算温度的偏差值读键盘处理子程序输入设定值A/D转换后显示当前温度读测量温度子程序系统各模块初始化开始NY心得体
22、会作为一名自动化专业的大三学生,我觉得做计算机控制系统课程设计是很有意义的,而且也是必要的。个星期很快就过去了,计算机控制技术课程设计也告一段落。本次课程设计,我的题目是计算机温度控制系统。温度控制是工业生产过程中经常遇到的过程控制,有些工艺过程对其温度的控制效果直接影响着产品的质量,因而设计一种较为理想的温度控制系统是非常有价值的,也是十分有必要的。其次,在这次课程设计中,我们运用了以前学过的专业课知识,如:Proteus绘图仿真、C语言、模拟和数字电路知识等。虽然以前在上课的时候学的都不是很好,很多知识都学习的模棱两可,可是如果你怀着一种目的性去学习它,你就会发现学习的效率非常高,以前看了
23、都头痛的东西在你现在一定要用的时候再拿出来学习,会感觉其实也很简单的。这是我做这次课程设计的又一收获。最后,要做好一个课程设计,就必须做到:在做设计之前,一定要对我们的对象有充分的了解,对所要用到的东西有深刻的认识,是指系统化、模块化,必须有一个清晰的思路。在设计程序时,不能妄想一次将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,这样为资料的保留和交流提供了方便;在设计中遇到的问题要记录,以免下次遇到同样的问题。总的来说,此次课程设计的过程比较轻松,从拿到问题到彻底解决问题,这是一个令人振奋并享受的过程。经过去图书馆大量的查阅书籍,我也学到了很多在课本上没有的
24、知识,收获颇丰。这段过程让我懂得了一个道理,那就是学生要学的绝对不该仅仅是课本上的东西,有些东西只有走进图书馆,你才可能学习到。也只有这样,我们才能成为一个见多识广、渊博的人。参考文献1. 于海生等编著微型计算机控制技术M北京:机械工业出版社,2007.2.邴志刚等编著.计算机控制:基础技术工具实例M.北京:清华大学出版社, 2005.3. 邹伯敏主编.自动控制原理(第二版) M. 北京:机械工业出版社,2002.4. 吕震中,刘吉臻,王志明编.计算机控制技术与系统(第二版)M,北京:中国电力出版社,2005.5.张宇河主编.计算机控制系统M.北京:北京理工大学出版社, 2002.6.冯勇编,
25、现代计算机控制系统M.哈尔滨:哈尔滨工业大学出版社,20037.karl J.Astrom,Bjorn Wittenmark著.计算机控制系统理论与设计:英文版M.北京:清华大学出版社,2002.8.Morris Driels著.线性控制系统工程(英文影印版)M.北京:清华大学出版社,2000.9.John J.Dazzo & Constantine H.Houpis著.线性控制系统分析与设计(第4版)M.北京:清华大学出版社,2000.10.韩建国. Foundation and application of microcontroller .北京:高等教育出版社.2004.10附录1:温度
26、控制系统总电路图附录2:温度控制系统程序清单(1)主函数如下:#include #include #includeKEYSCAN.H#includePID.Hvoid PIDBEGIN(void); / PID参数初始化/ void main() unsigned char key1=0,i,k; unsigned int tmp; unsigned char shu3=13,13,0; unsigned char counter=0; PIDBEGIN(); while(1) if(counter- = 0)tmp = ReadTemperature(); counter = 20; vie
27、w(tmp); /温度显示;compare_temper(); (2) PID算法温度控制程序#ifndef _PID_H_#define _PID_H_#include #include #include struct PID unsigned int SetPoint; / 设定目标 Desired Value unsigned int Proportion; / 比例常数 Proportional Const unsigned int Integral; / 积分常数 Integral Const unsigned int Derivative; / 微分常数 Derivative Co
28、nst unsigned int LastError; / Error-1 unsigned int PrevError; / Error-2 unsigned int SumError; / Sums of Errors struct PID spid; / PID Control Structure unsigned int rout; / PID Response (Output) unsigned int rin; / PID Feedback (Input) sbit output=P34; unsigned char high_time,low_time,count=0;/占空比调
29、节参数 unsigned char set_temper=33; void PIDInit (struct PID *pp) memset ( pp,0,sizeof(struct PID); unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) unsigned int dError,Error; Error = pp-SetPoint - NextPoint; / 偏差 pp-SumError += Error; / 积分 dError = pp-LastError - pp-PrevError; / 当前微分 pp-
30、PrevError = pp-LastError; pp-LastError = Error; return (pp-Proportion * Error/比例 + pp-Integral * pp-SumError /积分项 + pp-Derivative * dError); / 微分项 温度比较处理子程序 compare_temper() unsigned char i; /EA=0;if(set_tempertemper) if(set_temper-temper1) high_time=100; low_time=0; else for(i=0;i10;i+) get_temper(
31、); rin = s; / Read Input rout = PIDCalc ( &spid,rin ); / Perform PID Interation if (high_time=100) high_time=(unsigned char)(rout/800); else high_time=100; low_time= (100-high_time); else if(set_temper0) high_time=0; low_time=100; else for(i=0;i10;i+) get_temper(); rin = s; / Read Input rout = PIDCa
32、lc ( &spid,rin ); / Perform PID Interation if (high_time100) high_time=(unsigned char)(rout/10000); else high_time=0; low_time= (100-high_time);/EA=1; T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期 void serve_T0() interrupt 1 using 1 if(+count=(high_time) output=1; else if(count=100) output=0; else count=0; TH
33、0=0x2f; TL0=0xe0; void PIDBEGIN() TMOD=0x01; TH0=0x2f; TL0=0x40; EA=1; ET0=1; TR0=1; high_time=50; low_time=50; PIDInit ( &spid ); / Initialize Structure spid.Proportion = 10; / Set PID Coefficients spid.Integral = 8; spid.Derivative =6; spid.SetPoint = 100; / Set PID Setpoint #endif(3)ADC0809转换子程序#
34、define uchar unsigned char#define uint unsigned int#define IN0 XBYTE0x7ff8 /*设置ADC0809的通道0地址*/sbit ad_busy=P33; /*即EOC状态*/uint overflow_count = 0; /*T1中断次数初值*/ void ad0809(uchar xdata * x) /*采样函数,结果x放外部数据存储器*/ uchar i; uchar idata * ad_adr; ad_adr=&IN0; for(i=0;i8;i+) /*处理8通道*/ *ad_adr=0; /*启动转换*/ i
35、=i; /*延时等待EOC变低*/ i=i; while(ad_busy=0); /*查询等待转换结束*/ xi=*ad_adr; /*存转换结果*/ *(*(p+j)+i)=xi; ad_adr+; /*下一通道*/* 定时器1中断服务程序;每100ms执行一次,fosc=6MHz*/void timer1_ISR(void) interrupt 3 TH1 = (65536 50000)/256; /定时器1赋初值 TL1 = (65536 50000)%256; / 100ms/1us=50000次计数 overflow_count+;void main(void) static cha
36、r xdata ad10; char (*p)8; TMOD = 0X10; /设置定时器1工作方式1, TH1 = (65536 50000)/256; /定时器1赋初值 TL1 = (65536 50000)%256; EA = 1; /开定时器1中断 ET1 = 1; TR1 = 1; /启动定时器1 uchar j;for(j=0;j144;j+) / *采样24h*/ if ( overflow_count = 6000) /*10分钟到,采样ADC0809通道的值*/ uchar i,(*p)8; uchar idata * ad_adr; ad_adr=&IN0; for(i=0
37、;i8;i+) /*处理8通道*/ *ad_adr=0; /*启动转换*/ i=i; /*延时等待EOC变低*/ i=i; while(ad_busy=0); /*查询等待转换结束*/ xi=*ad_adr; /*存转换结果*/ ad_adr+; for(i=0;i8;i+) *(*(p+j)+i)=xi(4) 数码管显示程序unsigned char code DUAN_TABLE=0X3F, 0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x77,0x7C,0x39,0x5E,0x79,0x71; /段码 void Delay(unsigned char n) /延时0.1*n毫秒 0 unsigned char i; do for(i=0;i23;i+) while(n-); main() while(1) P1=0xfe; /位码左边第1个 P0=DUAN_TABLE1;Delay(20); /显示1 P1=0xfd; /位码左边第2个 P0=DUAN_TABLE2;Delay(20); /显示2 /位码左边第3个 P1=0xfb; P0=DUAN_TABLE3;Delay(20); /显示3 P1=0xf7; /位码左边第4个 P0=DUAN_TABLE4;Delay(20); /显示4