计算机控制系统课程设计报告_第1页
计算机控制系统课程设计报告_第2页
计算机控制系统课程设计报告_第3页
计算机控制系统课程设计报告_第4页
计算机控制系统课程设计报告_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机控制系统课程设计报告基于PID控制算法的电阻加热炉温度控制系统设计摘要:温度控制是人们日常生活中经常遇到的问题,传统的控制方法都存在控制慢,精度低等问题,而计算机控制系统能够利用微型处理器加上科学的控制算法使温度控制实现控制快而且精度高。在本设计中,控制对象为电阻加热炉,通过控制加在电阻丝两端电压的工作时间,从而可控制输入电阻加热炉的功率,继而达到控制其温度的目的。此系统以单片机为核心,采用固态继电器为执行电路,实现对电炉的自动控制。算法采用增量型PID控制。另外本文还阐述了PID控制器的设计,硬件结构和软件设计,实现了一套温度采集和控制的方案。该系统具有硬件成本低,控温精度较高,可靠性

2、好,抗干扰能力强等特点。 关键词:电加热炉;单片机;温度控制;PID算法1、单片机温度控制系统方案简介单片机温度控制系统是数控系统的一个简单应用。在冶金、化工、建材、机械、食品、石油等各类工业中,广泛使用着加热炉、热处理炉、反应炉等,因此,温度是工业对象中一个主要的被控参数。由于炉子的种类不同,因而所使用的燃料和加热方法也不同,例如煤气、天然气、油、电等;由于工业不同,所需要的温度高低不同,因而所采用的测温原件和测温方法也不同;产品工业不同,控制温度的精度也不同,因而对数据采集的精度和所采用的控制算法也不同。本系统所使用的加热炉为电加热路,炉丝功率为2kw,系统要求测试水杯恒温,误差为,超调量

3、尽可能小,温度上升较快且有良好的稳定性。单片机温度控制系统是以STC89C52RC单片机为控制核心,辅以采样反馈电路,驱动芯片,固态继电器对电炉进行控制的微机控制系统。其系统结构框图可表示为:系统采用单闭环形式,其基本控制原理为:将温度设定值(即输入控制量)和温度反馈值同时送入控制电路部分,然后经过单片机运算得到输出控制量,输出控制量控制I/O得到一定占空比的PWM波控制固态继电器,固态继电器接通220V市电给电炉,调节PWM占空比使电炉达到一定的温度。其控制系统框图如图1-1所示。图1-1 系统框图2、单片机简介STC89C52是STC公司生产的一种低功耗、高性能CMOS 8位微控制器,具有

4、8K在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,有512字节RAM,32位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外STC89C52还可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。其直插式芯片

5、引脚图及内部结构如图2-1图所示。图 2-1STC89C52单片机具体信息如下:1. 增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051;2. 工作电压:5.5V3.3V(5V单片机)/3.8V2.0V(3V单片机);3.工作频率范围:040MHz,相当于普通8051的080MHz,实际工作频率可达48MHz4. 用户应用程序空间为8K字节;5. 片上集成512 字节RAM;6. 通用I/O口(32个),复位后为:P0/P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。7

6、. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程 序,数秒即可完成一片;8. 具有EEPROM 功能;9. 共3个16位定时器/计数器,即定时器T0、T1、T2;10.外部中断4路,下降沿中断或低电平触发电路,Power Down 模式可由外部中断低电平触发中断方式唤醒;11. 通用异步串行口(UART),还可用定时器软件实现多个UART;12. 工作温度范围:-40+85(工业级)/075(商业级);13. PDIP封装。STC89C52芯片实物图如下图所示:3 硬件电路设计3.1测温电路采用D

7、S18B20数字式温度传感器。DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化,低功耗,高性能,抗干扰能力强,易配微处理器等优点,可直接将温度转化成数字信号处理器处理。测量的温度范围是55125,测温误差0.5。可编程分辨率912位,对应的可分辨温度分别为0.5,0.25,0.125和0.0625。相较热电偶传感器而言可实现高精度测温3.2矩阵键盘采用的按键是独立的立式4引脚按键。3.3显示电路采用的是共阴极7段数码管。由于一般的数码管每一段亮至少需要10个毫安的电流,而单片机的I/O口送不出如此大的电流,所以我们需要加数码管的驱动电路,可以

8、用上拉电阻的方法,也可以使用专门的驱动芯片。由于我们使用的开发板使用的是74HC573,其输出电流较大,足够点亮数码管。3.4执行电路SSR-40 DA固态继电器4系统软件设计4.1软件程序设计整个温度控制系统的软件程序由主程序、中断服务程序和子程序三部分组成。其中主程序主要是对系统的运行进行初始化,包括实现各种参数的初始化,使显示,键盘,报警装置等部分开始工作,最后是控制电加热炉的正常运行。而系统初始化包括设置控制量的初始值、采样周期、中断方式和状态、定时器的工作状态,中断的开关等。主程序中也要实现数据采集的任务,通过调用数据采集的子函数,检测出电加热炉的炉温信号,讲采集到的温度值显示到数码

9、管上,同时调用键盘设置的子函数,获取设置的温度,显示在数码管的另外三位,最后根据采集到的温度,与设定温度值,调用PID算法子函数,进行PID计算,输出的结果进入到中断函数中,以影响、产生的PWM波的占空比,从而就可利用PWM波对炉温进行控制。主程序流程图如下图所示。开始系统控制参数的初始化化电阻加热炉的实时温度采集和设置温度的获取实际温度与设置温度的显示以及报警装置的工作与否实际温度与设定温度差值是否大于5? Y调用PID算法全功率加热开定时器中断显示子程序:开始数据转换为七段码译码选择显示位子程序返回PWM波子程序:进入中断程序timer=0Timer=PID结果? NYIO口输出0IO口输

10、出1Timer+,Timer=100? N返回采样温度4.2算法设计电阻加热炉是一个非线性、时变系统,所以在本控制系统中采用的是智能控制算法,即PID控制算法,通过对于设定温度与实际温度的差值的比例,微分,积分三者结合得到的算法结果来控制执行机构的执行状态,从而可以让控制系统中的控制时间,超调量,滞后反应以及最后的稳定程度都能有较明显的改善。4.2.1 PID算法参数整定在PID算法中,最重要的就是对于三个控制参数即KP,KI,KP的整定,以下是PID的整定过程。整定方法:临界比例度法1. 构建闭环回路,确定稳定极限。2. 根据公式计算控制器参数。稳定极限是由P原件决定的。当出现稳态振荡时就达

11、到这个极限。产生临界振荡增益K和临界振荡周期T。确定两个参数之后通过下表来确定其他参数。首先建立闭环系统,采用阶跃输入,不加PID控制器及其仿真输出,如下图所示:先使积分和微分系数为0,即只有比例控制,调节P参数,使系统出现稳态振荡,当时,等到下图所示曲线:由上图可知,临界振荡增益:K=1.5;临界振荡周期T=750.35-447.25=303.1,计算PID参数如下:输入相应PID参数得到如下输出:由上面输出结果可知,还有一定的超调量,所以将积分系数适当减小,比例和微分系数进行微调,最后当时曲线如下图所示。5、控制系统测试过程5.1开环测试5.1.1 开环测试1设定温度T:60进入±

12、;2时间t:860 S最大超调量:测试曲线图如下图所示:5.1.2 开环测试2设定温度T:60进入±2时间t:840 S最大超调量:测试曲线图如下图所示:5.2 PID参数调节5.2.1最终PID参数及测试曲线设定温度T:60进入±2时间t:600 SPID参数:P=0.9,I=0.005,D=33最大超调量:测试曲线图如下图所示:设定温度T:60进入±2时间t:640 SPID参数:P=0.9,I=0.005,D=33最大超调量:测试曲线图如下图所示:5.2.2最终PID参数测试其他温度设定温度T:80进入±2时间t:320 SPID参数:P=0.9,

13、I=0.005,D=33最大超调量:测试曲线图如下图所示:5.2.3 进入PID温度调节的测试55时进入PID调节设定温度T:60进入±2时间t:860 SPID参数:P=0.9,I=0.005,D=33最大超调量:测试曲线图如下图所示:50时进入PID调节设定温度T:60进入±2时间t:680 SPID参数:P=0.9,I=0.005,D=33最大超调量:测试曲线图如下图所示:57时进入PID调节设定温度T:60进入±2时间t:700 SPID参数:P=0.9,I=0.005,D=33最大超调量:测试曲线图如下图所示:5.2.4 其他PID温度调节的测试设定温度

14、T:60进入±2时间t:940 SPID参数:P=1.2,I=0.005,D=33最大超调量:测试曲线图如下图所示:设定温度T:60进入±2时间t:820 SPID参数:P=1.7,I=0.015,D=650最大超调量:测试曲线图如下图所示:设定温度T:60进入±2时间t:980 SPID参数:P=2.2,I=0.015,D=650最大超调量:测试曲线图如下图所示:设定温度T:60进入±2时间t:400 SPID参数:P=2.5,I=0.015,D=650最大超调量:测试曲线图如下图所示:设定温度T:60进入±2时间t:620 SPID参数:P

15、=2.5,I=0.015,D=650最大超调量:测试曲线图如下图所示:6、单片机程序清单:#include<reg52.h>#include <intrins.h>#include<math.h> #include<string.h> #define uchar unsigned char#define uint unsigned intsbit PWM=P21; /控制产生PWM波sbit DS=P22; /连接DS18B20传感器sbit beep=P23; /控制蜂鸣器接口sbit dula=P26; /段选控制接口sbit wela=P2

16、7; /位选控制接口unsigned int temp,shangxian,xiaxian,max_temp=1000,min_temp=0; unsigned char adval; / sign of the result positive or negativeunsigned int i=100;unsigned int j,k,temp,key1,key2,key3,key11,set_temper,timer1,num1;double PID;unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f

17、,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/0-f 不带小数点编码unsigned char code table1=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef; / 带小数点编码。unsigned int rout; / PID 输出 unsigned int rin; / PID 输入(实际温度)unsigned int realtemp; unsigned int Proportion; / 比例常数unsigned int Integral; / 积分常数unsigned int Derivativ

18、e; / 微分常数 unsigned int TError; / 温度误差unsigned int TDerror; /温度误差的误差unsigned int Tout; /温度输出值/* 函 数 名 : PIDInit()* 函数功能 : PID参数初始化* 输 入 : 无* 输 出 : 无*/void PIDInit ( void ) realtemp=rin;TError=0;TDerror=0;Proportion = 1.2; / 设置PID参数 Integral =0.005; Derivative =33; Tout = 0 ; / 设置PID定点 Set PID Setpoin

19、t /* 函 数 名 : PIDCalc()* 函数功能 : PID计算* 输 入 : rin:实际温度* 输 出 : Tout*/unsigned int PIDCalc( unsigned int rin ) /NextPoint=rin,监测到的温度 unsigned int ddError,dError,Error;realtemp= rin; Error = set_temper - realtemp; / 温度的偏差dError= Error-TError; /温度偏差的偏差ddError=dError-TDerror; /温度偏差的偏差的偏差TError=Error;TDerro

20、r=dError;Tout=Tout+(Proportion*dError+Integral*Error+Derivative*ddError);if (Tout>max_temp-1)Tout=max_temp;if (Tout<0)Tout=0;return (Tout);/* 函 数 名 : delay()* 函数功能 : 短延时函数* 输 入 : i* 输 出 : 无*/void delay(uchar i) for(j=i;j>0;j-) for(k=125;k>0;k-);void dsreset(void) /发送初始化及复位信号 uint i; /DS1

21、8B20 初始化 DS=0; i=103; while(i>0)i-; DS=1; i=4; while(i>0)i-;bit tmpreadbit(void) /read a bit读一位 uint i; bit dat; DS=0;i+; /i+ for delay 小延时一下 DS=1;i+;i+; dat=DS; i=8;while(i>0)i-; return (dat);uchar tmpread(void) /read a byte date 读一个字节 uchar i,j,dat; dat=0; for(i=1;i<=8;i+) j=tmpreadbit

22、(); dat=(j<<7)|(dat>>1); /读出的数据最低位在最前面,这样刚好一个字节在DAT里 return(dat); /将一个字节数据返回void tmpwritebyte(uchar dat) /写一个字节到 DS18B20 里 uint i; uchar j; bit testb; for(j=1;j<=8;j+) testb=dat&0x01; dat=dat>>1; if(testb) /write 1 写1部分 DS=0; i+;i+; DS=1; i=8;while(i>0)i-; else DS=0; /wri

23、te 0 写0部分 i=8;while(i>0)i-; DS=1; i+;i+; void tmpchange( ) /DS18B20 begin change 发送温度转换命令 dsreset(); /初始化 DS18B20 delay(2); /延时 tmpwritebyte(0xcc); /跳过序列号命令 tmpwritebyte(0x44); /发送温度转换命令/* 函 数 名 : tmp()* 函数功能 : 返回温度函数* 输 入 : 无* 输 出 : temp:当前温度*/uint tmp() /get the temperature 获得温度 float tt; uchar

24、 a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe);/发送读取数据命令 a=tmpread(); /连续读两个字节数据 b=tmpread(); temp=b; temp<<=8; /two byte compose a int variable temp=temp|a; /两字节合成一个整型变量。 tt=temp*0.0625;/得到真实十进制温度值,因为 DS18B20可以精确到 0.0625 度,所以读回数据的最低位代表的是0.0625 度。 temp=tt*10+0.5; /放大十倍,这样做的目

25、的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。 return temp;/返回温度值/* 函 数 名 : display()* 函数功能 : 数码管显示* 输 入 : num:设置温度,temp:实际温度* 输 出 : 无*/void display(unsigned int num,unsigned int temp) /num和temp都是一个三位数,如392,则实际温度为39.2度unsigned int A1,A2,A3,A2t ;unsigned int B1,B2,B3,B2t ; A1=num/100; A2t=num%100; A2=A2t/10; A3=A2

26、t%10; B1=temp/100; B2t=temp%100; B2=B2t/10; B3=B2t%10;/*/温度显示 dula=0; P0=tableB1;/显示十位 dula=1; dula=0; wela=0; P0=0x7e; wela=1; wela=0; delay(1); dula=0; P0=table1B2;/显示个位 dula=1; dula=0; wela=0; P0=0x7d; wela=1; wela=0; delay(1); dula=0; P0=tableB3;/显示小数点后一位 dula=1; dula=0; P0=0x7b; wela=1; wela=0;

27、 delay(1); /*预设温度显示 dula=0; P0=tableA1;/显示十位 dula=1; dula=0; wela=0; P0=0xf7; wela=1; wela=0; delay(1); P0=0xff; dula=0; P0=table1A2;/显示个位 dula=1; dula=0; wela=0; P0=0xef; wela=1; wela=0; delay(1); P0=0xff; dula=0; P0=tableA3;/显示小数点后一位 dula=1; dula=0; P0=0xdf; wela=1; wela=0; P0=0xff; delay(1); /*/*

28、 函 数 名 : jiance()* 函数功能 : 矩阵键盘检测函数* 输 入 : 无* 输 出 : key:设定温度值*/unsigned int jiance()P3=0xfe; /给 P3.0 送低电平,其余为高电平 temp=P3; /把 P3 口数据读回来 temp=temp&0xf0; /把 P3 口与 11110000 相与 if(temp!=0xf0) delay(10); /延时去抖动 if(temp!=0xf0) /再次判断是否有键按下 temp=P3; /判断为有,再次读 P3 口数据 switch(temp) /因为我们刚才是将第一行置的低 /在这里再判断是第几

29、列 case 0xee: key1=key1+1; break; case 0xde: key1=key1-1; break; case 0x7e: key1=0; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; P3=0xfd; /1111 1101 /按键第二行 temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xed: key2=key2+1; brea

30、k; case 0xdd: key2=key2-1; break; case 0x7d: key2 =0; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; P3=0xfb; /1111 1011 /按键第三行 temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xeb: key3=key3+1; break; case 0xdb: key3=key3-1; br

31、eak; case 0x7b: key3 =0; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; set_temper=key1*100+key2*10+key3*1;return set_temper;/* 函 数 名 : main()* 函数功能 : 主程序* 输 入 : 无* 输 出 : 无*/void main() TMOD = 0x01; /设置定时计数器工作方式1为定时TH0 = 0xFE; TL0 = 0x0C;ET0 = 1; /开启定时器0中断EA = 1;dula=0; /段选 dula=P26; wela=0; /位选 wela=P27;set_temper=600; /设置温度为31.4度,设置成没有小数点形式是为了方便计算shangxian=1000;/设置的而温度上限xiaxian=100; /设置的而温度下限key1=set_temper/100;key11=set_temper%1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论