空调控制系统范本.docx
《空调控制系统范本.docx》由会员分享,可在线阅读,更多相关《空调控制系统范本.docx(19页珍藏版)》请在冰豆网上搜索。
空调控制系统范本
空调控制系统
设计要求:
设计一空调房间温度控制系统[1],该系统能准确测量房间温度,并根据设定温度进行有效控制。
空调设计变频空调制冷(热)量与压缩机转速有关,经过控制压缩机转速频率来控制所需热量。
空调模型相当于一个积分环节与一个惯性环节的串联。
房间模型主要考虑室内外温度干扰与散热片热量共同作用于具有初始温度房间,经空气导热延迟,简化为具有一阶惯性环节。
设房间热惯性时间常数
=450,空气导热延迟τ=35,选择合适的控制算法进行控制。
1课程设计的目的与意义
经过该课程的学习使我们对计算机控制系统有一个全面的了解、掌握常规控制算法的使用方法、掌握简单微型计算机应用系统软硬的设计方法,进一步锻炼同学们在微型计算机应用方面的实际工作能力。
课程设计是一项综合性的专业实践活动,目的是让学生将所学的基础理论和专业知识运用到具体的工程实践中,以培养学生综合运用知识能力、实际动手能力和工程实践能力,计算机科学在自动化控制应用上得到了飞速发展,因此,学习这方面的知识必须紧密联系实际,掌握这方面的知识更要强调解决实际问题的能力。
我们要着重学会面对一个实际问题,如何去自己的收集资料,如何自己去学习新的知识,如何自己去制定解决问题的方案并经过实践不断地提高分析和解决问题的能力。
2设计任务
2.1设计内容
设计一空调房间温度控制系统,该系统能准确测量房间温度,并根据设定温度进行有效控制。
空调设计变频空调制冷(热)量与压缩机转速有关,经过控制压缩机转速频率来控制所需热量。
空调模型相当于一个积分环节与一个惯性环节的串联。
房间模型主要考虑室内外温度干扰与散热片热量共同作用于具有初始温度房间,经空气导热延迟,简化为具有一阶惯性环节[2]。
2.2计划设计进程
一、总体方案设计
二、控制系统的建模和数字控制器设计
三、硬件的设计和实现
1、选择计算机字长(选用51内核的单片机)
2、设计支持计算机工作的外围电路(EPROM、RAM、I/O端口、键盘、显示接口电路等);
3、设计输入信号接口电路;
4、设计信号输出控制电路;
5、其它相关电路的设计或方案(电源、通信等)。
四、软件设计
1、分配系统资源,编写系统初始化和主程序模块框图;
2、编写A/D转换和位置检测子程序框图;
3、编写控制程序和D/A转换控制子程序模块框图;
4、其它程序模块(显示与键盘等处理程序)框图。
五、编写课程设计说明书,绘制完整的系统电路图(A3幅面)。
3设计方案
空调控制系统能够划分为七大部分:
系统控制部分、室内温度采集部分、键盘控制部分、温度显示部分、压缩机控制部分、四通阈控制部分、风机控制部分。
各模块电路的框图如图所示。
图1各模块电路的框图
4空调模型
4.1模型分析
(1)空调模型相当于一个积分环节与一个惯性环节的串联。
房间模型主要考虑室内外温度干扰与散热片热量共同作用于具有初始温度房间,经空气导热延迟,简化为具有一阶惯性环节。
(2)由任务书给定条件:
房间热惯性时间常数为450,空气导热延迟τ=35,经过分析,我们选择PID控制算法进行控制。
4.2MATLAB仿真
图2MATLAB仿真
4.3仿真结果
图3MATLAB仿真结果
5硬件设计
5.1硬件系统框图
根据任务书可知,该系统需要人机界面(按键输入LCD1602显示),AD采样,以及单片机控制部分等模块,而且能够得到以下硬件系统框图
图4硬件系统框图
5.2各部分的硬件设计
1温度传感器选择[3]
根据任务要求我们选择了AT590作为温度传感器。
AD590电流输出型两端温度传感器是美国模拟器件公司生产的单片集成两端感温电流源。
它的主要特性如下:
(1)流过器件的电流(mA)等于器件所处环境的热力学温度(开尔文)度数,即:
mA/K式中:
流过器件(AD590)的电流,单位为mA;T—热力学温度,单位为K。
2、AD590的测温范围为-55℃~+150℃。
3、AD590的电源电压范围为4V~30V。
电源电压可在4V~6V范围变化,电流变化1mA,相当于温度变化1K。
AD590能够承受44V正向电压和20V反向电压,因而器件反接也不会被损坏。
4、精度高。
AD590共有I、J、K、L、M五档,其中M档精度最高,在-55℃~+150℃范围内,非线性误差为±0.3℃。
其规格如下:
温度每增加1℃,它会增加1μA输出电流。
可量测范围-55℃至150℃。
供应电压范围+4V至30V。
AD590的接脚图及零件符号如下图所示:
AD590的输出电流值说明如下:
其输出电流是以绝对温度零度(-273℃)为基准,每增加1℃,它会增加1μA输出电流,因此在室温25℃时,其输出电流Io=(273+25)=298μA。
Vo的值为Io乘上10K,以室温25℃而言,输出值为2.98V(10K×298μA)。
量测Vo时,不可分出任何电流,否则测量值会不准。
电路分析:
AD590的输出电流I=(273+T)μA(T为摄氏温度),因此电压V为(273+T)μA×10K=(2.73+T/100)V。
为了将电压量测出来又需使输出电流I不分流出来,我们使用电压追随器其输出电压V2等于输入电压V。
由于一般电源供应较多零件之后,电源是带杂讯的,因此我们使用齐纳二极体作为稳压零件,再利用可变电阻分压,其输出电压V1需调整至2.73V。
接下来我们使用差动放大器其输出Vo为(100K/10K)×(V2-V1)=T/10V。
如果现在为摄氏28度,输出电压为2.8V。
(2)AD转换器的选择
因为温度变化范围是-50--50度,理论上AD位数只要7位(128级)就够了,
因此系统采用了经典的ADC0809(8位AD)作为AD采样芯片。
温度的计算公式:
V=5*Rt/(R+R1+Rt)。
ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。
它是逐次逼近式A/D转换器,能够和单片机直接接口。
a.ADC0809的内部逻辑结构
图5ADC0809内部原理
由图5可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才能够从三态输出锁存器取走转换完的数据。
b引脚结构(如图)
IN0-IN7:
8条模拟量输入通道
图6ADC0809引脚图
ADC0809对输入模拟量要求:
信号单极性,电压范围是0-5V,若信号太小,必须进行放大;地址输入和控制线:
4条。
ALE为地址锁存允许输入线,高电平有效。
当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。
A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。
通道选择表如表1所示。
C
B
A
选择的通道
0
0
0
IN0
0
0
1
IN1
0
1
0
IN2
0
1
1
IN3
1
0
0
IN4
1
0
1
IN5
1
1
0
IN6
1
1
1
IN7
表1
数字量输出及控制线:
11条
ST为转换启动信号。
当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。
EOC为转换结束信号。
当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。
OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。
OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。
D7-D0为数字量输出线。
CLK为时钟输入信号线。
因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,一般使用频率为500KHZ,VREF(+),VREF(-)为参考电压输入。
c.ADC0809应用说明
ADC0809内部带有输出锁存器,能够与AT89S51单片机直接相连。
初始化时,使ST和OE信号全为低电平。
送要转换的哪一通道的地址到A,B,C端口上。
在ST端给出一个至少有100ns宽的正脉冲信号。
是否转换完毕,我们根据EOC信号来判断。
当EOC变为高电平时,给OE为高电平,转换的数据就输出给单片机了。
(3)按键输入
因为按键数目不多,因此系统直接采用非编码方式,直接连接单片机I/O口。
图7按键电路
(4)显示部分
系统采用LCD1602,P0和P3.0-P3.2作为输出口,控制LCD显示器,如图8。
图8LCD1602
(5)输出控制
设计使用LCD1602显示当前设定温度和实际测量温度,用两个LED指示当前空调状态(加热或制冷),51单片机的低电平驱动能力较强,LED能够直接连接单片机的I/O口;单片机输出PWM波经驱动电路从而控制压缩机的转速。
(6)系统硬件设计图
图9硬件原理图
6软件设计
6.1工作模式分析
由系统要求能够列出表2
工作
模式
设定
温度
实际
温度
压缩机
制冷
25.0度
小于25.0度
工作
制热
25.0度
小于25.0度
工作
保持
25.0度
小于25.0度
不
工作
表2
根据上表,我们列出一系列子程序,再根据当前状况选择相应的子程序。
例如控制部分子程序如下:
voidoutput(inttemp1,inttemp2)
{
unsignedchartable[3];
table[2]=temp1%10;table[1]=(temp1/10)%10;table[0]=(temp1/100)%10;
DisplayString(0,1,"CurrentT:
");//显示当前测量温度
DisplayOneChar(10,1,table[0]+0x30);
DisplayOneChar(11,1,table[1]+0x30);
DisplayOneChar(8,1,'.');
DisplayOneChar(12,1,table[2]+0x30);
DisplayOneChar(13,1,'C');
table[2]=temp2%10;table[1]=(temp2/10)%10;table[0]=(temp2/100)%10;
DisplayString(0,0,"SetUpT:
");//显示空调设定温度
DisplayOneChar(10,0,table[0]+0x30);
DisplayOneChar(11,0,table[1]+0x30);
DisplayOneChar(8,0,'.');
DisplayOneChar(12,0,table[2]+0x30);
DisplayOneChar(13,0,'C');
if(temp1>temp2){motor=0;cold=0;hot=1;}//当前温度大于设定温度,制冷
elseif(temp1else{motor=1;cold=1;hot=1;}//当前温度等于设定温度,保持
}
6.2系统程序流程图
图10系统流程图
6.3AD转化程序设计
(1)进行A/D转换之前,要启动转换的方法:
ABC=000选择第一通道。
ST=0,ST=1,ST=0产生启动转换的正脉冲信号
(2)进行A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕,若完毕则把数据经过P1端口读入进行处理。
6.4PID算法设计
voidpid(void)
{
error=ideal_speed-pulse_speed;
d_error=error-pre_error;
pre_error=error;
pre_d_error=d_error;
PWM+=kp*d_error+ki*error+kd*(error+pre_d_error-2*pre_error);
}
心得体会
经过本此课程设计我已经能够熟练使用一些控制算法及设计方法。
与此同时,也锻炼了我们的基本设计能力,为我们日后的学习打下了坚实的基础。
经过这次课程设计,进一步加深了对计算机控制技术的了解,让我对它有了更加浓厚的兴趣。
特别是每当程序编写调试成功时,心里特别的开心。
可是有时也遇到了不少问题,特别是硬件之间的连接,总是有错误的存在,可是在我们细心的检查下,终于找出了错误和警告的所在,排除困难后,心里终于舒了一口气。
在空调控制系统的设计过程中,再一次认识到团队精神以及协同合作的重要性和优越性,无论是学习,还是日常生活,都应该继承和发扬这种珍贵的团队精神。
虽然这次学习时间并不长,可是对自主学习的要求提高了,经过这样的学习形式,提高了我的学习能力。
此次的《计算机控制技术》课程设计,得到了不少的启示。
思考问题以及进行实践都要严谨,缜密。
真所谓小心取证,就是这个道理。
让我重新认识了团队精神的重要性及如何在团队中尽可能的发挥自己的长处、优势;如何去学习别人的长处、优点来弥补自身的不足都有了一定程度的提升。
经过学习空调控制系统的设计,更加了解可编程控制器的构造及应用,激发我们的创新意识。
在学习与进行设计的过程中,利用已经掌握的知识及查阅的资料,自行完成课程设计任务以及设计完成。
“学无止境,上下求索”,在今后的工作中,我将把学到的知识和自己的同伴的知识融合,并灵活的运用到学习、工作和生活当中。
课程设计的学习生活使我的人生有了较高的起点,在这个起点上,我将不断向前,用自己辛勤的汗水,铿锵的脚步和竖韧不拔的精神,体验人生的涵义,谱写对生命的承诺。
只有不断挑战自己、超越自己,才能跟上时代的步伐。
参考文献
[1]于海生编著计算机控制技术.北京:
机械工业出版社,
[2]余锡存曹国华著单片机原理与接口技术.西安:
西安电子科技大学出版社,。
[3]田良黄正谨著综合电子设计与实践.南京:
东南大学出版社,。
附录
#include
voidLcd_WriteData(unsignedcharTempData);
voidLcd_WriteCmd(unsignedcharTempData,unsignedcharBuysC);
voidLcd_ReadStatus(void);
voidLcd_Init(void);//LCD初始化
unsignedcharLcd_ReadData(void);
voidDisplayString(unsignedcharX,unsignedcharY,unsignedchar*DData);
voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);
voidDelay(unsignedintdelaytime);
unsignedintADC0809();
voidsetup(unsignedchar);
voidoutput(inttemp1,inttemp2);
unsignedcharkey_scan();
/********************************************************************
全局变量定义
********************************************************************/
sbitLcd_RS=P3^0;
sbitLcd_RW=P3^1;
sbitLcd_E=P3^2;
#defineLcd_DataP0
sbitST=P2^5;
sbitEOC=P2^6;
sbitOE=P2^7;
sbitCLK=P2^4;
#defineADC_OUTP1
sbitup=P3^4;
sbitdown=P3^5;
sbitmotor=P2^0;
sbithot=P2^1;
sbitcold=P2^2;
intsetup_t=250
/********************************************************************
主函数
********************************************************************/
voidmain(void)
{
unsignedintcurrent_t;
unsignedcharkey;
Lcd_Init();//lcd初始化
while
(1)
{
current_t=ADC0809();
key=key_scan();
setup(key);
output(current_t,setup_t);
}
}
/********************************************************************
子函数定义
********************************************************************/
unsignedcharkey_scan()
{
unsignedchartemp=0;
if(up==0){temp=1;while(!
up);}
elseif(down==0){temp=2;while(!
down);}
return(temp);
}
voidsetup(unsignedchart1)
{
if(t1==1)setup_t++;
if(t1==2)setup_t--;
}
voidoutput(inttemp1,inttemp2)
{
unsignedchartable[3];
table[2]=temp1%10;
table[1]=(temp1/10)%10;
table[0]=(temp1/100)%10;
DisplayString(0,1,"CurrentT:
");
DisplayOneChar(10,1,table[0]+0x30);
DisplayOneChar(11,1,table[1]+0x30);
DisplayOneChar(12,1,'.');//LCD显示测量值
DisplayOneChar(13,1,table[2]+0x30);
DisplayOneChar(14,1,'C');
table[2]=temp2%10;
table[1]=(temp2/10)%10;
table[0]=(temp2/100)%10;
DisplayString(0,0,"SetUpT:
");
DisplayOneChar(10,0,table[0]+0x30);
DisplayOneChar(11,0,table[1]+0x30);
DisplayOneChar(12,0,'.');//LCD显示测量值
DisplayOneChar(13,0,table[2]+0x30);
DisplayOneChar(14,0,'C');
if(temp1>temp2){motor=0;cold=0;hot=1;}
elseif(temp1else{motor=1;cold=1;hot=1;}
}
voidpid(void)//电机
{
error=ideal_speed-pulse_speed;
d_error=error-pre_error;
pre_error=error;
pre_d_error=d_error;
PWM+=kp*d_error+ki*error+kd*(error+pre_d_error-2*pre_error);
}
/********************************************************************
A/D转换程序
********************************************************************/
unsignedintADC0809()
{
unsignedintadc;unsignedlongintgetdata;
ST=0;OE=0;ST=1;ST=0;
while
(1)
{
CLK=~CLK;
if(EOC==1)break;
}//AD时钟脉冲
OE=1;
getdata=ADC_OUT;
OE=0;
adc=getdata*500/256;
return(adc);
}
/*******************************************************************
*LCD1602驱动程序
********************************************************************/
voidLcd_WriteData(unsignedcharTempData)
{
Lcd_ReadStatus();
Lcd_Data=TempData;
Lcd_RS=1;
Lcd_RW=0;
Lcd_E=0;
Lcd_E=0;
Lcd_E=1;
Lcd_E=0;
}//写指令
voidLcd_WriteCmd(unsignedcharTempData,unsignedcharBuysC)
{
if(BuysC)Lcd_ReadStatus();
Lcd_Data=TempData;
Lcd_RS=0;
Lcd_RW=0;
Lcd_E=0;
Lcd_E=0;
Lcd_E=1;
Lcd_E=0;
Lcd_E=0;
}//读数据
unsignedcharLcd_ReadData(void)
{
Lcd_RS=1;
Lcd_RW=1;
Lcd_E=0;
Lcd_E=0;
Lcd_E=0;
Lcd_E=0;
Lcd_E=1;
Lcd_E=0;
return(Lcd_Data);
}
voidLcd_ReadStatus(void)
{
Delay(100);
}
voidLcd_Init(void)//