1、计算机控制课程设计终期报告姓名: 学号: 班级: 指引教师: 周永华 时间: -7-1 目录一、设计题目3二、系统方案31、水温自动控制系统设计任务和要求32、水温自动控制系统部分33、温度控制系统的算法分析4三、系统硬件设计51、总体设计框图及说明52、各个子模块设计52.1 CPU的选择52.2 测量单元选型62.3 水温控制电路设计62.4 键盘设置电路72.5 LCD显示电路82.6 报警电路8五、软件系统设计91、程序框架结构92、主程序模块103、按键程序114、LCD显示程序125、DS18B20采集温度程序126、PID计算和继电器控制程序127、附加时间显示程序14六、MAT
2、LAB/SIMULINK仿真部分141、理论分析142、具体传递函数计算153、SIMULINK仿真154、MATLAB仿真18七、PROTEUS仿真部分24八、结论及心得体会251、实验结论252、心得体会26八、参考文献26一、设计题目基于单片机水温自动控制系统二、系统方案1、水温自动控制系统设计任务和规定该系统为一实验系统,系统设计任务如下:设计一种水温自动控制系统,控制对象为一杯子内水温度。水温可以在一定范畴内由人工设定,并能在环境温度减少时实现自动调节,以保持特定温度不变。 系统设计详细规定: (1)温度设定范畴为30-50摄氏度; (2)环境温度减少是控制水温误差不大于1摄氏度;
3、(3)采用恰当办法,使得温度在一定范畴内才进行控制,超过某一范畴直接加热或者不加热,减小系统调节时间; (4)采用恰当办法减少系统超调量; (5)用LCD1602显示温度与时间。2、水温自动控制系统某些水温自动控制系统是一种过程控制系统,构成框图如图1所示,由输入、输出、控制器、执行器、被控对象其反馈作用测量构成。输入控制器执行器受控对象输出测量反馈 图1 计算机控制系统框图本系统中CPU选取为单片机,执行器为继电器,控制加热片通断,检测装置为温度传感器采集温度并反馈给单片机。此外尚有键盘输入某些、显示某些以及报警某些,总体框图如下(图2)AT89C52控制器报警显示输入测量执行器加热器 图2
4、 温控箱控制系统总体框图3、温度控制系统算法分析本实验基本思路是采用位置式PID控制算法,其基本算式为uk=KPek+KIj=0kej+KDek-e(k-1)固然在实际应用中依照详细状况对控制参数做出改进,针对PID控制算法积分作用,采用积分分离控制算法。控制系统在开始工作时必然会有较大误差,并且它在短时间内不会消除,并且通过积分项累积后会使得控制作用u(k)在误差较小时依然保持较大值,即进入积分饱和状态,这使得系统需要通过很长时间才干恢复正常,这就大大影响了控制效果。一种比较好克服积分饱和办法是采用积分分离法。积分分离法基本控制思想是在偏差不不大于某个规定门限值时,停止并取消积分作用;而在误
5、差不大于此门限值时才计算并引入积分作用,来消除稳定误差。其基本算式为uk=KPek+KIj=kikej+KDek-e(k-1)当ek值,=1,当ek值,=0三、系统硬件设计1、总体设计框图及阐明本系统是一种简朴单回路控制系统。为了实现水温自动测量和控制,依照系统总体方案,系统由单片机基本系统、前向通道、反馈通道和人机对话通道等4个重要功能模块构成,总体框图如上面图2所示。单片机系统是整个控制系统核心,AT89C52可以提供系统控制所需I/O口、中断、定期及存储中间成果RAM电路;前向通道是控制执行通道,重要涉及光耦、继电器、加热管;反馈通道由DS18B20构成,采集当前实际温度。键盘设定:采用
6、4*4矩阵键盘,用于温度设定、设定加热开关以及时间显示。数据采集:运用DS18B20数字温度传感器采集当前温度并反馈给CPU进行解决,用于控制和显示。数据显示:运用LCD1602字符型液晶显示屏显示设定温度、实际温度以及当前时间。执行机构:通过三极管控制继电器来完毕对加热管控制,为防止强电弱电互相影响,在单片机与继电器之间加入光电耦合器进行强电弱电隔离。2、各个子模块设计2.1 CPU选取单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具备数据解决能力中央解决器CPU随机存储器RAM、只读存储器ROM、各种I/O口和中断系统、定期器/计时器等功能(也许还涉及显示驱动电路、脉宽调制电路、
7、模仿多路转换器、A/D转换器等电路)集成到一块硅片上构成一种小而完善计算机系统。其使用起来十分简朴灵活以便,因而选取单片机作为CPU。本系统选取本人较为熟悉AT89C52单片机作为CPU。如图3所示。图3 AT89C52封装图 2.2 测量单元选型方案1:采用热敏电阻,可满足35-95测量范畴,但热敏电阻精度、重复性和可靠性都比较差,对于检测精度不大于1温度信号是不合用。方案2:采用温度传感器DS18B20。在本课题中我用温度传感器是DALLAS公司生产DS18B20它体积非常小,硬件开销也小,抗干扰能力强,精度高,附加功能强。它之因此可以有这些长处,是由于它把温度检测与数字数据输出全集成于一
8、种芯片之上,从而抗干扰力更强。其一种工作周期可分为两个某些,即温度检测和数据解决。这里最后拟定使用方案2,即采用带防水封装18B20温度传感器。2.3 水温控制电路设计 此某些通过控制继电器通断从而控制加热片,采用对加在电热管两端电压进行通断办法进行控制,以实现对水加热功率调节,从而达到对水温控制目,即在闭环控制系统中对被控对象实行控制。此外,为了防止强电对弱电影响,我在继电器与单片机之间加了光耦进行隔离。继电器是一种电控制器件。它具备控制系统(又称输入回路)和被控制系统(又称输出回路)之间互动关系。普通应用于自动化控制电路中,它事实上是用小电流去控制大电流运作一种“自动开关”。故在电路中起着
9、自动调节、安全保护、转换电路等作用。如图4所示 图4 继电器原理图 图5 实际应用继电器只要在线圈两端加上一定电压,线圈中就会流过一定电流,从而产生电磁效应,衔铁就会在电磁力吸引作用下克服返回弹簧拉力吸向铁芯,从而带动衔铁动触点与静触点(常开触点)吸合。当线圈断电后,电磁吸力也随之消失,衔铁就会在弹簧反作用力返回本来位置,使动触点与本来静触点(常闭触点)释放。这样吸合、释放,从而达到了在电路中导通、切断目。 光电耦合器是以光为媒介传播电信号一种电一光一电转换器件。它由发光源和受光器两某些构成。把发光源和受光器组装在同一密闭壳体内,彼此间用透明绝缘体隔离。发光源引脚为输入端,受光器引脚为输出端。
10、在光电耦合器输入端加电信号使发光源发光,光强度取决于勉励电流大小,此光照射到封装在一起受光器上后,因光电效应而产生光电流,由受光器输出端引出,这样就实现了电一光一电转换。2.4 键盘设立电路 本系统选取4*4矩阵键盘作为输入某些,用来输入预设温度、启动与关闭加热、调节时间等。 4*4矩阵键盘内部电路及实物图如图6所示,每行4个按键一端连在一起,每列也连在一起,通过选取行与列就能判断出究竟是哪个键按下。图6 4*4矩阵键盘其中数字键用于设定温度值。此外4个键分别用来控制加热、调节时间模式选取键、时间加、时间减,尚有两个键暂时保存功能。2.5 LCD显示电路本系统采用LCD1602显示温度值与时间
11、。如图7所示。LCD1602液晶显示模块可以和单片机STC89C52直接接口,电路如图8所示。通过LCD1602显示预设以及实际温度,并能显示加热管当前处在状态是加热还是停止加热,并附加显示时间。 图7 LCD1602 图8 LCD proteus仿真图 2.6 报警电路本系统采用简易报警电路进行报警,仿真图如图9所示。设计思想为当预设温度不在所盼望范畴(3050度)内,则蜂鸣器发出警报,若实际温度不不大于50度则亮黄灯进行提示,若实际温度不大于30度则亮绿灯进行提示。图9 报警电路仿真五、软件系统设计1、程序框架构造一种整体系统软件设计是由各个在系统里起着不同作用模块整合在一起,从而实现系统
12、所要实现功能。本系统涉及主控制程序,键盘扫描程序,温度采集程序,时间显示与调节程序,PID算法程序,LCD显示程序。构造框架图如图10所示。主程序模块键盘扫描LCD显示DS18B20采集温度PID计算继电器工作图10 系统程序框架主程序模块相称于调度室,对子程序模块调用进行管理,它重要负责初始化IO口;等待键盘被按下,并调用相应模块进行解决;显示温度控制过程及时间;在恰当时候通过DS18B20检测实际温度,并与所设定值进行比较,判断报警并通过调用PID算法解决数据,解决日后控制继电器通断,从而控制热电管达到控制温度目。2、主程序模块由于模块化程序设计,通过调用程序即可实现所用功能,主程序流程图
13、如图11所示。 图11 主程序流程图 图12 键盘扫描流程图主程序见附件一。3、按键程序本系统采用4*4键盘,键盘扫描思想是一方面判断与否真有键按下,然后开始判断究竟是哪一种键按下。详细思路是先给P1口置成0xf0,若有键按下,则P0口电平发生变化,然后依次置P1口为0xfe,0xfd,0xfb,0xf7,找出是哪一行有键按下,行找到后再拟定是该行哪列被按下,最后找到键值。程序流程图如图12所示。按键程序见附件一。4、LCD显示程序1602液晶模块内部控制器共有11条控制指令,如表1所示:序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001
14、*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写数据内容11从CGRAM或DDRAM读数11读出数据内容表1:控制命令表由于LCD1602比较惯用,编程序是按照时序写入即可,这里不再赘述。LCD显示程序见附件一。5、DS18B20采集温度程序 DS18B20数字温度传感器对时序规定十分严格,延时大多是us级,因而该子程序中延时程序需要区
15、别于LCD显示延时程序。只要严格按照时序图写程序,DS18B20即可运营。DS18B20温度采集程序间附件一。6、PID计算和继电器控制程序 前面已经提到PID是一种线性控制器,因而本系统PID控制思路是在第一次PID调节时记下PID调节器输出值uk0(该值为后来PID调节器输出地最大值),并以该值为参照,后来输出uk与uk0做比值,假设uk0表达加热a, 那么输出uk与uk0比值表达加热a*uk/uk0时间,以此类推,最后算出每次计算应当加热时间作用于继电器,控制加热管加热。由于温度变化缓慢,则设立为5s计算PID一次。此外本系统PID采用了开关量计算积分分离相结合改进PID算法,详细思路是
16、当温差不不大于等于15度时不用PID直接进行开关控制。当温度在0-15度之间时才采用PID计算。 详细程序如下:(1)PID计算void PID(void) float ek,ek1,ek2,ek_sum; uint a; ek=K-temp; /计算误差 while(1) if(ON_OFF=1) /温控开关开 if(ek=15) outflag=1;OUT=0;Time_on=100;break; /温差不不大于15度,不用PID调节 else if(ek5) a=0;if(ekTime_on) /模仿迟滞 OUT=1; outflag=0; if(TIM=100) /5s进行一次PID计
17、算 PID(); TIM=0; 7、附加时间显示程序考虑到实际温度控制系统如果加上显示时间功能可以获得更好应用,故在此系统中加上了显示时间功能。重要是运用了AT89C52定期器功能,每50ms中断一次,进行时间设立。时间显示程序见附件一。六、MATLAB/SIMULINK仿真某些1、理论分析由于通过PID后计算出控制量控制每次加热棒加热时间,即相应所提供热量。因此重要计算被测温度与供热之间传递函数。设水温为T ,环境温度(干扰)为T0,供热量Q1=I2R Q2=KrA(T-T0)式中:Kr 为散热系数;A为散热面积。能量平衡式: Q1-Q2=GCpdTdt (1)式中:G为水质量;CP 为水比
18、热。将Q2 代入式(1),整顿得: GCpKrAdTdt+T=1KrAQ1+T0 (2)设Tc=GCpKrA为对象供热时间常数,K1=1KrA为对象供热比例系数,则对象特性微分方程为 TcdTdt+T=K1Q1+T0 (3)式(3)表白了对象温度与供热能量及环境温度关系,式中T、T0 为变量。T0 为不变量,则式(3)变为 TcdTdt+T=K1Q1 (4)对式(4)作拉氏变换,推出被测温度与供热之间传递函数为W1S=TSQ1S=K11+Tcs (5)由式(5)可知,环节为一阶惯性环节。2、详细传递函数计算由上面分析可以看出,传递函数计算重要在于,K1=1KrA和Tc=GCpKrA参数计算。由
19、于Kr(单位:W/(m2K))散热系数计算很复杂,且更多用于大面积水域散热计算,对咱们这次实验意义不大,因此我将散热系数换为由水自身性质决定导热系数(单位:W/(mK),因此KrA换为d,d为水层宽度。查书可得20C时水导热系数为5.99 W/(mK),假设水杯内水高度和宽度约等于12cm,杯内水质量G约为100g,水比热Cp为4.2*103J/kg。由此可算出K1=13.9,Tc=5843.05。因此得被测温度与供热之间传递函数W1S=13.91+5843.05s所用加热棒为150W,通过PID算法后所得为一种周期内加热时间,设一周期为5秒,有100个可控高低电平,故在PID环节之后需乘系数
20、150W*1s100*5=3/10而加热棒加热需要一定期间,故增长滞后环节。也就是普通所说温度控制被控对象为纯滞后环节G=Ke-sTs+1取延时为5s,因此最后得到被控对象传递函数:G=310*13.9e-5s5843.05s+13、SIMULINK仿真由上面计算传函可得simulink仿真采用试凑法,先只加入P环节:P=10,I=0,D=0调节时间很长,在1000s以上,故增大P。P=20,I=0,D=0迅速性得到很大改进,再增大P。P=40,I=0,D=0虽然迅速性得到改进,但浮现了较大超调,通过多次尝试。P=32,I=0,D=0时效果最佳此时有1%稳态误差,故尝试加入I环节。P=32,I
21、=1,D=0效果很差,问题出在一开始系统输入温度差值很大,导致积分项很大,积分饱和,因此会产生很难稳定现象,因此减小I。P=32,I=0.01,D=0效果较好,稳态误差基本消失,但此时积分环节作用已经很小。在实际制作中可采用抗饱和积分,变速积分等办法去掉这个问题。背面matlab仿真某些将对抗饱和积分做更多简介。日后我继续尝试加入微分控制,但是没有获得更好效果,因此选取PI调节。4、MATLAB仿真matlab仿真采用了抗饱和积分法,当系统存在一种方向误差时,由于积分累加作用会使控制量始终增大,也许会使控制量达到执行器执行阈值,如果此时误差方向发生变化,控制量会逐渐减小,控制量也会退出饱和区,
22、执行器也会在阈值内执行;如果此时误差方向还是没有变化,控制量会继续增大但是执行器会始终保持在阈值,此时控制量就进入了饱和区。进入饱和区越深,退出饱和区时间就会越长,在饱和区时执行器会始终在阈值位置,如果误差发生反向,执行器不会立即有反映,控制量会慢慢减小,等执行器推出饱和区才会有反映。这样就会使控制动态响应变差,控制性能变差。抗积分饱和算法思路为,在计算u(k)时,一方面判断u(k-1)与否超过范畴,若u(k-1)Umax,则只累加负误差;若u(k-1)=um if error(k)0 alpha=0; else alpha=1; endelseif u(k)0 alpha=1; else a
23、lpha=0; endelse alpha=1;end alpha为积分项系数,为1时则累加积分项,为0时不累加。传递函数还用之前计算成果,kp=32;ki=0;kd=0.0上图为温度输出成果,中图为控制量,下图为积分项。可看出与simulink仿真基本一致,为看出抗饱和积分效果因此将积分项加大kp=32;ki=5;kd=0.0未加入抗饱和积分 kp=32;ki=5;kd=0.0加入抗饱和积分后可看出加入抗饱和积分后超调量明显下降,抗饱和积分可以使系统稳定性得到改进。.m源程序:%PID Controler with intergration sturationclear all;close
24、all;ts=1;sys=tf(41.7,58430.5,10,inputdelay,20);dsys=c2d(sys,ts,z);num,den=tfdata(dsys,v);u_1=0.0;u_2=0.0;u_3=0.0;y_1=0;y_2=0;y_3=0;x=0,0,0;error_1=0;um=1000;kp=32;ki=5;kd=0.0; rin=30; %Step Signalfor k=1:1:600time(k)=k*ts;u(k)=kp*x(1)+kd*x(2)+ki*x(3); % PID Controllerif u(k)=um u(k)=um;endif u(k)=um
25、 if error(k)0 alpha=0; else alpha=1; endelseif u(k)0 alpha=1; else alpha=0; endelse alpha=1;end elseif M=2 %Not using intergration sturation alpha=1; end%Return of PID parametersu_3=u_2;u_2=u_1;u_1=u(k); y_3=y_2;y_2=y_1;y_1=yout(k);error_1=error(k);x(1)=error(k); % Calculating Px(2)=(error(k)-error_
26、1)/ts; % Calculating Dx(3)=x(3)+alpha*error(k)*ts; % Calculating Ixi(k)=x(3);endfigure(1);subplot(311);plot(time,rin,b,time,yout,r);xlabel(time(s);ylabel(Tempereture tracking);subplot(312);plot(time,u,r);xlabel(time(s);ylabel(Controller output);subplot(313);plot(time,xi,r);xlabel(time(s);ylabel(Inte
27、gration);七、PROTEUS仿真某些系统整体仿真图如图13所示 图13 水温控制系统整体proteus仿真图图14 系统启动电源仿真图八、结论及心得体会1、实验结论由以上实验数据和实验对比分析可以得到PID各个环节作用:比例系数KP决定控制作用强弱,KP加大时可减少系统稳态误差,提高系统动态响应速度,但KP过大会引起振荡或导致系统不稳定。积分项Ki/S用于消除系统稳态误差,但积分项会使动态过程变慢,增大系统超调量,使系统稳定性变坏。微分KdS控制作用与偏差变化速度关于。微分能产生超前校正作用,有助于减少超调和振荡,并能减少调节时间,从而改进系统动态性能。在实验过程中,用是试凑法进行PI
28、D参数整定。通过实验大概体验出试凑法进行PID参数整定环节,如下:(1)一方面只整定比例某些。比例系数KP由小变大,观测相应系统响应,直到得到反映快,超调小响应曲线。系统若无稳态误差或稳态误差已小到容许范畴内,并且响应效果良好,那么只须用比例调节器即可。(2)若稳态误差不能满足设计规定,则需加入积分控制。整定期先置积分时间Ti为一较大值,并将经第1步整定得到KP减小些,然后减小Ti,并使系统在保持良好动态响应状况下,消除稳态误差。这种调节可依照响应曲线状态,重复变化KP及Ti,以期得到满意控制过程。(3)若使用PI调节器消除了稳态误差,但动态过程仍不能满意,则可加入微分环节。在第2步整定基本上
29、,逐渐增大TD,同步相应地变化KP和Ti,逐渐试凑以获得满意调节效果。2、心得体会本次历时近两周计算机控制课程设计即将画上圆满句号。从最开始选题,本来想选取是小型无人直升机飞行高度控制系统设计,查阅了大量资料,但是最后由于对直升机模型不熟悉,很难进行系统建模分析及仿真,无奈放弃。最后我选取是与咱们生活非常接近水温自动控制系统。从拟定课题到查阅大量有关资料,第一次发现自己所学能有所用,可以在生活实际中解决问题,让我兴奋不已。硬件设计问题并不多,由于上学期学过单片机课程,因此整个过程比较顺利。另一方面是软件系统搭建,在编写程序时,某些子模块都是在网上找现成,为此省去了不少时间和精力。MATLAB仿
30、真时比较得心应手,由于之前许多课程都是用MATLAB或者MULTISIM进行仿真实验,自动化专业实验也进行过PID参数整定,因此也比较顺利。PROTEUS是我新掌握一种软件,对它学习花去近两天学习时间,然后我运用PROTEUS进行了电路搭接仿真,也许是没有实物操作,仿真成果不是十分对的,只进行了简朴搭接和电源启动检查了一下能否正常工作。最后由于时间有限,不能进行硬件焊接调试,做出实物,将理论带入实践中去,是比较遗憾。总来说通过这次课程设计我收获到了诸多东西,软件、硬件、甚至是对电子课程设计信心倍增,虽然期间遇到各种问题,但是最后通过自己努力都可以解决,不但提高了自己技能,也看到了自己局限性,这
31、次课程设计定让我进入了电子设计新阶段。最后,感谢教师和同窗在本次计算机课程设计中给我协助。八、参照文献过程控制系统,黄德先、王京春、金以慧编著,清华大学出版社。计算机控制系统,高金源、夏洁编著,清华大学出版社。检测原理,施文康、余晓芬主编,机械工业出版社。单片机原理与应用,戴胜华、蒋大明主编,北京交通大学出版社。数字电子技术基本,侯建军主编,高等教诲出版社。自动控制原理,蒋大明、戴胜华主编,北京交通大学出版社。附件一:恒温箱控制系统源程序#include#include /空操作_nop_ 头文献#define uchar unsigned char#define uint unsigned
32、int#define BUSY 0x80 /lcd忙检测标志#define DATAPORT P0 /定义P0口为LCD通讯端口sbit BUZZER=P34;sbit P1_0=P10; /时钟调节 P0口sbit P1_1=P11; /时钟加 P1口sbit P1_2=P12; /时钟减 P2口sbit led1=P32;sbit led2=P33;sbit DQ = P36; /定义ds18b20通信端口 sbit LCM_RS=P20;/数据/命令端sbit LCM_RW=P21;/读/写选取端sbit LCM_EN=P22; /LCD使能信号sbit OUT=P37;/光耦、继电器驱
33、动信号uchar seconde=0; /定义并初始化时钟变量uchar minite=0;uchar hour=12;uchar mstcnt=0; /时间计时中断变量uchar idata value2; /存储键盘输入值uchar buff,times,j; /用来解决按键值全局变量uchar temp1,temp2,temp; /温度显示变量 temp1为整数某些,temp2为小数某些, temp为实际温度uchar set; /定义全局变量 set为工作模式选取float K; /设定温度bit ON_OFF=0; /加热键控制总开关bit outflag; /温控标志,为1时表达加
34、热,LCD上用|表达;为0时表达不加热,LCD上用表达unsigned int TIM; /PID计时中断变量bit start_flag=0; / 开始PID运算标志位bit start_key=0; /设立软件输入设定初值标志位float div,kp=1.5,kd=1;/用于PID计算变量float ki=0.01;float uk,uk0;uint Time_on;/控制加热片加热时间uchar code str0=- : : - ;/显示字符串uchar code str1=SET: C TP: . C;uchar code digit= ; /显示键值void delay_LCM(
35、uint); /LCD延时子程序void initLCM( void); /LCD初始化子程序void lcd_wait(void); /LCD检测忙子程序void WriteCommandLCM(uchar WCLCM,uchar BusyC); /写指令到LCD子函数void WriteDataLCM(uchar WDLCM); /写数据到LCD子函数void DisplayOneChar(uchar X,uchar Y,uchar DData); /显示指定坐标一种字符子函数void DisplayListChar(uchar X,uchar Y,uchar code *DData);/
36、显示指定坐标一串字符子函数void init_timer0(void); /定期器初始化void displayfun1(void); /显示模式子函数void displayfun2(void);void displayfun3(void);void keyscan(void ); /键盘扫描子程序void keydown(void) ; /判断按键按下子程序void set_adj(void);/设定工作模式子程序void inc_key(void); /时钟加子程序void dec_key(void); /时钟减子程序void delay_18B20(unsigned int i); /
37、 18B20延时子程序void Init_DS18B20(void) ; /18B20初始化子程序uchar ReadOneChar(void); /向18B20度数据子函数void WriteOneChar(unsigned char dat); /往18b20写一种数据子函数void ReadTemperature(void); /从18B20读温度子函数void PID(void); /PID计算子程序/*延时K*1ms,12.000mhz*/void delay_LCM(unsigned int k) unsigned int i,j; for(i=0;ik;i+) for(j=0;j60;j+) ; /*4*4键盘扫描子函数*/void keyscan(void)uchar hang,lie,key; /局部变量P1=0xf0;if(P1!=0xf0)