资源描述
目录
一、系统设计方案的论证与比较 2
二、硬件电路设计 3
2.1、主控单元 3
2.2、温度采集 3
2.3、AC—SSR交流功率调节电路 4
2.4、变送电路 4
1、4~20mA变送器XTR101 4
2、I/V转换器RCV420 5
2.5、键盘及显示的设计 5
1、键盘设计 5
2、LED数码管显示设计 6
2.6、硬件连接图 6
三、 Matlab参数整定 7
3.1 闭环连续pid控制 7
3.2、增加扰动 8
3.3 增加史密斯预估器 8
3.4 数字pid算法实现 9
1、 流程图如下: 9
2、 Matlab中m文件实现温度控制的pid增量型算法如下: 10
3、 显示二维平面图如下: 11
四、系统软件设计 11
4.1 主程序模块 11
4.2 功能实现模块 12
1、T0中断子程序 12
2、T1中断子程序 12
4.3运算控制模块 13
1、标度转换子程序 13
2、PID算法 13
五、源程序 13
摘要:
电阻炉是一种利用电流通过电热元件产生的热量加热工件的热处理设备。具有结构简单、操作简便、价格低廉等特点,广泛用于淬火、正火、回火和退火等常规热处理生产,是机械制造企业最常用的热处理加热设备之一。电阻炉炉温控制系统控温性能的优劣以及智能化程度的高低,不仅直接影响机械产品质量的高低,而且还直接影响热处理生产劳动强度的大小。随着微电子制造技术和现代控制技术的发展,采用以功能强、体积小、价格低的单片机为核心、以先进PID控制为算法构建智能化电阻炉温度控制系统已成为现实。
本文介绍了以AT89S52单片机为核心的温度控制器的设计,在该设计中采用热电偶温度传感器以及DWB温度变送器对电热锅炉的温度进行实时精确测量,送入8位的AD0809进行A\D转换,从而实现自动检测,实时显示及越限报警。控制部分采用PID算法,实时更新PWM控制输出参数,通过AC-SSR电路实现了对炉温的高精度控制。
关键词:炉温控制;PID控制;单片机
一、系统设计方案的论证与比较
根据题目要求,电热锅炉温度控制系统由核心处理模块、温度采集模块、键盘显示模块、及控制执行模块等组成.
此次设计采用比较流行的AT89S52作为电路的控制核心,使用8位的模数转换器AD0808进行数据转换,控制电路部分采用PWM通过AC-SSR实现锅炉温度的连续控制,此方案电路简单并且可以满足题目中的各项要求的精度。综上分析,我们采用方案二。系统总体框图如下。
图1 控制器设计总体框图
根据温度变化慢,并且控制精度不易掌握的特点,我们设计了以AT89S52单片机为检测控制中心的电热锅炉温度自动控制系统。温度控制采用改进的PID数字控制算法,显示采用8位LED动态显示。该设计结构简单,控制算法新颖,控制精度高,有较强的通用性。所设计的控制系统有以下功能:
1、温度控制设定波动范围小于±1%,测量精度小于±1%,控制精度小于±2%。
2、实时显示当前温度值。
3、按键控制:设置复位键、运行键、功能转换键、加一键、减一键。
4、越限报警。
二、硬件电路设计
硬件系统主要由AT89S52单片机、温度采集、A/D转换、光耦隔离、键盘显示电路、蜂鸣报警、等功能电路组成。
2.1、主控单元
AT89S52单片机为主控制单元。AT89S52是ATMEL公司生产的低功耗、高性能CMOS 8位单片机.它除正常工作以外还可以工作于低功耗和掉电模式,进一步减少了芯片的功耗。降低芯片的温升,延迟了芯片的使用寿命。其内部配有8K的Flash程序存储器和256字节的数据存储器。所配置的Flash程序存储器,便于实现ISP在线下载,降低了应用系统的开发成本。除此之外,AT89S52还具有2个16位定时计数器。5个两级中断源结构,32位并行输人/输出端口和一个全双工的串行口,以及看门狗定时器等功能单元。AT89S52单片机首先根据炉温的给定值和测量值计算出温度偏差,然后进行PID控制并计算出相应的控制数据由P1.0口输出。最后将P1.0口输出的控制数据送往光电耦合隔离器的输入端,利用PWM脉冲调制技术调整占空比,达到使炉温控制在某一设定温度。AT89S52单片机还负责按键处理、温度显示以及与上位机进行通信等工作。4位高亮度LED用于显示设定温度或实测温度。
2.2、温度采集
温度采集电路主要由铂铑-铂热电偶LB-3。LB-3热电偶可以在1300℃高温下长时间工作,满足常规处理工艺要求。
测温时,热电阻输出mV热电势,必须经过变送器变换成0-5V的标准信号。本系统选用DWB型温度变送器,并将其直接安装在热电偶的接线盒内,构成一体化的温度变送器,不仅可以节省补偿导线,而且可以减少温度信号在传递过程中产生的失真和干扰。
电阻炉炉温信号是一种变换缓慢的信号。这种信号在进行A/D转换时,对转换速度要求不高。因此为了减低成本以及方便选材,可以选用廉价的、常用的A/D芯片ADC0808,ADC0808是一种逐次逼近式8路模拟输入、8为数字输出地A/D转换器件,转换时间为100us,完全满足系统设计的要求。经过ADC0808转换所得到的实测炉温数据直接送入AT89S52单片机中进行数据处理。
此外,为了防止断偶或者炉温越限,产生热处理质量事故;同时为了提高温控系统的智能化控制性能,降低热处理操作人员的劳动强度,本系统特别设置了断偶或炉温越限自动报警电路。在热处理生产过程中,当发生断偶或炉温越限等异常现象时,主控单元AT89S52单片机自动启动报警电路进行声、光报警,以便操作人员快速处理,防止炉内工件过热,破坏金属组织结构。
2.3、AC—SSR交流功率调节电路
由输出来控制电炉,电炉可以近似建立为具有滞后性质的一阶惯性环节数学模型。为了避免交流接触器等机械触电因频繁通断产生电弧,烧坏触电或者干扰其他设备正常工作,本系统选用AC-SSR交流功率调节器作为PID控制系统的执行机构。AT89S52单片机P1.0口输出的温度控制信号经过光电耦合器件隔离,送至过零检测电路。过零检测电路产生脉冲控制AC-SSR调功电路。当实测温度偏低时,单片机输出的控制信号使得双向可控硅的导通角减小,导通时间变短,加热器功率降低炉温适当降低。通过控制输入到加热器平均功率的大小达到控制电阻炉炉温的目的。采用过零触发的方式,使可控硅输出为正弦波,有效地避免了移相触发输出非正弦波而造成的对电网的公害。控制执行部分的硬件电路如下图
图2 控制执行部分的硬件电路
2.4、变送电路
1、4~20mA变送器XTR101
XTR101为4~20mA线性化变送器,它可与镍络-镍硅测温传感器构成精密的T/I变换。器件中的放大器适合很宽的测温范围,在-40℃~+85℃的工作温度内,传送电流的总误差不超过1%,供电电源可以从11.6V到40V,输入失调电压<±2.5mV,输入失调电流<20nA。XTR101外形采用标准的14脚DIP封装。XTR101有如下两种应用于转换温度信号的典型电路:
2、I/V转换器RCV420
RCV420是一种精密电流/电压变换器,它能将4~20mA的环路电流变为0~5V的电压输出,并且具有可靠的性能和很低的成本。除具有精密运放和电阻网络外,还集成有10V基准电源。对环路电流由很好的变换能力。具有-25℃~+85℃和0℃~70℃的工作温度范围,输入失调电压<1mA,总的变换误差<0.1%,电源电压范围±5~±18V。RCV420的外形采用标准的16脚DIP封装。它的典型应用如下:
2.5、键盘及显示的设计
1、键盘设计
位选键SW与P2^3相连,INTO与外部中断0(P3.2^)相连,INT1与外部中断1(P3.3^)相连。采用外部中断方式实现温度的设置。功能定义如下:
(1)、当SW拨到下面时,INT0健实现温度值的十位加1,INT1健实现温度值的十位减1
(2)、当SW拨到上面时,INT0健实现温度值的个位加1,INT1健实现温度值的个位减1
图 3 温度设置
2、LED数码管显示设计
显示采用8位共阴LED动态显示方式,显示内容有温度值的百位、十位及个位,这样可以只用P3.0(RXD)口来输出显示数据,从而节省了单片机端口资源,在P2.5,P2.6,P2.7三个IO口和P3.1(TXD)的控制下通过74LS138和74LS164来实现8位动态显示。
·
· 图 4 LED显示
2.6、硬件连接图
·
三、 Matlab参数整定
通过使用MATLAB的simulink仿真构造传递函数为控制对象,其结构图如下:
图6 控制对象结构图
要设计数字pid炉温控制系统,首先设计连续的pid控制器。以下为在matlab simulink中构建系统框图如下:
3.1 闭环连续pid控制
图7 闭环连续PID控制结构图
仿真结果如下:
图8 阶跃响应曲线图
3.2、增加扰动
图9 增加扰动的控制结构图
图8 阶跃响应曲线图
3.3 增加史密斯预估器
图9 增加施密斯预估器的控制结构图
仿真结果如下
图10 阶跃响应曲线图
3.4 数字pid算法实现
1、 流程图如下:
离散被控对象
初始化各变量
采样时刻到否
计算偏差
增量型计算公式
N
Y
图10 PID算法流程图
2、 Matlab中m文件实现温度控制的pid增量型算法如下:
clear all;
close all;
ts=1; %采样时间=1s
sys=tf(50,[350,1],'iodelay',10);%Gp_s的传递函数
ts=1;
dsys=c2d(sys,ts,'z'); %离散传递函数
[num,den]=tfdata(dsys,'v');%离散化后提取分子、分母
e_1=0;%上一偏差
Ee=0;%偏差累计
u_1=0.0;%上一状态控制器输出
u_2=0.0;
y_1=0; %上一状态输出
y_2=0;
kp=1;%PID参数
ki=0.04;
kd=4;
for k=1:100
time(k)=k*ts;%时间参数
r(k)=500;%给定值
y(k)=u(k)*dsys
e(k)=r(k)-y(k); %偏差
u(k)=kp*e(k)+ki*Ee+kd*(e(k)-e_1);%增量型计算公式
Ee=Ee+e(k);
u_2=u_1;
u_1=u(k);
y_2=y_1;
y_1=y(k);
e_2=e_1;
e_1=e(k);
end
hold on;
plot(time,y,'b'); %绘图b为蓝色显示、时间为横轴、输出为纵轴
[kp,ki,kd]
3、 显示二维平面图如下:
图8 阶跃响应曲线图
四、系统软件设计
系统的软件由三大模块组成:主程序模块、功能实现模块和运算控制模块。
4.1 主程序模块
主程序流程图。
图8 主程序流程图
4.2 功能实现模块
以用来执行对可控硅及电炉的控制。功能实现模块主要由A/D转换子程序、中断处理子程序、键盘处理子程序、显示子程序等部分组成。
1、T0中断子程序
该中断是单片机内部100ms定时中断,优先级设为最高,是最重要的子程序。在该中断响应中,单片机要完成调用PID算法子程序且输出PID计算结果等功能。其流程图如下:
图8 T0中断子程序
2、T1中断子程序
T1定时中断用于调制PWM信号,优先级低于T 0中断,其定时初值由PID算法子程序提供的输出转化而来,T1中断响应的时间用于输出控制信号。其流程图如下:
图9 T1中断子程序
4.3运算控制模块
运算控制模块涉及标度转换、PID算法、以及该算法调用到的乘法子程序等。
1、标度转换子程序
该子程序作用是将温度信号(00H~FFH)转换为对应的温度值,以便送显示或与设定值在相同量纲下进行比较。单片机运算采用定点数运算,并且在高温区和低温区分别用程序作矫正处理。
2、PID算法
积分分离控制的基本思路是:当偏差e(k)绝对值较大时。取消积分作用,以免由于积分作用使系统稳定性降低,超调量增大;当偏差e(k)绝对值小于某一设定值M时,引入积分控制,以便消除静差,提高控制精度,即
综上所述,PID算法流程图如下:
图10 PID控制算法流程图
五、源程序
#include <reg52.h>
#include "PID.h" //
#define AD_Data P0
unsigned char ADConvert(void);
sbit AD_Start=P2^0;
sbit AD_EOC=P2^1;
sbit Ctrl=P3^4;
sbit SW=P2^3;
sbit outpin=P1^0;
unsigned char const DisCode[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,}; //显示代码表
unsigned char const Statud[10] = {0xb7,0xf8,0xf3};
unsigned int tep,step=300;
unsigned int s_ulCycle,s_uiHighTime,s_uiLowTime,Freq,value,Scale; //PWM设置用到的参数
unsigned long longtemp,longtemp1,longtemp2;
unsigned char i=0;
bit s_bStatus=0;
unsigned char ADConvert(void); //A/D转换
void display(unsigned int num1, unsigned int num2); //显示模块
void delay(unsigned int DelayTime); //延时子程序
void Interrupt_init();
void PWM_Set( unsigned int uiFreq, unsigned char ucScale ); //PWM模块
void main()
{ unsigned long temp=0,temp1=0;
Ctrl=0; //蜂鸣器初始状态不响
Interrupt_init(); //中断初始化
EX0_int(); //外部中断0初始化
EX1_int(); //外部中断1初始化
initialize_pid_value();
clr_lastout(0); //最后输出的温度值
while(1)
{
temp=ADConvert(); //检测的温度
temp=temp*400/256; //检测的温度转换为数字量
if((temp>320)||(temp<0))Ctrl=1;
else Ctrl=0;
tep=temp;
temp1=step;
display(temp,temp1);
Scale=value/4;
PWM_Set(100,Scale);
}
}
/******************************************************************************
PWM设置
\******************************************************************************
void PWM_Set( unsigned int uiFreq, unsigned char ucScale )
{
if( ucScale > 100 ) //占空比不可能大于100%
return;
else
{ s_ulCycle = 921600/uiFreq;
longtemp1 = s_ulCycle;
longtemp2 = ucScale;
longtemp = 65535-(longtemp1*longtemp2/100);
s_uiHighTime =longtemp; //保持低电平的时间
longtemp =65535-(longtemp1*(100 - longtemp2)/100);
s_uiLowTime =longtemp; //保持高电平的时间
}
}
void PWM_Tm1ISR(void) interrupt 1
{
TR1 = 0;
s_bStatus= ~s_bStatus; //取反标志位,表示该输出高电平或低电平
if(s_bStatus) //输出高电平
{
TH1 = s_uiHighTime>>8; //保持高电平的计数次数
TL1 = s_uiHighTime;
outpin = 1; //输出高电平
}
else //输出低电平
{
TH1 = s_uiLowTime>>8; //保持低电平的技术次数
TL1 = s_uiLowTime;
outpin = 0; //输出低电平
}
TR1 = 1; //允许计数器重新开始计数
}
void Interrupt_init() //内部计数器初始化
{
EA=1; //开总中断
TMOD=0x11; //T0,T1都使用16位定时器,不受外部外部引脚电平控制
ET0=1;
ET1=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
TH0=s_uiLowTime>>8;
TL0=s_uiLowTime; //定时器0赋予初值
TR0=1; //启动定时器0
TH1=0x4b;
TL1=0xff; //定时50ms
TR1=1;
}
void PID_Ctrler(void) interrupt 3
{ TH0=0x4b;
TL0=0xff;
if(i==1)
{
i=0;
value=ypid(step,tep);
}
else i++;
}
void EX0_int(void) interrupt 0 //利用外部中断0,设置目标温度
{
if(SW) //sw=1,初值温度step加1,实现step的个位设置
step++;
else //sw=0,初值温度step加10,实现step十位设置
step+=10;
}
void EX1_int(void) interrupt 2 //利用外部中断1,设置目标温度
{
if(SW)
step--; //sw=1,初值温度step减1,实现step的个位设置
else
step-=10; //sw=0,初值温度step减10,实现step十位设置
}
void display(unsigned int num1, unsigned int num2) //LED实时显示温度
{
P2=0xa0;delay(5);SBUF=DisCode[num1/100];delay(100); //显示百位
P2=0x20;delay(5);SBUF=DisCode[num1%100/10];delay(100); //显示十位
P2=0xc0;delay(5);SBUF=DisCode[num1%10];delay(100); //显示个位
P2=0x40;delay(5);SBUF=DisCode[num2/100];delay(100);
P2=0x80;delay(5);SBUF=DisCode[num2%100/10];delay(100);
P2=0x00;delay(5);SBUF=DisCode[num2%10];delay(100);
P2=0xe0;delay(5);SBUF=Statud[0];delay(100);
P2=0x60;delay(5);SBUF=Statud[1];delay(100);
}
unsigned char ADConvert(void) //A/D采样,把模拟量转换为数字量
{ unsigned int Voltage;
AD_Start=0; //启动ADC0808
AD_Start=1;
AD_Start=0;
delay(10);
Voltage=AD_Data;
return (Voltage);
}
void delay(unsigned int DelayTime) //延时子程序
{
while(DelayTime--);
}
int idata lerror1,lastout;//,out_max,yout[5],lyrk,yrk,;
unsigned char xi,xp,xd;
unsigned char const UPPER_LIMIT=400;
char p;
unsigned int ypid(unsigned int give,unsigned int feedback)
{
int error1,error2,out;
error1=give-feedback; //计算积分偏差
error2=error1-lerror1; //计算比例偏差
lerror1=error1; //更新e(k-1)
out=lastout+error1/xi+error2*xp; //计算PI控制值
if(error1==0)out=out; //计算不灵敏区的运算补偿
else if(error1<8&&error1>-8)
{
if(error1>0)out=out+1;
else out=out-1;
}
else if(error1<16&&error1>-16)
{
if(error1>0)out=out+2;
else out=out-2;
}
if(out>UPPER_LIMIT)out=UPPER_LIMIT; //对输出值进行上限控制
if(out<0)out=0; //对输出值进行下限控制
lastout=out; //更新out(k-1)
if(error1<xd&&error1>-xd)out=out+error1;
return(out); //返回最终运算结果
}
void clr_lastout(unsigned int value1)
{
lastout=value1;
}
void initialize_pid_value()
{ xp=1;
xi=8;
xd=4;
}
六、结果分析论述
本次的课程设计就快结束了,从开始的兴奋到中途的郁闷再到最后的满足,感受到了实验带来的复杂感觉。
刚开始,在仅仅一个课题的情况下来设计电路图,真是感到无从下手,在经过老师的耐心讲解,经过简单的调适与对比,最终完成了电路图的设计。
经过此次设计,我对这门课程有了更深的了解。在设计过程中,首先要熟悉系统的工艺,进行对象的分析,按照要求确定方案。然后要进行硬件和软件的设计和调试。由于没有实际的样机,所以不能看到系统的运行结果。只能在理论上对系统的结果进行预测分析。此次设计使我对微型计算机控制技术有了全面的深刻的了解,对我以后深入学习这门技术有很大的帮助。
此次的《计算机控制技术》课程设计,得到了不少的启示。思考问题以及进行实践都要严谨,缜密。真所谓小心取证,就是这个道理。通过学习数字PID的电阻热炉温度控制系统的设计,更加了解可编程控制器的构造及应用。激发我们的创新意识,在学习与进行设计的过程中,利用已经掌握的知识及查阅的资料,自行完成课程设计任务以及设计完成。
七、致谢
在本次设计中,感谢丁健老师的悉心指导。通过老师在设计思想上的为我指点迷津、开拓思路,是我们的实验更好的完成。因此,我要向丁健老师致以最诚挚的感谢。
八、参考文献
【1】于海生编著. 计算机控制技术. 机械工业出版社.2010年1月.
【2】李朝青 编著.单片机原理及接口技术. 北京航空航天大学出版社.1999年3月.
【3】余锡存 曹国华 编著. 单片机原理及接口技术(第二版). 西安电子科技大学. 2007年12月.
【4】邵裕森 戴先中 编著. 过程控制系统.机械工业出版社.2009年6月.
展开阅读全文