首页 北京交通大学-计算机控制课程设计报告

北京交通大学-计算机控制课程设计报告

举报
开通vip

北京交通大学-计算机控制课程设计报告北京交通大学-计算机控制课程设计报告北京交通大学-计算机控制课程设计报告北京交通大学-计算机控制课程设计报告《计算机控制课程设计》——终期报告姓名:学号:班级:指导教师:周永华时间:2013-7-1目录TOC\o"1-3"\h\z\uHYPERLINK\l"_Toc360392501"一、设计题目PAGEREF_Toc360392501\h3HYPERLINK\l"_Toc360392502"二、系统方案PAGEREF_Toc360392502\h3HYPERLINK\l"_Toc36...

北京交通大学-计算机控制课程设计报告
北京交通大学-计算机控制课程设计 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 北京交通大学-计算机控制课程设计报告北京交通大学-计算机控制课程设计报告《计算机控制课程设计》——终期报告姓名:学号:班级:指导教师:周永华时间:2013-7-1目录TOC\o"1-3"\h\z\uHYPERLINK\l"_Toc360392501"一、设计题目PAGEREF_Toc360392501\h3HYPERLINK\l"_Toc360392502"二、系统 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 PAGEREF_Toc360392502\h3HYPERLINK\l"_Toc360392503"1、水温自动控制系统设计任务和要求PAGEREF_Toc360392503\h3HYPERLINK\l"_Toc360392504"2、水温自动控制系统部分PAGEREF_Toc360392504\h3HYPERLINK\l"_Toc360392505"3、温度控制系统的算法分析PAGEREF_Toc360392505\h4HYPERLINK\l"_Toc360392506"三、系统硬件设计PAGEREF_Toc360392506\h5HYPERLINK\l"_Toc360392507"1、总体设计框图及说明PAGEREF_Toc360392507\h5HYPERLINK\l"_Toc360392508"2、各个子模块设计PAGEREF_Toc360392508\h5HYPERLINK\l"_Toc360392509"2.1CPU的选择PAGEREF_Toc360392509\h5HYPERLINK\l"_Toc360392510"2.2测量单元选型PAGEREF_Toc360392510\h6HYPERLINK\l"_Toc360392511"2.3水温控制电路设计PAGEREF_Toc360392511\h6HYPERLINK\l"_Toc360392512"2.4键盘设置电路PAGEREF_Toc360392512\h7HYPERLINK\l"_Toc360392513"2.5LCD显示电路PAGEREF_Toc360392513\h8HYPERLINK\l"_Toc360392514"2.6报警电路PAGEREF_Toc360392514\h8HYPERLINK\l"_Toc360392515"五、软件系统设计PAGEREF_Toc360392515\h9HYPERLINK\l"_Toc360392516"1、程序框架结构PAGEREF_Toc360392516\h9HYPERLINK\l"_Toc360392517"2、主程序模块PAGEREF_Toc360392517\h10HYPERLINK\l"_Toc360392518"3、按键程序PAGEREF_Toc360392518\h11HYPERLINK\l"_Toc360392519"4、LCD显示程序PAGEREF_Toc360392519\h12HYPERLINK\l"_Toc360392520"5、DS18B20采集温度程序PAGEREF_Toc360392520\h12HYPERLINK\l"_Toc360392521"6、PID计算和继电器控制程序PAGEREF_Toc360392521\h12HYPERLINK\l"_Toc360392522"7、附加时间显示程序PAGEREF_Toc360392522\h14HYPERLINK\l"_Toc360392523"六、MATLAB/SIMULINK仿真部分PAGEREF_Toc360392523\h14HYPERLINK\l"_Toc360392524"1、理论分析PAGEREF_Toc360392524\h14HYPERLINK\l"_Toc360392525"2、具体传递函数计算PAGEREF_Toc360392525\h15HYPERLINK\l"_Toc360392526"3、SIMULINK仿真PAGEREF_Toc360392526\h15HYPERLINK\l"_Toc360392527"4、MATLAB仿真PAGEREF_Toc360392527\h18HYPERLINK\l"_Toc360392528"七、PROTEUS仿真部分PAGEREF_Toc360392528\h24HYPERLINK\l"_Toc360392529"八、结论及心得体会PAGEREF_Toc360392529\h25HYPERLINK\l"_Toc360392530"1、实验结论PAGEREF_Toc360392530\h25HYPERLINK\l"_Toc360392531"2、心得体会PAGEREF_Toc360392531\h26HYPERLINK\l"_Toc360392532"八、参考文献PAGEREF_Toc360392532\h26一、设计题目基于单片机的水温自动控制系统二、系统方案1、水温自动控制系统设计任务和要求该系统为一实验系统,系统设计任务如下:设计一个水温自动控制系统,控制对象为一杯子内水的温度。水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动调整,以保持特定的温度不变。系统设计具体要求:(1)温度设定范围为30-50摄氏度;(2)环境温度降低是控制水温误差小于1摄氏度;(3)采用适当的方法,使得温度在一定范围内才进行控制,超过某一范围直接加热或者不加热,减小系统的调节时间;(4)采用适当方法减少系统的超调量;(5)用LCD1602显示温度与时间。2、水温自动控制系统部分水温自动控制系统是一个过程控制系统,组成框图如图1所示,由输入、输出、控制器、执行器、被控对象其反馈作用的测量组成。输入控制器执行器受控对象输出测量反馈图1计算机控制系统框图本系统中CPU选择为单片机,执行器为继电器,控制加热片通断,检测装置为温度传感器采集温度并反馈给单片机。另外还有键盘输入部分、显示部分以及报警部分,总体框图如下(图2)AT89C52控制器报警显示输入测量执行器加热器图2温控箱控制系统总体框图3、温度控制系统的算法分析本实验的基本思路是采用位置式PID控制算法,其基本算式为uk=KPek+KIj=0kej+KD[ek-e(k-1)]当然在实际应用中根据具体情况对控制参数做出改进,针对PID控制算法的积分作用,采用积分分离的控制算法。控制系统在开始工作时必然会有较大的误差,而且它在短时间内不会消除,而且经过积分项累积后会使得控制作用u(k)在误差较小时仍然保持较大的值,即进入积分饱和状态,这使得系统需要经过很长的时间才能恢复正常,这就大大影响了控制效果。一种比较好的克服积分饱和的方法是采用积分分离法。积分分离法的基本控制思想是在偏差大于某个规定的门限值时,停止并取消积分作用;而在误差小于此门限值时才计算并引入积分作用,来消除稳定误差。其基本算式为uk=KPek+αKIj=kikej+KD[ek-e(k-1)]当ek≤∈值,α=1,当ek>∈值,α=0三、系统硬件设计1、总体设计框图及说明本系统是一个简单的单回路控制系统。为了实现水温的自动测量和控制,根据系统总体方案,系统由单片机基本系统、前向通道、反馈通道和人机对话通道等4个主要的功能模块组成,总体框图如上面图2所示。单片机系统是整个控制系统的核心,AT89C52可以提供系统控制所需的I/O口、中断、定时及存放中间结果的RAM电路;前向通道是控制执行的通道,主要包括光耦、继电器、加热管;反馈通道由DS18B20构成,采集当前实际的温度。键盘设定:采用4*4矩阵键盘,用于温度设定、设定加热开关以及时间的显示。数据采集:运用DS18B20数字温度传感器采集当前温度并反馈给CPU进行处理,用于控制和显示。数据显示:运用LCD1602字符型液晶显示屏显示设定温度、实际温度以及当前的时间。执行机构:通过三极管控制继电器来完成对加热管的控制,为防止强电弱电相互影响,在单片机与继电器之间加入光电耦合器进行强电弱电的隔离。2、各个子模块设计2.1CPU的选择单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。其使用起来十分简单灵活方便,因此选择单片机作为CPU。本系统选择本人较为熟悉的AT89C52单片机作为CPU。如图3所示。图3AT89C52封装图测量单元选型方案1:采用热敏电阻,可满足35℃--95℃的测量范围,但热敏电阻精度、重复性和可靠性都比较差,对于检测精度小于1℃的温度信号是不适用的。方案2:采用温度传感器DS18B20。在本课题中我用的温度传感器是DALLAS公司生产的DS18B20它的体积非常小,硬件开销也小,抗干扰能力强,精度高,附加功能强。它之所以能够有这些优点,是因为它把温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。这里最后确定使用方案2,即采用带防水封装的18B20温度传感器。2.3水温控制电路设计此部分通过控制继电器的通断从而控制加热片,采用对加在电热管两端的电压进行通断的方法进行控制,以实现对水的加热功率的调整,从而达到对水温控制的目的,即在闭环控制系统中对被控对象实施控制。另外,为了防止强电对弱电的影响,我在继电器与单片机之间加了光耦进行隔离。继电器是一种电控制器件。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。如图4所示图4继电器原理图图5实际应用的继电器只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。这样吸合、释放,从而达到了在电路中的导通、切断的目的。光电耦合器是以光为媒介传输电信号的一种电一光一电转换器件。它由发光源和受光器两部分组成。把发光源和受光器组装在同一密闭的壳体内,彼此间用透明绝缘体隔离。发光源的引脚为输入端,受光器的引脚为输出端。在光电耦合器输入端加电信号使发光源发光,光的强度取决于激励电流的大小,此光照射到封装在一起的受光器上后,因光电效应而产生光电流,由受光器输出端引出,这样就实现了电一光一电的转换。2.4键盘设置电路本系统选择4*4矩阵键盘作为输入部分,用来输入预设温度、开启与关闭加热、调节时间等。4*4矩阵键盘内部电路及实物图如图6所示,每行4个按键的一端连在一起,每列也连在一起,通过选择行与列就能判断出究竟是哪个键按下。图64*4矩阵键盘其中数字键用于设定温度值。另外4个键分别用来控制加热、调整时间模式选择键、时间加、时间减,还有两个键暂时保留功能。LCD显示电路本系统采用LCD1602显示温度值与时间。如图7所示。LCD1602液晶显示模块可以和单片机STC89C52直接接口,电路如图8所示。通过LCD1602显示预设以及实际的温度,并能显示加热管现在处于的状态是加热还是停止加热,并附加显示时间。图7LCD1602图8LCDproteus仿真图2.6报警电路本系统采用简易的报警电路进行报警,仿真图如图9所示。设计思想为当预设温度不在所期望的范围(30—50度)内,则蜂鸣器发出警报,若实际温度大于50度则亮黄灯进行提醒,若实际温度小于30度则亮绿灯进行提醒。图9报警电路的仿真五、软件系统设计1、程序框架结构一个整体的系统软件设计是由各个在系统里起着不同作用的模块整合在一起,从而实现系统的所要实现的功能。本系统包括主控制程序,键盘扫描程序,温度采集程序,时间显示与调整程序,PID算法程序,LCD显示程序。结构框架图如图10所示。主程序模块键盘扫描LCD显示DS18B20采集温度PID计算继电器工作图10系统程序框架主程序模块相当于调度室,对子程序模块的调用进行管理,它主要负责初始化IO口;等待键盘的被按下,并调用相应的模块进行处理;显示温度控制过程及时间;在适当的时候通过DS18B20检测实际温度,并与所设定的值进行比较,判断报警并通过调用PID算法处理数据,处理后来控制继电器的通断,从而控制热电管达到控制温度的目的。2、主程序模块由于模块化程序的设计,通过调用程序即可实现所用功能,主程序 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 图如图11所示。图11主程序流程图图12键盘扫描流程图主程序见附件一。3、按键程序本系统采用4*4键盘,键盘扫描的思想是首先判断是否真的有键按下,然后开始判断究竟是哪一个键按下。具体思路是先给P1口置成0xf0,若有键按下,则P0口的电平发生变化,然后依次置P1口为0xfe,0xfd,0xfb,0xf7,找出是哪一行有键按下,行找到后再确定是该行的哪列被按下,最终找到键值。程序流程图如图12所示。按键程序见附件一。4、LCD显示程序1602液晶模块内部的控制器共有11条控制指令,如 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 1所示:序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*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级的,因此该子程序中的延时程序需要区别于LCD显示的延时程序。只要严格按照时序图写程序,DS18B20即可运行。DS18B20温度采集程序间附件一。6、PID计算和继电器控制程序前面已经提到PID是一种线性控制器,因此本系统PID控制的思路是在第一次PID调节时记下PID调节器的输出值uk0(该值为以后PID调节器输出地最大值),并以该值为参考,以后的输出uk与uk0做比值,假设uk0表示加热a,那么输出uk与uk0比值表示加热a*uk/uk0时间,以此类推,最后算出每次计算应该加热的时间作用于继电器,控制加热管加热。由于温度变化缓慢,则设置为5s计算PID一次。另外本系统的PID采用了开关量计算—积分分离相结合的改进PID算法,具体思路是当温差大于等于15度时不用PID直接进行开关控制。当温度在0-15度之间时才采用PID计算。具体程序如下:(1)PID计算voidPID(void){floatek,ek1,ek2,ek_sum;uinta;ek=K-temp;//计算误差while(1){if(ON_OFF==1)//温控开关开{if(ek>=15){outflag=1;OUT=0;Time_on=100;break;}//温差大于15度,不用PID调节elseif(ek<0){ek=0;outflag=0;OUT=1;Time_on=0;break;}//温差小于等于0不调节else{if(ek>5)a=0;if(ek<5)a=1;ek2=ek1;ek1=ek;ek_sum+=ek;uk=kp*ek+ki*ek_sum+kd*(ek1-ek2);//计算PID输出ukif(start_flag==0)//PID运算标志位{uk0=uk;//uk初值,用于参考以后uk加热时间start_flag=1;div=100/uk0;}//开始PID计算elseif(start_flag==1){//加热片加热时间Time_on=uk*div;OUT=0;outflag=1;}break;}}else{outflag=0;OUT=1;break;}//不加热}}(2)5s调用一次PID函数//控制加热片加热时间if(TIM>Time_on)//模拟迟滞{OUT=1;outflag=0;}if(TIM>=100)//5s进行一次PID计算{PID();TIM=0;}7、附加时间显示程序考虑到实际的温度控制系统如果加上显示时间的功能能够获得更好的应用,故在此系统中加上了显示时间的功能。主要是运用了AT89C52的定时器的功能,每50ms中断一次,进行时间的设置。时间显示程序见附件一。六、MATLAB/SIMULINK仿真部分1、理论分析由于经过PID后计算出的控制量控制每次加热棒的加热时间,即对应所提供的热量。所以主要计算被测温度与供热之间的传递函数。设水温为T,环境温度(干扰)为T0,供热量Q1=I2RQ2=KrA(T-T0)式中:Kr为散热系数;A为散热面积。能量平衡式:Q1-Q2=GCpdTdt(1)式中:G为水的质量;CP为水的比热。将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参数的计算。由于Kr(单位:W/(m2·K))散热系数计算很复杂,且更多用于大面积水域散热计算,对我们这次实验意义不大,所以我将散热系数换为由水本身性质决定的导热系数λ(单位:W/(m·K)),所以KrA换为λd,d为水层宽度。查书可得20C°时水的导热系数为5.99W/(m·K),假设水杯内水的高度和宽度约等于12cm,杯内水质量G约为100g,水比热Cp为4.2*103J/kg。由此可算出K1=13.9,Tc=5843.05。所以得被测温度与供热之间的传递函数W1S=13.91+5843.05s所用加热棒为150W,经过PID算法后所得的为一个周期内加热的时间,设一周期为5秒,有100个可控高低电平,故在PID环节之后需乘系数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=1,D=0效果很差,问题出在一开始系统输入的温度差值很大,导致积分项很大,积分饱和,所以会产生很难稳定的现象,所以减小I。P=32,I=0.01,D=0效果较好,稳态误差基本消失,但此时的积分环节作用已经很小。在实际制作中可采取抗饱和积分,变速积分等方法去掉这个问题。后面matlab仿真部分将对抗饱和积分做更多介绍。后来我继续尝试加入微分控制,但是没有获得更好的效果,所以选择PI调节。4、MATLAB仿真matlab仿真采用了抗饱和积分法,当系统存在一个方向的误差时,由于积分的累加作用会使控制量一直增大,可能会使控制量达到执行器的执行阈值,如果此时误差的方向发生改变,控制量会逐渐减小,控制量也会退出饱和区,执行器也会在阈值内执行;如果此时误差方向还是没有改变,控制量会继续增大但是执行器会一直保持在阈值,此时控制量就进入了饱和区。进入饱和区越深,退出饱和区时间就会越长,在饱和区时执行器会一直在阈值位置,如果误差发生反向,执行器不会立刻有反应,控制量会慢慢减小,等执行器推出饱和区才会有反应。这样就会使控制的动态响应变差,控制性能变差。抗积分饱和算法的思路为,在计算u(k)时,首先判断u(k-1)是否超出范围,若u(k-1)>Umax,则只累加负的误差;若u(k-1)=umiferror(k)>0alpha=0;elsealpha=1;endelseifu(k)<=-umiferror(k)>0alpha=1;elsealpha=0;endelsealpha=1;endalpha为积分项的系数,为1时则累加积分项,为0时不累加。传递函数还用之前计算结果,上图为温度的输出结果,中图为控制量,下图为积分项。可看出与simulink仿真基本一致,为看出抗饱和积分的效果所以将积分项加大未加入抗饱和积分kp=32;ki=5;加入抗饱和积分后可看出加入抗饱和积分后超调量明显下降,抗饱和积分可以使系统稳定性得到改善。.m源程序:%PIDControlerwithintergrationsturationclearall;closeall;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;%StepSignalfork=1:1:600time(k)=k*ts;u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PIDControllerifu(k)>=umu(k)=um;endifu(k)<=-umu(k)=-um;end%Linearmodel%yout(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3;yout(k)=-den(2)*y_1+num(2)*u_1;error(k)=rin-yout(k);M=1;ifM==1%Usingintergrationsturationifu(k)>=umiferror(k)>0alpha=0;elsealpha=1;endelseifu(k)<=-umiferror(k)>0alpha=1;elsealpha=0;endelsealpha=1;endelseifM==2%Notusingintergrationsturationalpha=1;end%ReturnofPIDparametersu_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);%CalculatingPx(2)=(error(k)-error_1)/ts;%CalculatingDx(3)=x(3)+alpha*error(k)*ts;%CalculatingIxi(k)=x(3);endfigure(1);subplot(311);plot(time,rin,'b',time,yout,'r');xlabel('time(s)');ylabel('Tempereturetracking');subplot(312);plot(time,u,'r');xlabel('time(s)');ylabel('Controlleroutput');subplot(313);plot(time,xi,'r');xlabel('time(s)');ylabel('Integration');七、PROTEUS仿真部分系统整体仿真图如图13所示图13水温控制系统整体proteus仿真图图14系统开启电源仿真图八、结论及心得体会1、实验结论由以上的实验数据和实验对比分析可以得到PID各个环节的作用:比例系数KP决定控制作用的强弱,KP加大时可减少系统的稳态误差,提高系统的动态响应速度,但KP过大会引起振荡或导致系统不稳定。积分项Ki/S用于消除系统的稳态误差,但积分项会使动态过程变慢,增大系统的超调量,使系统的稳定性变坏。微分KdS的控制作用与偏差的变化速度有关。微分能产生超前的校正作用,有助于减少超调和振荡,并能减少调整时间,从而改善系统的动态性能。在实验过程中,用的是试凑法进行PID参数整定。通过实验大概体验出试凑法进行PID参数整定的步骤,如下:(1)首先只整定比例部分。比例系数KP由小变大,观察相应的系统响应,直到得到反应快,超调小的响应曲线。系统若无稳态误差或稳态误差已小到允许范围内,并且响应效果良好,那么只须用比例调节器即可。(2)若稳态误差不能满足设计要求,则需加入积分控制。整定时先置积分时间Ti为一较大值,并将经第1步整定得到的KP减小些,然后减小Ti,并使系统在保持良好动态响应的情况下,消除稳态误差。这种调整可根据响应曲线的状态,反复改变KP及Ti,以期得到满意的控制过程。(3)若使用PI调节器消除了稳态误差,但动态过程仍不能满意,则可加入微分环节。在第2步整定的基础上,逐步增大TD,同时相应地改变KP和Ti,逐步试凑以获得满意的调节效果。2、心得体会本次历时近两周的计算机控制课程设计即将画上圆满的句号。从最开始的选题,本来想选择的是小型无人直升机飞行高度的控制系统设计,查阅了大量资料,但是最终因为对直升机模型的不熟悉,很难进行系统建模分析及仿真,无奈放弃。最终我选择的是与我们生活非常接近的水温自动控制系统。从确定课题到查阅大量相关资料,第一次发现自己的所学能有所用,能够在生活实际中解决问题,让我兴奋不已。硬件的设计问题并不多,因为上学期学过单片机课程,所以整个过程比较顺利。其次是软件系统的搭建,在编写程序时,一些子模块都是在网上找的现成的,为此省去了不少时间和精力。MATLAB的仿真时比较得心应手的,因为之前的许多课程都是用的MATLAB或者MULTISIM进行仿真实验的,自动化专业实验也进行过PID的参数整定,所以也比较顺利。PROTEUS是我新掌握的一个软件,对它的学习花去近两天的学习时间,然后我利用PROTEUS进行了电路的搭接仿真,可能是没有实物的操作,仿真结果不是十分正确,只进行了简单搭接和电源开启检查了一下能否正常工作。最后由于时间有限,不能进行硬件的焊接调试,做出实物,将理论带入实践中去,是比较遗憾的。总的来说通过这次课程设计我收获到了很多东西,软件、硬件、甚至是对电子课程设计信心倍增,虽然期间遇到各种问题,但是最后经过自己的努力都能够解决,不仅提高了自己的技能,也看到了自己的不足,这次课程设计定让我进入了电子设计的新阶段。最后,感谢老师和同学在此次计算机课程设计中给我的帮助。八、参考文献《过程控制系统》,黄德先、王京春、金以慧编著,清华大学出版社。《计算机控制系统》,高金源、夏洁编著,清华大学出版社。《检测原理》,施文康、余晓芬主编,机械工业出版社。《单片机原理与应用》,戴胜华、蒋大明主编,北京交通大学出版社。《数字电子技术基础》,侯建军主编,高等教育出版社。《自动控制原理》,蒋大明、戴胜华主编,北京交通大学出版社。附件一:恒温箱控制系统源程序#include#include//空操作_nop_头文件#defineucharunsignedchar#defineuintunsignedint#defineBUSY0x80//lcd忙检测标志#defineDATAPORTP0//定义P0口为LCD通讯端口sbitBUZZER=P3^4;sbitP1_0=P1^0;//时钟调整P0口sbitP1_1=P1^1;//时钟加P1口sbitP1_2=P1^2;//时钟减P2口sbitled1=P3^2;sbitled2=P3^3;sbitDQ=P3^6;//定义ds18b20通信端口sbitLCM_RS=P2^0;//数据/命令端sbitLCM_RW=P2^1;//读/写选择端sbitLCM_EN=P2^2;//LCD使能信号sbitOUT=P3^7;//光耦、继电器驱动信号ucharseconde=0;//定义并初始化时钟变量ucharminite=0;ucharhour=12;ucharmstcnt=0;//时间计时中断变量ucharidatavalue[2];//存储键盘输入值ucharbuff,times,j;//用来处理按键值的全局变量uchartemp1,temp2,temp;//温度显示变量temp1为整数部分,temp2为小数部分,temp为实际温度ucharset;//定义全局变量set为工作模式选择floatK;//设定的温度bitON_OFF=0;//加热键控制总开关bitoutflag;//温控标志,为1时表示加热,LCD上用|表示;为0时表示不加热,LCD上用^表示unsignedintTIM;//PID计时中断变量bitstart_flag=0;//开始PID运算标志位bitstart_key=0;//设置软件输入设定初值标志位floatdiv,kp=1.5,kd=1;//用于PID计算的变量floatki=0.01;floatuk,uk0;uintTime_on;//控制加热片加热时间ucharcodestr0[]={"---::---"};//显示字符串ucharcodestr1[]={"SET:CTP:.C"};ucharcodedigit[]={"0123456789"};//显示键值voiddelay_LCM(uint);//LCD延时子程序voidinitLCM(void);//LCD初始化子程序voidlcd_wait(void);//LCD检测忙子程序voidWriteCommandLCM(ucharWCLCM,ucharBusyC);//写指令到LCD子函数voidWriteDataLCM(ucharWDLCM);//写数据到LCD子函数voidDisplayOneChar(ucharX,ucharY,ucharDData);//显示指定坐标的一个字符子函数voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//显示指定坐标的一串字符子函数voidinit_timer0(void);//定时器初始化voiddisplayfun1(void);//显示模式子函数voiddisplayfun2(void);voiddisplayfun3(void);voidkeyscan(void);//键盘扫描子程序voidkeydown(void);//判断按键按下子程序voidset_adj(void);//设定工作模式子程序voidinc_key(void);//时钟加子程序voiddec_key(void);//时钟减子程序voiddelay_18B20(unsignedinti);//18B20延时子程序voidInit_DS18B20(void);//18B20初始化子程序ucharReadOneChar(void);//向18B20度数据子函数voidWriteOneChar(unsignedchardat);//往18b20写一个数据子函数voidReadTemperature(void);//从18B20读温度子函数voidPID(void);//PID计算子程序/*********延时K*1ms,12.000mhz**********/voiddelay_LCM(unsignedintk){unsignedinti,j;for(i=0;i0;i--){DQ=0;//给脉冲信号dat>>=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;//如果DQ=1,则写1delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/voidWriteOneChar(uchardat){unsignedchari=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;delay_18B20(5);DQ=1;dat>>=1;//右移}}/**************读取ds18b20当前温度************/voidReadTemperature(void){unsignedchara=0;unsignedcharb=0;unsignedchart=0;Init_DS18B20();//18B20初始化WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换delay_18B20(100);//转换需要一点时间,延时Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);//读取温度寄存器前两个就是温度地位和高位delay_18B20(100);a=ReadOneChar();//读取温度值低位b=ReadOneChar();//读取温度值高位temp1=b<<4;temp1+=(a&0xf0)>>4;//temp1为温度数据高6位,即温度的整数部分temp2=a&0x0f;//temp2为温度数据地4位,即温度的小数部分(测得数据乘以即为实际温度)temp=((b*256+a)>>4);//当前采集温度值除16得实际温度值}/***************液晶显示子函数1正常显示*****************/voiddisplayfun1(void){WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(3,0,hour/10+0x30);//液晶上显示小时DisplayOneChar(4,0,hour%10+0x30);DisplayOneChar(6,0,minite/10+0x30);//液晶上显示分DisplayOneChar(7,0,minite%10+0x30);DisplayOneChar(9,0,seconde/10+0x30);//液晶上显示秒DisplayOneChar(10,0,seconde%10+0x30);DisplayOneChar(4,1,digit[value[0]]);DisplayOneChar(5,1,digit[value[1]]);//液晶上显示预设的温度DisplayOneChar(11,1,temp1/10+0x30);//液晶上显示测得的温度DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2/10+0x30);//temp2不显示不知道为什么if(ON_OFF==0)//若温控标志为0{DisplayOneChar(15,0,'N');//液晶上显示不控温的标志N}elseif(ON_OFF==1){DisplayOneChar(15,0,'Y');//液晶上显示控温的标志Yif(outflag==1)DisplayOneChar(0,0,'|');//控温,|表示加热elseif(outflag==0)DisplayOneChar(0,0,'^');//控温,^表示不加热}}/************液晶显示子函数2***************/voiddisplayfun2(void){WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(6,0,minite/10+0x30);DisplayOneChar(7,0,minite%10+0x30);DisplayOneChar(9,0,seconde/10+0x30);DisplayOneChar(10,0,seconde%10+0x30);DisplayOneChar(11,1,temp1/10+0x30);DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2/10+0x30);WriteCommandLCM(0x0f,1);//显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30);}/**************液晶显示子函数3*****************/voiddisplayfun3(void){WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30);DisplayOneChar(9,0,seconde/10+0x30);DisplayOneChar(10,0,seconde%10+0x30);DisplayOneChar(11,1,temp1/10+0x30);DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2/10+0x30);WriteCommandLCM(0x0f,1);//显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(6,0,minite/10+0x30);DisplayOneChar(7,0,minite%10+0x30);}/**************设定工作模式子函数****************/voidset_adj(void){delay_LCM(50);set++;if(set>=3)set=0;//3种工作模式:正常、调时、调分}/****************按键加法子函数******************/voidinc_key(void){delay_LCM(50);switch(set){case0:if(P1==0x18)ON_OFF=!ON_OFF;break;//加热控制总开关case1:hour++;if(hour>=23)hour=23;break;case2:minite++;if(minite>=59)minite=59;break;default:break;}}/****************按键减法子函数*****************/voiddec_key(void){delay_LCM(50);switch(set){case0:if(P1==0x18)ON_OFF=!ON_OFF;break;case1:hour--;if(hour<=0)hour=0;break;case2:minite--;if(minite<=0)minite=0;break;default:break;}}/***************定时器t0初始化*******************/voidinit_timer0(void){TMOD=0x01;//time0为定时器,方式1TH0=0x3c;//预置计数初值50ms中断一次TL0=0xb0;EA=1;ET0=1;TR0=1;}/***********定时器t0中断子函数**************/voidtimer0(void)interrupt1using0//定时器0方式1,50ms中断一次{TIM+=1;//PID计时中断TH0=0x3c;TL0=0xb0;mstcnt++;if(mstcnt>=20){seconde++;mstcnt=0;}if(seconde>
本文档为【北京交通大学-计算机控制课程设计报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
电气工程师
暂无简介~
格式:doc
大小:1MB
软件:Word
页数:50
分类:农业
上传时间:2023-02-17
浏览量:0