温度控制实习报告姓名:杨成组员:王天雷班级:231142学号:20141003173专业:自动化指导老师:金星2017年8月一、温度控制实习概述1.1实验目的(1)了解并掌握单片机的硬件电路。硬件电路包括显示电路、电热杯温度检测以及显示电路、电热杯温度控制接口电路、串口通信电路扰动调节电路。(2)熟练使用C语言以及keil软件控制单片机。(3)学会并掌握一种或者多种温度控制的方法。(4)学会系统受到干扰后能快速控制并达到设定温度。1.2实验内容此次采用的WK-2温度控制仪是一个闭环反馈控制系统,由主控芯片直接读取温度传感器测得的温度值后直接与当前温度的设定值进行比较。根据PID计算的结果得到控制信号控制双向可控硅光耦进而控制电热杯的通电和断电操作。1.3实验算法介绍根据偏差的比例(P)、积分(I)、微分(D)进行控制简称PID控制。PID控制是控制系统中应用最为广泛的一种控制规律。目前工业自动化水平已成为衡量各行各业现代化水平的一个重要标志。同时,控制理论的发展也经历了古典控制理论、现代控制理论和智能控制理论三个阶段。自动控制系统可分为开环控制系统和闭环控制系统。一个控制系统包括控制器、传感器、变送器、执行机构、输入输出接口。控制器的输出经过输出接口、执行机构,加到被控系统上;控制系统的被控量,经过传感器,变送器,通过输入接口送到控制器。不同的控制系统,其传感器、变送器、执行机构是不一样的。比如压力控制系统要采用压力传感器,电加热控制系统的传感器是温度传感器。目前,PID控制及其控制器或智能PID控制器已经很多,产品已在工程实际中得到了广泛的应用,有各种各样的PID控制器产品,各大公司均开发了具有PID参数自整定功能的智能调节器(intelligentregulator),其中PID控制器参数的自动调整是通过智能化调整或自校正、自适应算法来实现。有利用PID控制实现的压力、温度、流量、液位控制器,能实现PID控制功能的可编程控制器(PLC),还有可实现PID控制的PC系统等等。可编程控制器(PLC)是利用其闭环控制模块来实现PID控制,而可编程控制器(PLC)可以直接与ControlNet相连,还有可以实现PID控制功能的控制器,它可以直接与ControlNet相连,利用网络来实现其远程控制功能。1.4实验预期效果(1)完成最高温度(60-80度)的稳定性实验,计算超调量和稳态误差;(2)自己设定升温曲线,升温速率可以为0.5-3℃/分钟,可以分阶段升温,如把30-80度的升温过程分成3个阶段,30-40,40-60,60-80,且在每个阶段有温度保持时间,如3分钟或更长;(3)编制信号采样程序,转换显示以及在数码管上时钟显示(秒表)。(4)达到设定温度稳定后加入扰动,控制加热算法,使其快速达到温度设定值。二、温度控制系统硬件介绍2.1温度检测单元WK-2温度检测传感器采用的是DALLAS公司的DS18B20,DS18B20是一种单总线数字温度传感器封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,测试温度范围-55℃-125℃,温度数据位可配置为9、10、11、12位,对应的刻度值分别为0.5℃、0.25℃、0.125℃、0.0625℃,对应的最长转换时间分别为93.75ms、187.5ms、375ms、750ms。出厂默认配置为12位数据,刻度值为0.0625℃,最长转换时间为750ms。从以上数据可以看出,DS18B20数据位越低、转换时间越短、反应越快、精度越低。单片机可以通过1-Wire协议与DS18B20进行通信,最终将温度读出。1-Wire总线的硬件接口很简单,只需要把DS18B20的数据引脚和单片机的一个IO口接上就可以了如图2-1。单总线,意味着没有时钟线,只有一根通信线。单总线读写数据是靠控制起始时间和采样时间来完成,所以时序要求严格,DS18B20通过编程,可以实现最高12位的温度存储值,在寄存器中,以补码的格式存储。如图2-2。图2-1温度采集电路图2-2DS18B20温度数据格式2.2温度控制单元通过单片机的P1.4和P1.3口发脉冲经过一个与非门来控制可控硅BCR12AM的导通角(脉冲宽度的调节),进而对水加热,以达到预期的温度。考虑到强点的干扰,可控硅BCR12AM控制的前级采用具有光电隔离且具有自同步功能的可控硅控制器件MOC3401来对可控硅进行控制。图2-3电热杯温度控制电路接口电路2.3温度显示单元为了显示温度等系统信息,WK-2提供了两个4位的LED数码管。利用P15、P16和P17三个引脚通过译码器选通位选,P0口为提供数码管的段选信号。其具体接线方式如图2-4。图2-4数码管电路2.4串口通信单元MAX232是由德州仪器公司(TI)推出的一款兼容RS232标准的芯片。该器件包含2个驱动器、2个接收器和一个电压发生器电路提供TIA/EIA-232-F电平。该器件符合TIA/EIA-232-F标准,每一个接收器将TIA/EIA-232-F电平转换成5-VTTL/CMOS电平。每一个发送器将TTL/CMOS电平转换成TIA/EIA-232-F电平。TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。图2-5串口通信电路三、温度控制系统软件介绍3.1程序总体框图图3-1程序总体框图3.2初始化程序3.2.1定时器0初始化/**********************************************************函数功能:初始化定时器0,定时时间设置为10ms=100us入口参数:无出口参数:无**********************************************************/voidint_timer0(void){TMOD=0x21;//定时器工作于方式1TH0=(65536-10000)/256;TL0=(65536-10000)%256;ETO=1;//定时器0中断允许TRO=1;//开始定时器0EA=1;//总中断允许}3.2.2串口初始化/**********************************************************函数功能:初始化串口,波特率设定入口参数:无出口参数:无**********************************************************/voidUART_Init(void){SCON=0x50;//串口工作方式为1(10位异步收发),串行允许接收。TMOD=0x21;//定时器1工作在方式2。TH1=0xfd;//波特率9600bpsfosc=11.0592MHz。TL1=0xfd;TL1=0xfd;//开串口中断。TR1=1;//允许定时器1工作。EA=1;//开总中断。}3.3温度读取函数/**************读取ds18b20当前温度************/unsignedchar*ReadTemperature(charTH,charTL,unsignedcharRS){unsignedchartt[2];Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作。WriteOneChar(0x4E);//写入写暂存器命令,修改TH和TL和分辩率配置寄存器。//先写TH,再写TL,最后写配置寄存器。WriteOneChar(TH);//写入想设定的温度报警上限。WriteOneChar(TL);//写入想设定的温度报警下限。WriteOneChar(RS);//写配置寄存器,格式为0R1R01,1111//R1R0=00分辨率娄9位,R1R0=11分辨率为12位delay_18B20(80);//thismessageisveryimportant.Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换delay_18B20(80);//thismessageisveryimportant.Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度。delay_18B20(80);tt[0]=ReadOneChar();//读取温度值低位tt[1]=ReadOneChar();//读取温度值高位return(tt);EA=1;}3.4温度数字分离函数/*********************************************************函数功能:数据转换程序。将18B20的两字节温度值根据转换精度转换为数码管显示的数据。[1],t[0]开始存的值是温度传感器里读出来的两个字节的温度值。其中12位是有效的,高5位为符号(正或负)。处理后将整数部分和小数部分分别存储在t[1],t[0]中。入口参数:无出口参数:无********************************************************/Voidcovert1(void)//将温度转换为数码管显示的数据{Unsignedintx=0x00;t[1]=4;//将高字节左移4位t[1]=t[1]&0x70;//取出高字节的3个有效数字位x=t[0];//将t[0]暂存到X,因为取小数部分还要用到它x=4;//右移4位x=x&0x0f;//和前面两句就是取出t[0]的高四位t[1]=t[1]|x;//将高低字节的有效值的整数部分拼成一个字节t[0]=t[0]&0x0f;//取有效的4位小数x=t[0];t[0]=dotcode[x];//查表换算成实际的小数TempBuffer1[1]=t[1]/100;//分离出百位if(TempBuffer1[1]==0)TempBuffer1[1]=0x00;//百位数消隐TempBuffer1[2]=(t[1]%100)/10;//分离出十位TempBuffer1[3]=(t[1]%100)%10;//分离出个位TempBuffer1[4]=t[0]/10;//分离出十分位TempBuffer1[5]=t[0]%10;//分离出百分位}3.5PID程序/*********************************************************函数功能:增量式PID入口参数:温度设定值Tem_set,实时温度值Tem_t出口参数:PID计算结果PID_Result********************************************************/floatPID(floatTem_set,floatTem_t){floaterror,last_error,last_error_1;floatPID_Result;error=Tem_set-Tem_t;if(error=0.5){PID_Result+=kp*(error-last_error)+ki*error+kd*(error-2*last_error+last_error_1);last_error_1=last_error;last_error=error;if(PID_Result=0)PID_Result=0;if(PID_Result100)PID_Result=100;}elsePID_Result=0;returnPID_Result;}3.6数码管显示函数/**********************************************************函数功能:数码管