一、前言能源问题已经是当前最为热门的话题,离开能源的日子,世界将失去一切颜色,人们将寸步难行,我们知道虽然电能是可再生能源,但是在今天还是有很多的电能是依靠火力,核电等一系列不可再生的自然资源所产生,一旦这些自然资源耗尽,我们将面临电能资源的巨大的缺口,因而本设计从开源节流的角度出发,节省电能,保护环境。
本设计任务和主要内容:设计并制作一个水温自动控制系统,控制对象为 1 升净水,容器为搪瓷或塑料器皿。
水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变。
本设计主要内容如下:(1)温度设定范围为:40~90℃,最小区分度为 1℃,标定温度≤1℃。
(2)环境温度降低时温度控制的静态误差≤1℃。
(3)用1602液晶显示水的实际温度。
(4)采用适当的控制方法,当设定温度突变(由40℃提高到60℃)时,减小系统的调节时间和超调量。
(5)温度控制的静态误差≤0.5℃。
二、系统方案1、温度传感器的选取目前市场上温度传感器较多,主要有以下几种方案:方案一:选用铂电阻温度传感器。
此类温度传感器线性度、稳定性等方面性能都很好,但其成本较高。
方案二:采用热敏电阻。
选用此类元器件有价格便宜的优点,但由于热敏电阻的非线性特性会影响系统的精度。
方案三:采用DS18B20温度传感器。
DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出远端引入。
此器件具有体积小、质量轻、线形度好、性能稳定等优点其各方面特性都满足此系统的设计要求。
比较以上三种方案,方案三具有明显的优点,因此选用方案三。
2、键盘显示部分控制与显示电路是反映电路性能、外观的最直观部分,所以此部分电路设计的好坏直接影响到电路的好坏。
方案一:采用可编程控制器8279与数码管及地址译码器74LS138组成,可编程/显示器件8279实现对按键的扫描、消除抖动、提供LED的显示信号,并对LED显示控制。
用8279和键盘组成的人机控制平台,能够方便的进行控制单片机的输出。
方案二:采用单片机AT89C52与4X4矩阵组成控制和扫描系统,并用89C52的P1口对键盘进行扫描,并用总线的方式在P0口接1602液晶来显示水温和设定值,这种方案既能很好的控制键盘及显示,又为主单片机大大的减少了程序的复杂性,而且具有体积小,价格便宜的特点。
对比两种方案可知,方案一虽然也能很好的实现电路的要求,但考虑到电路设计的成本和电路整体的性能,我们采用方案二。
3、控制电路部分方案一:采用8031芯片,其内部没有程序存储器,需要进行外部扩展,这给电路增加了复杂度。
方案二:采用2051芯片,其内部有2KB单元的程序存储器,不需外部扩展程序存储器。
但由于系统用到较多的I/O口,因此此芯片资源不够用。
方案三:采用AT89C52单片机,其内部有4KB单元的程序存储器,不需外部扩展程序存储器,而且它的I/O口也足够本次设计的要求。
比较这三种方案,综合考虑单片机的各部分资源,因此此次设计选用方案三。
4、PID过程控制部分①过程控制的基本概念过程控制――对生产过程的某一或某些物理参数进行的自动控制。
一、模拟控制系统图5-1-1 基本模拟反馈控制回路被控量的值由传感器或变送器来检测,这个值与给定值进行比较,得到偏差,模拟调节器依一定控制规律使操作变量变化,以使偏差趋近于零,其输出通过执行器作用于过程。
控制规律用对应的模拟硬件来实现,控制规律的修改需要更换模拟硬件。
三、微机过程系统控制图5-1-2 微机过程控制系统基本框图以微型计算机作为控制器。
控制规律的实现,是通过软件来完成的。
改变控制规律,只要改变相应的程序即可。
四、数字控制系统DDC图5-1-3 DDC 系统构成框图DDC(Direct Digital Congtrol)系统是计算机用于过程控制的最典型的一种系统。
微型计算机通过过程输入通道对一个或多个物理量进行检测,并根据确定的控制规律(算法)进行计算,通过输出通道直接去控制执行机构,使各被控量达到预定的要求。
由于计算机的决策直接作用于过程,故称为直接数字控制。
DDC 系统也是计算机在工业应用中最普遍的一种形式。
②模拟PID 控制系统组成图5-1-4 模拟PID 控制系统原理框图PID 调节器是一种线性调节器,它将给定值r(t)与实际输出值c(t)的偏差的比例(P)、积分(I)、微分(D)通过线性组合构成控制量,对控制对象进行控制。
1、PID 调节器的微分方程 ⎥⎦⎤⎢⎣⎡++=⎰t D I P dt t de T dt t e T t e K t u 0)()(1)()( 式中 )()()(t c t r t e -=2、PID 调节器的传输函数 ⎥⎦⎤⎢⎣⎡++==S T S T K S E S U S D D I P 11)()()( PID 调节器各校正环节的作用1、比例环节:即时成比例地反应控制系统的偏差信号e(t),偏差一旦产生,调节器立即产生控制作用以减小偏差。
2、积分环节:主要用于消除静差,提高系统的无差度。
积分作用的强弱取决于积分时间常数TI ,TI 越大,积分作用越弱,反之则越强。
3、微分环节:能反应偏差信号的变化趋势(变化速率),并能在偏差信号的值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。
③ 数字PID 控制器二、数字PID 控制器的差分方程[]000)()()()1()()()()(u n u n u n u u n e n e T T i e T T n e K n u D I P ni D I P +++=+⎭⎬⎫⎩⎨⎧--++=∑= 式中 )()(n e K n u P P = 称为比例项∑==ni I P I i e T T K n u 0)()( 称为积分项 [])1()()(--=n e n e TT K n u D PD 称为微分项 五、总体方案原理的理论分析1系统模块分为:DS18B20模块,1602液晶显示模块,继电器模块,键盘输入模块和声光报警模块,DS18B20可以被编程,所以箭头是双向的,CPU (89C52)首先写入命令给DS18B20,然后DS18B20开始转换数据,转换后通89C52来处理数据。
数据处理后的结果就显示到1602液晶上。
2系统模块总关系图本系统的执行方法是循环查询执行的,键盘扫描也是用循环查询的办法,由于本系统对实时性要求不是很高,所以没有用到中断方式来处理。
六、电路与程序设计1.继电器模块下图是一个蜂鸣器和一个继电器的图,我们只用到了继电器的图,继电器和单片机的P1.3口进行通讯。
2.液晶显示模块下图是1602液晶显示模块的图,按照总线来连接,1602数据口接单片机P0口。
3.89S51单片机最小系统模块89S51单片机最小系统模块如下,P0口接10K的上拉电阻以便与显示模块通讯。
4.键盘和DS18B20模块键盘和DS18B20模块如下,采用4X4矩阵键盘接单片机P1口,DS18B20模块对水温进行采样,并与单片机通讯来实现对水温的控制。
七、软件设计说明本系统采用的是循环查询方式,来显示和控制温度的。
1总程序流程图如下2中断函数流程图如下:八、整机调试与技术指标测量用继电器模块来控制200W“热得快”来对1升水进行加热,用键盘设定需加热温度值,观察1602所显示的稳定时的水温值和环境温度降低时温度控制的静态误差。
多次调试并和设定PID参数来完善该系统。
(1)由于采用了PID控制,在环境温度降低时温度控制的静态误差小于0.5℃(精度高于设计要求)。
(2)用TS1602-1液晶来显示水的实际温度和设定温度值,显示很稳定。
(3 )采用了PID控制,当设定温度突变(由40℃提高到60℃)时,经过多次调试知道,当P=20;I=15;D=6时系统具有最小的调节时间和超调量。
(4)当温度稳定时,温度控制的静态误差≤0.5℃。
(5)经过多次测试和改进,该系统各方面参数都达到和超过设计参数,完成了既定目标。
九、设计总结首先,通过本次应用系统设计,在很大程度上提高了我们的独立思考能力和单片机的专业知识,也深刻了解写一篇应用系统的步骤和格式,有过这样的一次竞赛经历,相信在接下来的日子我们能在已有的基础上做得更好。
我们所设计的该系统主要根据目前节省能源的发展趋势和国内实际的应用特点和要求,采用了自动化的结构形式,实现对水温的自动检测和控制。
系统以AT89C51单片机为核心部件,单片机系统完成对水温信号的采集、处理、显示等功能; 并采用了PID 算法,因而提高了控制的准确度。
该系统的主要特点是:1)适用性强,用户只需对界面参数进行设置并启动系统正常运行便可满足不同用户水温的要求,实现对水温的实时监控。
避免了电力力资源的浪费,节省了能源。
2)将单片机以及温度传感器引入对水温的分析和处理中,单片机控制决策无需建立被控对象的数学模型,系统的适应性强,适合对非线性、时变、滞后系统的控制对水温控制系统进行控制。
3)系统成本低廉,操作非常简单,可扩展性强,只要稍加改变,即可增加其他使用功能。
本系统对现代化的发展具有十分重要的意义:首先,节省了能源,特别是最近几年,我国东部沿海地区电力资源缺口十分巨大,可以缓解部分电力资源压力。
其次,由于我国大部分电力资源是火力发电,因而从一定程度上节省了自然资源,以及保护了环境。
通过对本设计的思考,更加加深了我们对单片机的认识,熟练了对单片机的控制,更对当前的温度传感器有了更深刻的认识与了解,但是由于此系统依赖温度传感器,因而对温度传感器的稳定性,线性等诸多方面有着严格的要求,但是传感器的性能越好,相对而言其价格也就越高,因而在此设计中,温度传感器我个人觉的还是存在遗憾,由于温度计的使用温度有限所以水温不能达到90℃以上。
最后由于时间紧迫,本设计还有诸多地方需要改进,我们会在接下来的时间里继续完善该设计,以期做的更好。
参考文献[1] 大学生电子设计竞赛组委会.《第五届全国电子设计竞赛获奖作品选编》.北京:北京理工大学出版社,2003[2] 何立民.《单片机高级教程应用设计》.北京:北京航空航天大学出版社,2000[3] 朱定华.《单片机原理与接口技术》.电子工业出版社,2006[4] 刘瑞新.《单片机原理及应用教程》.机械工业出版社,2003[5] 吴普特,牛文全,郝宏科.《现代化高效节水灌溉设施》.化学工业出版社,2002[6] 马建伟,李银伢.《PID控制设计理论与方法》.科学出版社,2008[6] 大学生电子实验室 /BBS/[7] 电子工程世界 附件1电路原理图附件2 程序#include <reg52.h>#include <absacc.h>#include"KEYSCAN.H"#include"DS18B20.H"#include"XIANSHI.H"#include"PID.H"void PIDBEGIN(void); // PID参数初始化// void main(){unsigned char key1=0,i,k;unsigned int tmp;unsigned char shu[3]={13,13,0};unsigned char counter=0;PIDBEGIN();while(1){if(counter-- == 0){tmp = ReadTemperature();counter = 20;}view(tmp); //温度显示;compare_temper();}}(2) PID算法温度控制程序#ifndef _PID_H__#define _PID_H__#include<intrins.h>#include<math.h>#include<string.h>struct PID {unsigned int SetPoint; // 设定目标 Desired Valueunsigned int Proportion; // 比例常数 Proportional Const unsigned int Integral; // 积分常数 Integral Constunsigned int Derivative; // 微分常数 Derivative Const unsigned int LastError; // Error[-1]unsigned int PrevError; // Error[-2]unsigned int SumError; // Sums of Errors}struct PID spid; // PID Control Structureunsigned int rout; // PID Response (Output)unsigned int rin; // PID Feedback (Input)sbit output=P3^4;unsigned char high_time,low_time,count=0;//占空比调节参数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->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_temper>temper){if(set_temper-temper>1){high_time=100;low_time=0;}else{for(i=0;i<10;i++){ get_temper();rin = s; // Read Inputrout = PIDCalc ( &spid,rin ); // Perform PID Interation}if (high_time<=100)high_time=(unsigned char)(rout/800);elsehigh_time=100;low_time= (100-high_time);}}else if(set_temper<=temper){if(temper-set_temper>0){high_time=0;low_time=100;}else{for(i=0;i<10;i++){ get_temper();rin = s; // Read Inputrout = PIDCalc ( &spid,rin ); // Perform PID Interation }if (high_time<100)high_time=(unsigned char)(rout/10000);elsehigh_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;}elsecount=0;TH0=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 Structurespid.Proportion = 10; // Set PID Coefficientsspid.Integral = 8;spid.Derivative =6;spid.SetPoint = 100; // Set PID Setpoint}#endif(3)DS18B20子程序#ifndef __DS18B20_H__#define __DS18B20_H__sbit DQ = P3^5; //定义通信端口unsigned int s;unsigned char temper;//晶振22MHzvoid delay_18B20(unsigned int i){while(i--);}//初始化函数Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(100); //精确延时大于 480us DQ = 1; //拉高总线delay_18B20(40);}//读一个字节ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}//写一个字节WriteOneChar(unsigned char dat) {unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay_18B20(10);DQ = 1;dat>>=1;}}//读取温度ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;//EA = 0;Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();b=ReadOneChar();//启动下一次温度转换Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换t=(b*256+a)*25;b=(b<<4)&0x7f;s=(unsigned int)(a&0x0f);s=(s*100)/16;a=a>>4;temper=a|b;return(t>>2);}#endif。