51系列单片机闭环温度控制实验报告材料.docx

上传人:b****4 文档编号:24825165 上传时间:2023-06-01 格式:DOCX 页数:26 大小:165.24KB
下载 相关 举报
51系列单片机闭环温度控制实验报告材料.docx_第1页
第1页 / 共26页
51系列单片机闭环温度控制实验报告材料.docx_第2页
第2页 / 共26页
51系列单片机闭环温度控制实验报告材料.docx_第3页
第3页 / 共26页
51系列单片机闭环温度控制实验报告材料.docx_第4页
第4页 / 共26页
51系列单片机闭环温度控制实验报告材料.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

51系列单片机闭环温度控制实验报告材料.docx

《51系列单片机闭环温度控制实验报告材料.docx》由会员分享,可在线阅读,更多相关《51系列单片机闭环温度控制实验报告材料.docx(26页珍藏版)》请在冰豆网上搜索。

51系列单片机闭环温度控制实验报告材料.docx

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作为主芯片进行控制,单片机具有集成度高,通用性好,功能强,特别是体积小,重量轻,耗能低,可靠性高,抗干扰能力强和使用方便等独特优点,在数字、智能化方面有广泛用途。

其温度控制所用的热电偶,范围广泛,在系统中如果加强算法,会大大提高控制精度,同时降低成本,提高效率。

实验总结

经过这次

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1