计算机控制课程设计有什么不懂的加qq找我我这有原理图PCBc语言源程序Word文件下载.docx
《计算机控制课程设计有什么不懂的加qq找我我这有原理图PCBc语言源程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机控制课程设计有什么不懂的加qq找我我这有原理图PCBc语言源程序Word文件下载.docx(27页珍藏版)》请在冰点文库上搜索。
关键词:
单片机、温度传感器、4×
4键盘、LCD1602、PID算法
Abstract
Intheenergyofthegrowingtensiontoday,electricwaterheater,watermachineandelectricmealcookerinthehouseholdappliancessuchasheatpreservation,duetoitssimpletemperaturecontrolsystem,two-linehybridsresistancetoachievethetemperaturecontrolandwilldoalotofenergyiswasted.ThisdesignusingSTC12C5A08S2microcontrollerasthecore,withthetemperaturesensorDS18B20,siliconcontrolledBTA12PIDalgorithmandtocontrolwatertemperature,itrequiresawatertemperaturedetectioncircuit,signalprocessingcircuit,4x4keyboardinputcircuit,showcircuit,controlcircuitandtheoutputofsingle-chipmicrocomputercontrolsystem,canbedetectedwatertemperaturesensorofanalogintothedigitalquantity,anddisplayedinLCD1602.Thesystemhastheflexibilityandeasytocontrol,andhighreliabilityetc,canrealizethecontrolofthewastetoenergy.
Keywords:
microcomputer、Temperaturesensor、4x4keyboard、LCD1602、PIDalgorithm
引言
及时准确地得到温度信息并对其进行实施的控制,在许多工业场合中都是重要的环节。
水温的变化影响各种系统的自动运作,例如冶金、机械、食品、化工各类工业中,广泛使用的各种加热炉、散热处理、反应炉等,对工件的水处理温度要求控制。
对于不同的控制系统,其适宜的水质温度总是在一个范围,超过这个范围,系统或许会停止运行或遭受破坏,所以我们必须能实时获取水温的变化。
对于超过适宜范围的温度能够报警。
同时我们也希望在适宜温度范围内可以由检测人员根据实际情况加以改变。
水温控制在工业及日常生活中应用广泛,分类较多,不同水温控制系统的控制方法也不尽相同,其中以PID控制法最为常见。
单片机控制部分采用STC12C5A08S2单片机为核心,采用软件编程,实现用PID算法来控制PWM波的产生,进而控制热得快的加热来实现温度控制。
然而,单纯的PID算法无法适应不同的温度环境,在某个特定场合运行性能非常良好的温度控制器,到了新环境往往无法很好胜任,甚至使系统变得不稳定,需要重新改变PID调节参数值以取得佳性能。
第一章设计题目及要求
一设计题目
用热得快对热得快对水的温度控制,用热敏元件设计测温电路,功率元件用光耦MOC3020驱动双向可控硅BTA12进行交流电的功率调整,再利用单片机设计控制器对水温进行控制,通过键盘进行温度设置,实际温度可以实时显示。
二设计要求
(1)能实现温度从0℃~100℃测量,
(2)温度控制范围为40℃—90℃
(3)误差为+1℃
(4)系统超调量﹤5﹪
(5)用1602液晶显示水的实际温度和设置温度
(6)用键盘进行温度的设置和修改
三主要设备和元件
(1)+5V,+12V和-12V电源
(2)MOC3021光耦和BTA12双向可控硅,DB18B20测温元件
(3)单片机STC12C5A08S21片,MAX2321片,串口1个,按键开关17个,指示灯3个,电阻,电容等若干
(4)数字滤波器,万用表,水银温度计,数字温度计(最大测温不超过75℃
第二章系统方案设计
一系统总方案的选择
方案一:
利用的是运放LM324来组成的模拟控制电路,所以对电路设计的要求需要一定的准确度和良好的线性度。
在测量电路中我们选用精度还行和便宜方便的测温元件PN结9014作为我们测量温度的传感器,根据PN结9014的特性,将测量温度0℃~100℃转化为测量电压0V~1V,将测量电压和给定电压(给定温度相比较)得测目前的误差值,将通过误差控制电路将误差转换为可控硅的控制脉冲信号来决定加热的平均功率,来完成温度控制。
方案二:
利用STC12C5A08S2单片机为核心,配合温度传感器DS18B20,运用软件程序和键盘设置温度,然后将DS18B20测得的温度与设置温度进行对比,运用PID算法实现对水温进行控制。
对比两方案可知,方案一虽然原理比较简单,但是对于硬件要求比较高,而且稳定性和实用性不太高,方案二电路简单,主要是程序设计方案较难,但是实用性高,灵活性强。
因此,该设计选择方案二。
二各模块方案的选择
1温度传感器的选择
目前市场上温度传感器较多,主要有以下方案:
采用热敏电阻。
选用此类元器件的优点是价格便宜,但是热敏电阻的非线性特性会影响系统的精度。
采用铂电阻温度传感器。
此类温度传感器的线性度、稳定性方面的性能都很好,但是成本很高,主要应与于对温度性能有很高要求的系统。
方案三:
采用DS18B20温度传感器。
DS18B20是一线式数字温度传感器,具有3引脚TO—92小体积封装形式:
温度测量范围为-55℃~+125℃,具有可编程为9位~12位A/D转换精度,测量分辨率可达到0.0625℃,被测温度用符号扩展的16位数字量方式串行输出远端引入。
此器件具有体积小、质量轻、线性度好、性能稳定等优点,其他各方面特性满足此系统的设计要求。
比较以上三个方案,方案三具有明显的优点,因此选择方案三。
2键盘显示的选择
控制与显示电路是反映电路性能、外观的最直观部分,所以此部分电路设计的好坏直接影响到电路的好坏。
采用可编程控制器8279与数码管及地址译码器74LS138组成,可编程/显示器件8279实现对按键的扫描、消除抖动、提供LCD的显示信号,并对LCD显示控制。
用8279和键盘键盘组成的人机控制平台,能够方便的进行控制单片机的输出。
采用单片机STC12C5A08S2与4×
4键盘组成控制和扫描系统,并用12C5A08S2的P1口对键盘进行扫描,并用总线的方式在P2口接1602液晶来显示水温和设定值,这种方案既能很好的控制键盘和显示,又为主单片机大大的减少了程序的复杂性,而且具有体积小、价格便宜的优点。
对比两个方案可知,从电路设计的成本和电路整体的性能,因此选择方案二。
3显示模块的选择
采用LED数码管显示,其特点是价格便宜,使用简便,在家电领域运用广泛,经常用于显示时间、日期、温度等数字参数。
要使其正常工作,需要驱动电路。
采用液晶显示器1602显示。
其特点是显示质量高,而且是数字式接口,这与单片机系统的接口更加简单可靠,操作方便,并且功耗低,能显示数字、字母、文字等,并且修改显示简单,便于操作。
比较上述两个方案,从要求实现的功能上选择,因此选择方案二。
第三章系统硬件设计及原理
一系统硬件结构及原理
本课设的水温控制系统由温度检测模块、控制单元模块、PWM控制模块、加热电路、键盘、显示模块等部分组成,结构框图如图1所示。
水温经过DS18B20构成的传感器模块通过单总线传给控制器,控制器根据检测值与设定值的偏差,计算PID控制值,其结果通过PWM模块控制加热电路功率,实现对水温的控制。
控制模块
温度传感模块
加热电路
PWM控制
显示模块
键盘
图1、系统结构图
二各模块功能电路原理及分析
1传感电路设计
系统采用DS18B20温度传感器,美国DALLS半导体公司生产的一种改进型温度传感器,与传统的热敏电阻等温度元件相比,它能无需A/D转换直接读出被测温度值,而且可根据实际要求,通过简单的编程实现9-12位数字值读数方式。
其测量范围从-55℃到+125℃,在-10℃到+85℃间精度达到
℃,并且每个DS18B20都有一个唯一的64位ROM号,可以方便地使用其独有的单总线构成多点检测,节省了宝贵的控制器I/O口。
2可控硅执行控制电路
利用可控硅的通断来控制热得快加热的平均功率,来控制水温。
电路设计如下图2。
图2、可控硅电路
本系统的控制对象是水的温度,也就是控制热得快的加热或不加热。
而在热得快上是否有电流流过,则取决于MOC3021和TBA12的通断与否,因此其控制电上图路示。
从单片机P0.3口出来的方波电压直接加到MOC3021的2脚上,MOC3021的内部发光二极管正常工作需要50MA左右的电流,由此来控制可控硅的通断。
MOC3021的基本应用电路:
当LM324的4脚为低电平时,MOC3021的4、6脚上就没有电压,TBA12就不被触发,也就不导通。
相反,当LM324的4脚为高电平时,则MOC3021的4、6脚上出现电压,TBA12就被触发,同时导通,从而热得快开始加热。
这样高低电平的变化,就达到是控制的要求。
3液晶显示模块电路
运用LCD1602来作为显示模块,按照总线接法来连接,1602数据口接单片机的P1口,如下图3所示:
图2、1602显示模块
4键盘模块电路
采用4×
4矩阵键盘接单片机的P1口,然后实现对设定温度的修改,将它与实际温度进行对比,实现要求的功能。
矩阵键盘如下图3所示:
图4、4×
4矩阵键盘
5加热功率PWM控制实现
本课题采用的STC12C5410单片机具有4路16位的可编程计数器阵列(SPA)或8位的可调制脉冲输出(PWM)模块。
本课题只用到一个PWM模块,该模块连接到P2.7(PCA0/PWM0)引脚。
PWM的输出频率决定于PCA定时器的时钟源。
PCA定时器的时钟输入源有四种可供选择,分别是:
Fosc/12,Fosc/2,定时器0的溢出频率,P3.4/ECT的输入频率。
由于PWM是8位的,所以PWM的输出频率=PCA时钟输入频率/256。
本设计采用的是定时器0的溢出频率作为PCA的时钟输入,这样可以通过设置定时器0的计数值改变PWM的频率。
PWM输出的占空比的调节是通过改变EPcnH和CCAPnH两个寄存器的值实现,当CLSFR的值小于{EPcnL,CCAPnL}是,输出为低,当CLSFR的值大于{EPcnL,CCAPnL}时,输出为高。
当CL的值由FF变为00溢出时,{EPcnH,CCAPnH}的值自动装载到{EPcnL,CCAPnL}中,实现了数据无干扰更新。
所使用单片机及其引脚如下图5所示:
图5、单片机连接图
第四章系统软件设计
一算法实现控制
1模拟控制系统
被控量的值由传感器或变送器来检测,这个值与给定值进行比较,得到偏差,模拟调节器依一定控制规律使操作变量变化,以使偏差趋近于零,其输出通过执行器作用于过程。
其基本结构图如图6所示:
图6、基本模拟反馈控制回路
2模拟PID控制系统组成
PID调节器是一种线性调节器,它将给定值r(t)与实际输出值c(t)的偏差的比例(P)、积分(I)、微分(D)通过定值线性组合构成控制量,对控制对象进行控制。
其模拟PID控制系统原理框图如下图7所示:
图7、模拟PID控制系统原理框图
3PID调节器的微分方程
u(t)=Kp[e(t)+
dt+
]
式中e(t)=c(t)-r(t)
PID调节器的传输函数:
D(S)=
=Kp(1+
)
PID调节器各校正环节的作用:
1比例环节(P):
即时成比例地反应控制系统的偏差信号e(t),偏差一旦产生,调节器立即产生控制作用以减少偏差。
2积分环节(I):
主要用于消除静差,提高系统的无差度。
积分作用的强弱取决于积分时间常数TI,TI越大,积分作用越弱,反之则越强。
3微分环节(D):
能反应偏差信号的变化趋势(变化速率),并能在偏差信号的值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减少调节时间。
4数字PID控制器的差分方程
u(n)=Kp{e(n)+
=
(n)+
式中:
称为比例项
称为积分项
=
称为微分项
其中
分别为比例放大系数、积分常数、微分常数、T为采样周期。
对于一个控制系统而言,控制质量的好坏取决于参数整定是否合理,如果参数整定不合理,则系统不仅精度低,还可能崩溃。
第六章系统调试
做好板子后不要急着上电,首先用万用表检查一下电路有没有虚焊或短路的,特别是每块芯片的电源是否正常,以免上电时烧毁芯片。
然后检测芯片是否正常工作,用示波器测量方波波形。
调试画面如下图8所示。
强电部分一定要记得不要覆铜,并且要用电工胶布封好,以免触电危险。
利用键盘设定温度,然后系统会根据设定值与测量值判断是否需要加热。
加热时观察示波器方波波形的变化情况。
程序设定测量值与设定这相差2度时进行PID调节。
温度趋于稳定时会稍有波动。
实际测量时,设定值为50度时,稳定时最高温度为50.8度,最低温度为49.2度。
误差在允许范围内。
第五章设计小结与心得
通过本次作品设计,不但加深我们对在校所学到的理论知识的认识和理解,重新让自己认识到了这门学科的在应用方面的广阔前景,并且通过知识与应用于实践的结合更加丰富了自己的知识,扩展了知识面,不但掌握了本专业的相关知识,而且对其他专业的知识也有所了解,并且较系统的掌握微型计算机技术应用过程,从而使自身的综合素质有了较全面的提高。
另外,我们也注意到电路工艺的重要性。
经过这次一个较完整的设计和制作过程,对于认识到自己在知识方面存在的不足,明确今后的学习方向是非常有益的,为将来的更近一步的学习打了下扎实的基础。
在这次作品设计过程中,我们是以小组的形式进行。
虽然花费了大量的时间和精力,但我们却学到了许多在理论课程中无法学到的知识。
最重要的是让我们懂得了合作的重要性,学会了如何与人更好的合作。
在这段课设的时间里遇到了很多问题,幸好有老师和同学们的悉心指导和帮助。
在此对他们表示衷心的感谢。
附录系统PCB及元件清单
1系统的PCB图
2元件清单
附表一
元器件
描述
数量
MOC3020
光耦
1
BTA12
双向可控硅
排针
若干
电阻
触动开关
按键
17
STC单片机
电容
晶振
1602液晶显示器
串口接口
公头
3单片机语言源程序
#include<
reg52.h>
#include<
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineki1
#definekp10
#definekd10
#defineTIM-50000
sbitOUT=P1^3;
sbitSL=P1^4;
sbitDQ=P1^5;
sbitlcdrs=P1^2;
//LCD端口
sbitlcdrw=P1^1;
sbitlcden=P1^0;
ucharcodestr1[]="
nowTemp:
C"
;
ucharcodestr2[]="
setTemp:
ucharcodetable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
bitsetflag,okflag;
ucharnum,temp;
ucharset[2]={0};
uchardatadisdata[5];
uintA=1000,H,PWM;
inttvalue,T,ST;
//温度值
inte0,e1,e2,u;
voiddelayz(uintz)//延时
{
uinti,j;
for(i=z;
i>
0;
i--)
for(j=110;
j>
j--);
}
//********************LCD初始化程序*****************//
voidwr_com(ucharml)//写指令子函数
{
lcdrs=0;
//LCD写指令操作允许位
lcden=0;
P2=ml;
delayz(3);
lcden=1;
voidwr_dat(ucharsj)//LCD写数据子函数
lcdrs=1;
//写数据操作允许位
P2=sj;
voidinit()//按照时序操作的初始化
lcdrw=0;
wr_com(0x38);
//显示模式设置,设置为16*2显示,5*7点阵,八位数据口
wr_com(0x0c);
//开显示,但不开光标,光标不闪
wr_com(0x06);
//显示光标移动设置
wr_com(0x01);
//清屏
wr_com(0x80);
//数据指针初始化
for(num=0;
num<
16;
num++)
{
wr_dat(str1[num]);
}
wr_com(0x80+0x40);
//地址初始化
wr_dat(str2[num]);
}
/******************************ds1820***************************************/
voiddelayz_18B20(unsignedinti)//延时1微秒
while(i--);
voidds1820rst()/*ds1820复位*/
DQ=1;
//DQ复位
delayz_18B20(40);
//延时
DQ=0;
//DQ拉低
delayz_18B20(1000);
//精确延时大于480us
//拉高
delayz_18B20(400);
}
uchards1820rd()/*读数据*/
uchari=0,dat=0;
for(i=8;
{
DQ=0;
//给脉冲信号
dat>
>
=1;
DQ=1;
if(DQ)dat|=0x80;
delayz_18B20(100);
return(dat);
voidds1820wr(ucharwdata)/*写数据*/
uchari=0;
i>
i--)
DQ=0;
DQ=wdata&
0x01;
wdata>
}
read_temp()/*读取温度值并转换*/
uchara,b;
ds1820rst();
ds1820wr(0xcc);
//跳过读序列号
ds1820wr(0x44);
//启动温度转换
ds1820wr(0xbe);
//读取温度
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<
<
=8;
tvalue=tvalue|a;
if(tvalue<
0x0fff);
elsetvalue=~tvalue+1;
tvalue=tvalue*(0.625);
//温度值扩大10倍,精确到1位小数
return(tvalue);
/*******************************************************************/
voidds1820disp()//温度值显示
disdata[1]=tvalue%1000/100+0x30;
//十位数
disdata[2]=tvalue%100/10+0x30;
//个位数
disdata[3]=tvalue%10+0x30;
//小数位
if(disdata[1]==0x30)disdata[1]=0x20;
//如果十位为0不显示
wr_com(0x80+10);
wr_dat(disdata[1]);
//显示十位
wr_dat(disdata[2]);
//显示个位
wr_dat(0x2e);
//显示小