51系列单片机闭环温度控制实验报告.docx
- 文档编号:5239101
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:22
- 大小:165.23KB
51系列单片机闭环温度控制实验报告.docx
《51系列单片机闭环温度控制实验报告.docx》由会员分享,可在线阅读,更多相关《51系列单片机闭环温度控制实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
51系列单片机闭环温度控制实验报告
成绩:
重庆邮电大学
自动化学院综合实验报告
题目:
51系列单片机闭环温度控制
学生姓名:
蒋运和
班级:
学号:
同组人员:
李海涛陈超
指导教师:
郭鹏
完成时间:
2013年12月
一、实验名称:
51系列单片机闭环温度控制实验
——基于Protuse仿真实验平台实现
基本情况:
1.学生姓名:
蒋运和
2.学号:
3.班级:
4.同组其他成员:
序号
姓名
班级
学号
1
李海涛
2
陈超
二、实验内容(实验原理介绍)
1、系统基本原理
计算机控制技术实训,即温度闭环控制,根据实际要求,即加温速度、超调量、调节时间级误差参数,选择PID控制参数级算法,实现对温度的自动控制。
闭环温度控制系统原理如图:
2、PID算法的数字实现
本次试验通过8031通过OVEN是模拟加热的装置,加一定的电压便开始不停的升温,直到电压要消失则开始降温。
仿真时,U形加热器为红色时表示正在加热,发红时将直流电压放过来接,就会制冷,变绿。
T端输出的是电压,温度越高,电压就越高。
8031对温度的控制是通过可控硅调控实现的。
可控硅通过时间可以通过可控硅控制板上控制脉冲控制。
该触发脉冲想8031用软件在P1.3引脚上产生,受过零同步脉冲后经光偶管和驱动器输送到可控硅的控制级上。
偏差控制原理是要求对所需温度求出偏差值,然后对偏差值处理而获得控制信号去调节加热装置的温度。
PID控制方程式:
式中e是指测量值与给定值之间的偏差
TD微分时间
T积分时间
KP调节器的放大系数
将上式离散化得到数字PID位置式算法,式中在位置算法的基础之上得到数字PID
增量式算法:
3、硬件电路设计
在温度控制中,经常采用是硬件电路主要有两大部分组成:
模拟部分和数字部分,对这两部分调节仪表进行调节,但都存在着许多缺点,用单片机进行温度控制使构成的系统灵活,可靠性高,并可用软件对传感器信号进行抗干拢滤波和非线性补偿处理,可大大提高控制质量和自动化水平;总的来说本系统由四大模块组成,它们是输入模块、单片机系统模块、计算机显示与控制模块和输出控制模块。
输入模块主要完成对温度信号的采集和转换工作,由温度传感器及其与单片机的接口部分组成。
利用模拟加热的装置来控制温度。
程序结构图如下:
3、电路原理图
三、实验结果分析(含程序、数据记录及分析和实验总结等,可附页):
1、51系列单片机直流电机闭环调速实验程序
/*--------------------------------------------------------------------------
REG52.H
Headerfileforgeneric80C52and80C32microcontroller.
Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.
Allrightsreserved.
--------------------------------------------------------------------------*/
#ifndef__REG52_H__
#define__REG52_H__
/*BYTERegisters*/
sfrP0=0x80;
sfrP1=0x90;
sfrP2=0xA0;
sfrP3=0xB0;
sfrPSW=0xD0;
sfrACC=0xE0;
sfrB=0xF0;
sfrSP=0x81;
sfrDPL=0x82;
sfrDPH=0x83;
sfrPCON=0x87;
sfrTCON=0x88;
sfrTMOD=0x89;
sfrTL0=0x8A;
sfrTL1=0x8B;
sfrTH0=0x8C;
sfrTH1=0x8D;
sfrIE=0xA8;
sfrIP=0xB8;
sfrSCON=0x98;
sfrSBUF=0x99;
/*8052Extensions*/
sfrT2CON=0xC8;
sfrRCAP2L=0xCA;
sfrRCAP2H=0xCB;
sfrTL2=0xCC;
sfrTH2=0xCD;
/*BITRegisters*/
/*PSW*/
sbitCY=PSW^7;
sbitAC=PSW^6;
sbitF0=PSW^5;
sbitRS1=PSW^4;
sbitRS0=PSW^3;
sbitOV=PSW^2;
sbitP=PSW^0;//8052only
/*TCON*/
sbitTF1=TCON^7;
sbitTR1=TCON^6;
sbitTF0=TCON^5;
sbitTR0=TCON^4;
sbitIE1=TCON^3;
sbitIT1=TCON^2;
sbitIE0=TCON^1;
sbitIT0=TCON^0;
/*IE*/
sbitEA=IE^7;
sbitET2=IE^5;//8052only
sbitES=IE^4;
sbitET1=IE^3;
sbitEX1=IE^2;
sbitET0=IE^1;
sbitEX0=IE^0;
/*IP*/
sbitPT2=IP^5;
sbitPS=IP^4;
sbitPT1=IP^3;
sbitPX1=IP^2;
sbitPT0=IP^1;
sbitPX0=IP^0;
/*P3*/
sbitRD=P3^7;
sbitWR=P3^6;
sbitT1=P3^5;
sbitT0=P3^4;
sbitINT1=P3^3;
sbitINT0=P3^2;
sbitTXD=P3^1;
sbitRXD=P3^0;
/*SCON*/
sbitSM0=SCON^7;
sbitSM1=SCON^6;
sbitSM2=SCON^5;
sbitREN=SCON^4;
sbitTB8=SCON^3;
sbitRB8=SCON^2;
sbitTI=SCON^1;
sbitRI=SCON^0;
/*P1*/
sbitT2EX=P1^1;//8052only
sbitT2=P1^0;//8052only
/*T2CON*/
sbitTF2=T2CON^7;
sbitEXF2=T2CON^6;
sbitRCLK=T2CON^5;
sbitTCLK=T2CON^4;
sbitEXEN2=T2CON^3;
sbitTR2=T2CON^2;
sbitC_T2=T2CON^1;
sbitCP_RL2=T2CON^0;
#endif
#ifndefWENDU_H_
#defineWENDU_H_
#defineu8unsignedchar
#defineu16unsignedint
#definePULSE200
//////LCD///////
sbitRS=P2^5;
sbitRW=P2^6;
sbitEN=P2^7;
sbitLED=P3^0;
sbitENA=P3^7;
sbitIN2=P3^6;
sbitIN1=P3^5;
voiddelay_ms(u16z);
voidLCD_WriteData(u8Dat);
voidLCD_WriteCOM(u8com);
voidShow_Num(u8x,u8y,u8n,u16num);//n为数字长度num小于等于65535
voidShow_fNum(u8x,u8y,u16num);
voidLCD_Init(void);
voidkey_scan(void);
//voidkey_scan(void);
externu16read_tlc2543(u8port);
#endif
#ifndefTLC2543_H_
#defineTLC2543_H_
//////TLC2543////
sbitSDO=P2^0;
sbitSDI=P2^1;
sbitCS=P2^2;
sbitCLK=P2^3;
sbitEOC=P2^4;
//u16read_tlc2543(u8port);
#defineu8unsignedchar
#defineu16unsignedint
u16read_tlc2543(u8port);
u8AD_deal(void);
#endif
#include
#include"tlc2543.h"
//#include"wendu.h"
voiddelay_us(u16z)
{
u16i;
for(i=z;i>0;i--);;
}
u16read_tlc2543(u8port)
{
staticu8PORT=0;
u8Temp,i,k=0;
u16AD_value=0;
Temp=port;
CS=1;
CLK=0;
delay_us
(1);
Temp<<=4;
CS=0;
while
(1)
{
for(i=0;i<8;i++)
{
CLK=0;
if(Temp&0x80)
SDI=1;
else
SDI=0;
AD_value<<=1;
if(SDO)
AD_value|=0x01;
CLK=1;
delay_us
(2);
Temp<<=1;
}
for(i=8;i<12;i++)
{
CLK=0;
AD_value<<=1;
if(SDO)
AD_value|=0x01;
delay_us
(2);
CLK=1;
}
CLK=0;
CS=1;
if(PORT==port)
break;
else
{
Temp=port;
Temp<<=4;
delay_us
(2);
CS=0;
//PORT=port;
}
k++;
if(k>2)
{
PORT=port;
}
}
returnAD_value;
}
u8AD_deal(void)
{
u16AD_value;
u16temp;
floattemp1;
AD_value=read_tlc2543(0x00);
temp1=(AD_value*0.04069);
temp=(u16)(temp1*10);
if((temp%10)>4)
temp=temp/10+1;
else
temp=temp/10;
temp=(u8)temp;
returntemp;
}
#include
#include"wendu.h"
#include"tlc2543.h"
u8S_Temp=100;//设置温度
u8P_Temp=25;//实际温度
u8pulse=0;
u8Kp=30,Ki=0;Kd=10;
intuk=0;
intnum=0;
structFLAG
{
u8turn;
}
myflag;
/*************
函数功能:
延时
****************/
voiddelay_ms(u16z)
{
u16i;
u8j;
for(i=z;i>0;i--)
for(j=120;j>0;j--);
}
/*************
函数功能:
LCD写数据
****************/
voidLCD_WriteData(u8Dat)
{
RS=1;
//delay_ms(5);
P1=Dat;
EN=1;
delay_ms(5);
EN=0;
}
/*************
函数功能:
LCD命令
****************/
voidLCD_WriteCOM(u8com)
{
RS=0;
//delay_ms(5);
P1=com;
EN=1;
delay_ms(5);
EN=0;
}
/*************
函数功能:
Show_Num初始化
****************/
voidShow_Num(u8x,u8y,u8n,u16num)//n为数字长度num小于等于65535
{
u16Temp=num;
u8a[5],i;
for(i=0;i { a[i]=Temp%10; Temp=Temp/10; } if(y%2==1) LCD_WriteCOM(0x80+x); else LCD_WriteCOM(0x80+0x40+x); for(i=n;i>0;i--) LCD_WriteData(a[i-1]+0x30); } /************* 函数功能: Show_fNum初始化 ****************/ voidShow_fNum(u8x,u8y,u16num) { u8a,b; a=num/10%10; b=num%10; if(y%2==1) LCD_WriteCOM(0x80+x); else LCD_WriteCOM(0x80+0x40+x); LCD_WriteData(a+0x30); LCD_WriteData(b+0x30); } /************* 函数功能: Show_Num初始化 ****************/ voidShow_char(u8x,u8y,u8ch) { if(y%2==1) LCD_WriteCOM(0x80+x); else LCD_WriteCOM(0x80+0x40+x); LCD_WriteData(ch); } /************* 函数功能: LCD初始化 ****************/ voidLCD_Init(void) { RW=0; EN=0; //delay_ms(20); LCD_WriteCOM(0x38); LCD_WriteCOM(0x0c); LCD_WriteCOM(0x06); LCD_WriteCOM(0x01); } /************* 函数功能: LCD初始化 ****************/ voidLCD_display(void) { Show_char(0,1,'P'); Show_char(1,1,'T'); Show_char(2,1,': '); Show_char(9,1,'S'); Show_char(10,1,'T'); Show_char(11,1,': '); Show_Num(12,1,3,S_Temp); Show_char(0,2,'P'); Show_char(1,2,': '); Show_Num(2,2,2,Kp); Show_char(5,2,'I'); Show_char(6,2,': '); Show_Num(7,2,2,Ki); Show_char(10,2,'D'); Show_char(11,2,': '); Show_Num(12,2,2,Kd); } /************* 函数功能: 定时器2初始化 ****************/ voidtimer2_init() { RCAP2H=(65536-100)/256;//100us RCAP2L=(65536-100)%256; TH2=RCAP2H; TL2=RCAP2L; ET2=1; TR2=1; EA=1; } voidTemp_crl() { staticintess[3]={0}; staticsum=0; ess[0]=S_Temp-P_Temp; uk=Kp*ess[0]+Ki*sum+Kd*(ess[0]-ess[1]); ess[2]=ess[1]; ess[1]=ess[0]; sum=sum+ess[0]; uk=(int)(uk/10); if(uk>=0) { if(uk>=200) uk=199; myflag.turn=1; } else { uk=-uk; if(uk>=200) uk=199; myflag.turn=0; } pulse=uk; } intmain(void) { u16AD_value1=0; myflag.turn=0; ENA=1; LCD_Init(); LCD_display(); timer2_init(); while (1) { AD_value1=read_tlc2543(0); P_Temp=AD_deal(); Temp_crl(); Show_Num(3,1,3,P_Temp); key_scan(); } return0; } voidtimer2()interrupt5 { staticu16num1=0; TF2=0; num1++; if(num1 { if(myflag.turn) { IN1=0; IN2=1; } else { IN1=1; IN2=0; } } else {ENA=0;IN1=0;IN2=0;} if(num1>=PULSE) {num1=0;ENA=1;} } voidkey_scan(void) { u8Temp=P0; staticu8Add_Ver=0,one_ten=0; staticTri=0,CON=0; Temp=Temp^0xff; Tri=Temp&(Temp^CON); CON=Temp; if(Tri==0x10) {Add_Ver++;Add_Ver=Add_Ver%2;} elseif(Tri==0x20) {one_ten++;one_ten=one_ten%2;} elseif(Tri==0x01) { if(S_Temp+1<=120&&Add_Ver==0&&one_ten==0) S_Temp++; elseif(S_Temp>=1&&Add_Ver==1&&one_ten==0) S_Temp--; elseif(S_Temp+10<=100&&Add_Ver==0&&one_ten==1) S_Temp=S_Temp+10; elseif(S_Temp>=10&&Add_Ver==1&&one_ten==1) S_Temp=S_Temp-10; Show_Num(12,1,3,S_Temp); } elseif(Tri==0x02) { if(Kp+1<=100&&Add_Ver==0&&one_ten==0) Kp++; elseif(Kp>=1&&Add_Ver==1&&one_ten==0) Kp--; elseif(Kp+10<=100&&Add_Ver==0&&one_ten==1) Kp=Kp+10; elseif(Kp>=10&&Add_Ver==1&&one_ten==1) Kp=Kp-10; Show_Num(2,2,2,Kp); } elseif(Tri==0x04) { if(Ki+1<=100&&Add_Ver==0&&one_ten==0) Ki++; elseif(Ki>=1&&Add_Ver==1&&one_ten==0) Ki--; elseif(Ki+10<=100&&Add_Ver==0&&one_ten==1) Ki=Ki+10; elseif(Ki>=10&&Add_Ver==1&&one_ten==1) Ki=Ki-10; Show_Num(7,2,2,Ki); } elseif(Tri==0x08) { if(Kd+1<=100&&Add_Ver==0&&one_ten==0) Kd++; elseif(Kd>=1&&Add_Ver==1&&one_ten==0) Kd--; elseif(Kd+10<=100&&Add_Ver==0&&one_ten==1) Kd=Kd+10; elseif(Kd>=10&&Add_Ver==1&&one_ten==1) Kd=Kd-10; Show_Num(12,2,2,Kd); } } 2、程序分析结果 3、结论分析 在工业生产和日常生活中,对温度控制系统的要求,主要是保证温度在一定温度范围内变化,稳定性好,不振荡,对系统的快速要求不高。 在论文中简单分析了温度控制系统基于Protuse仿真实验,采用热电偶作为温度检测器,应用LED显示,通过键盘4X4来对PID进行参数控制。 本实验设计使用8031作为主芯片进行控制,单片机具有集成度高,通用性好,功能强,特别是体积小,重量轻,耗能低,可靠性高,抗干扰能力强和使用方便等独特优点,在数字、智能化方面有广泛用途。 其温度控制所用的热电偶,范围广泛,在系统中如果加强算法,会大大提高控制精度,同时降低成本,提高效率。 实验总结 经过这次的实验,我又一次加深了对LED的认识和加强了对keil以及Protu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 系列 单片机 闭环 温度 控制 实验 报告