北工大版 电子工程设计 温控系统 第二次实验报告.docx

上传人:b****5 文档编号:30007676 上传时间:2023-08-04 格式:DOCX 页数:33 大小:756.05KB
下载 相关 举报
北工大版 电子工程设计 温控系统 第二次实验报告.docx_第1页
第1页 / 共33页
北工大版 电子工程设计 温控系统 第二次实验报告.docx_第2页
第2页 / 共33页
北工大版 电子工程设计 温控系统 第二次实验报告.docx_第3页
第3页 / 共33页
北工大版 电子工程设计 温控系统 第二次实验报告.docx_第4页
第4页 / 共33页
北工大版 电子工程设计 温控系统 第二次实验报告.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

北工大版 电子工程设计 温控系统 第二次实验报告.docx

《北工大版 电子工程设计 温控系统 第二次实验报告.docx》由会员分享,可在线阅读,更多相关《北工大版 电子工程设计 温控系统 第二次实验报告.docx(33页珍藏版)》请在冰豆网上搜索。

北工大版 电子工程设计 温控系统 第二次实验报告.docx

北工大版电子工程设计温控系统第二次实验报告

电子工程设计报告

温度测量系统/闭环温度控制系统设计

 

 

单片机应用电路.........................................................................................3

 

模数转换电路.............................................................................................5

 

数模转换电路.............................................................................................7

 

显示键盘电路.............................................................................................9

 

温度测量程序设计.....................................................................................11

 

程序设计.....................................................................................................11

 

遇到的问题及解决方案.............................................................................18

 

心得体会......................................................................................................19

 

感谢..............................................................................................................20

 

参考文献......................................................................................................20

 

附录:

原程序..............................................................................................20

 

一.单片机应用电路

1.设计任务与设计要求

片选信号:

6个

地址信号:

4个

控制信号:

RD,WR,ALE,INT0

数据总线:

AD0~AD7

安装:

独立电路板结构

2.电路设计方案

①MCS-51系列单片机有众多性能优异的兼容产品、成熟的开发环境、世界上最大的单片机客户群、高性价比、畅通的供货渠道,是初学者的首选机型。

8051是MCS-51系列单片机早期产品之一,内建一次性可编程只读存储器(PROM),只需要很少的外围元件即可组成最小系统。

所以我们选择8051作为我们的单片机

②安装结构

③电路选择

单片机模块P3口为数据/地址复用端口,为了得到低8位地址,需要设计数据/地址分离电路。

所以设计电路图如下

3.原理及功能分析

(1)74LS373工作原理

当三态允许控制端OE为低电平时,Q0~Q7为正常逻辑状态,可用来驱动负载或总线。

当OE为高电平时,Q0~Q7呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。

当锁存允许端LE为高电平时,Q随数据D而变。

当LE为低电平时,D被锁存在已建立的数据电平。

当LE端施密特触发器的输入滞后作用,使交流和直流噪声抗扰度被改善400mV。

(2)74LS138工作原理

当一个选通端(E1)为高电平,另两个选通端((/E2))和/(E3))为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。

比如:

A2A1A0=110时,则Y6输出端输出低电平信号。

(3)电路工作原理

①C8051的P3口为数据/地址复用端口,为了得到低8位地址,需要数据/地址分离电路。

C8051通过A13、A14、A15三口输出信号给74LS138译码器,经过芯片译码后输出6个片选信号,当输出相应地址时输出相应片选。

译码器的E1、E2口接低,E3口接高,7、9两口制空。

②C8051接收信号后需要数据/地址分离电路,而74LS373锁存器便充当了这一功能。

373从8051的D0~D7口接收到信号后将信号分离,数据信号从锁存器的Q0~Q3口输出,地址信号从锁存器的D0~D7口输出。

 

二.模数转换电路

1.设计任务与设计要求

输入信号范围:

0V~+5V

分辨率:

8bit

精度:

1LSB

转换时间:

<1ms

安装:

独立电路板结构

2.电路设计方案

①D/A---数字量→模拟量转换电路,常用D/A电路的基本原理有电流开关型和脉宽调制型,其中电流开关型是用数字切换电流开关,产生与电阻网络权电流对应的电流“和”;脉宽调制型是将数字转换为输出脉冲宽度,用积分器将脉冲宽度转换为与之对应的电压输出。

DAC0832是8位乘算型电流输出的典型产品,具有MCU兼容接口,使用方便,价格低,能满足设计要求。

所以我们选择DAC0832。

②安装结构

③电路选择

 

3.原理及功能分析

(1)ADC0804工作原理

ADC0804采用的是逐次比较的方法,逐次比较转换过程与用天平称物重的方法类似。

其方法是将输入信号的电压与一系列的参考电压相比较。

第一次与输入参考电压5V的一半进行比较(即2.5V),如果大于2.5V,则将置1,并保留2.5V;如果小于2.5V,则将置0,并舍去2.5V。

第二次将数入参考电压的四分之一(即1.25V)加到上一次所剩下的值上,将输入电压与这个值进行比较,如果大于这个值,则将置1,并保留这个值;如果小于这个值,则将置0,并舍去这次新加上的1.25V。

依此类推,每次新加上的值都是上一次所新加的值的一半,如此比较8次之后,就被确定下来了,此值就是ADC0804的输出。

(2)电路工作原理

将Vin(+)输入的模拟量通过ADC0804转换为数字量,从11到18管脚输出。

其中Vin(-)、AGND、10脚接地。

4脚和19脚之间按图示的方法接10KΩ的电阻和150PF的电容,与内部电路配合构成时钟信号的发生电路。

片选CS接单片机的CS1片选,RD、WR分别接单片机的RD和WR信号。

(3)电路主要参数的计算

4脚和19脚之间按图示的方法接10KΩ的电阻和150PF的电容,是根据芯片手册上给的参考电路所确定的。

 

三.数模转换电路

1.设计任务与设计要求

输入范围:

00H~0FFH

对应输入:

-10V~+10V

输出阻抗:

<100Ω

响应时间:

<1ms

电源供电:

+5V,±12V

安装:

独立电路板结构

2.电路设计方案

①A/D---模拟量→数字量转换电路,常用A/D电路的基本原理有积分型、逐次比较型、并行比较型。

其中积分型是将电压转换成脉宽信号或频率,由定时器/计数器获得数字值。

逐次比较型是由比较器和DA转换器通过逐次比较逻辑构成,经n次比较而输出数字值。

并行比较型是用多个比较器,仅作一次比较而实行转换。

压频转换型是将模拟信号转换成频率,然后用计数器将频率转换成数字量,从理论上讲其分辨率几乎可以无限增加。

ADC0804是8位逐次比较(逐次逼近)型典型产品,具有MCU兼容接口,使用方便;分辩率和转换速度都能够满足设计要求,且价格低廉。

②安装结构

③电路选择

3.原理及功能分析

(1)DAC0832工作原理

DAC0832是8位分辨率的D/A转换集成芯片。

与微处理器完全兼容。

这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。

D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。

它有八个恒流源,每个恒流源之间相差2倍。

由D0~D7八个地址口相应输出信号给八个恒流源,当信号为“1”时开关开,从Iout1管脚输出给后面电路,当信号为“0”时,接地。

(2)电路工作原理

DAC0832输出口Iout1、2分别接NE5532的2、3口,NE5532的5口接模拟地,电流转成电压,然后电压放大,最后电压平移。

DAC0832的Iout1和电阻输出一电流信号经过运放的虚短虚断变为0~-5V的电压,之后再通过一个负反馈电路,电压值=,得到一个0~20V的电压。

+5V的电压经过运放后,得到-10V电压。

经过负反馈的0~20V的电压再经过-10V电压平移最终得到-10V~+10V的电压输出。

 

四.显示键盘电路

1.设计任务与设计要求

显示能力:

4位7段数码显示,前三位含小数点

键盘功能:

0~9数字按键及若干功能按键控制

安装:

独立电路版安装结构

2.电路设计方案

①基本显示控制方式有静态和动态两种,静态电路考验的是焊接工艺,动态电路考验的是程序编写能力。

因为我们组比较擅长于程序编写方面,所以我们选择了动态电路显示控制方式。

其中最主要的部件是CH452芯片,基本功能是采用动态扫描控制方式,4线同步串行接口编程或2线(I2C)串行接口编程。

动态显示电路方案:

电路简单,成本低,控制程序复杂,适用于显示位数较多的场合。

矩阵键盘电路方案:

按键较多时,成本低,控制程序较直读电路复杂,适用于显示位数较多的场合。

②安装结构

设计电路如下:

 

五.温度测量程序设计

1.设计任务与设计要求

搭建测温硬件环境

设计数据数据采集

数据处理

数据显示程序

完成温度测量和显示工作

温度测量显示误差:

2.设计方案

总体功能描述初始化启动A/D转换并读取结果对A/D转换结果进行处理得到显示温度将显示温度转换为显示段码数据将显示段码数据送显示电路进行显示延时1秒钟,开始下一次测温过程

 

六.程序设计

 

 

 

变量

1、数组

①table1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

一维数组,显示的段码表,从0到9

②table2[3][5]={0,1,2,3,'A',

4,5,6,7,'B',

8,9,'C','D','E‘};

自己设定的二维数组,用于配合读取键值的程序,使得键盘和输入对应。

1、全局变量

r_number1送到AD转换中的数值

r_number2从AD转换中读取的数值

DP_number1送给第一个数码管的数,读取的温度的十位

DP_number2送给第二个数码管的数,读取的温度的个位

DP_number3=2送给第三个数码管的数,并初始化2,输入的温度的十位

DP_number4=5送给第四个数码管的数,并初始化5,输入的温度的个位

DP_number5=0从键盘读取的用于控制的数

DP_number6从键盘读取的用于输入数据的数

DP_number7=0从键盘读取的用于检测是否停止控温的数

coop=0控温监测变量

t=0输入温度检测变量

一、子程序

1、voidmain(void)主函数

{

Init_Device();

while

(1)

{

INTR5:

;

Read();

display();

K_int1();

if(t==1){K_int2();t=0;gotoINTR5;}

if(coop==1){

while

(1)

{

Read();

T_change();

display();

K_int3();

if(DP_number7=='D'){DP_number7=0;coop=0;}

if(coop==0){control=0x80;gotoINTR6;}

}

}

INTR6:

;

}

}

主函数,用于实现框图中的功能,按照框图的逻辑编写,这里不再赘述

2、voiddisplay(void)显示函数

{

DP1=table1[DP_number1];

DP2=table1[DP_number2];

DP3=table1[DP_number3];

DP4=table1[DP_number4];

}

即分别把要送给四个数码管的数,通过table1表的翻译,送到每个数码管中。

3、voiddelay(void)延时函数

{

unsignedinti;

for(i=0;i

}

虽然设置了延时函数,但对其它模块的具体作用不是很清楚,感觉没有存在必要,但还是对其进行了保留,其在读取温度值的时候还是有一定的作用的。

4、voidK_int1(void)键盘控制信息输入函数

{unsignedcharl_val,r_val,r_state,temp,cont,x,c;

intkey;

while

(1)

{

key=0x0004;

for(x=1;x<5;x++,key++)

{

c=XBYTE[key];

if(r_state=~c&0x1f)

{

for(cont=1,temp=0x01;cont<6;++cont,temp=temp<<1)

if((r_state&temp)!

=0)

{

r_val=cont;

l_val=x;

DP_number5=table2[l_val-1][r_val-1];

if(DP_number5=='A'){t=1;gotoINTR1;}

if(DP_number5=='C'){coop=1;gotoINTR1;}

}

}

}

}

INTR1:

;

}

此函数的主体还是采用了老师给的键盘调试程序中的方法,完全是复制粘贴过来的。

调试程序中,可以实现读取按键的行值和列值,由此我们想到,可以按照键盘上的数字,设置一个二维数组,这样通过读取行值和列值就能对应出输入的数。

此模块只有两个跳出办法,一个是按下启动输入控制温度的开始键,一个是按下开始闭环控制的键。

同时,按下键时,分别影响标志变量。

在主程序中,通过判断标识变量是0还是1,就可进行相应的操作。

5、voidK_int2(void)控制温度输入程序

{

unsignedcharl_val,r_val,r_state,temp,cont,x,c;

intkey;

Init_Device();

while

(1)

{

key=0x0004;

for(x=1;x<5;x++,key++)

{

c=XBYTE[key];

if(r_state=~c&0x1f)

{

for(cont=1,temp=0x01;cont<6;++cont,temp=temp<<1)

if((r_state&temp)!

=0)

{

r_val=cont;

l_val=x;

DP_number6=table2[l_val-1][r_val-1];

if(DP_number6=='B')

{gotoINTR2;}

DP_number3=DP_number6;

display();

}

}

}

}

INTR2:

;

while

(1)

{

key=0x0004;

for(x=1;x<5;x++,key++)

{

c=XBYTE[key];

if(r_state=~c&0x1f)

{

for(cont=1,temp=0x01;cont<6;++cont,temp=temp<<1)

if((r_state&temp)!

=0)

{

r_val=cont;

l_val=x;

DP_number6=table2[l_val-1][r_val-1];;

if(DP_number6=='E')

{gotoINTR4;}

DP_number4=DP_number6;

display();

}

}

}

}

INTR4:

;

}

当通过K_int1函数影响标识变量后,就判断标识变量,如果t=1,就表明进行控制温度输入,就调用温度控制输入函数。

这个模块是花费时间最多的模块,经过与好多人讨论,网上查了一些算法,最终确定了这个方法。

起初,我们想,输入两个数,不过是调用输入函数两次就能实现。

当通过一个死循环实现的时候,可以实现输入两个数字,但我们要求的是输入两个数字之后便不再输入,转入询问是否开启闭环控制温度。

于是,我们只是调用了像K_int1一样的循环两次,跳出条件是有键按下便跳出,两次调用之间调用一定的延时。

在具体的实验中,我们发现,只能输入温度的个位,十位默认的给出了一个乱码。

经过反复的编写小程序测试,我们发现,只要是使用有键按下便跳出的算法实现的都会出现乱码的情况。

这种现象与其他小组的采用此算法的结果,不谋而合。

于是,经过网上查找一些算法,我们总结出:

如果采用输入一个数然后必须按下确认键才能输入下一个数,那么,在按下确认键之前,输入函数始终是个循环,这样,就与最简单的无限循环输入一样了,肯定能够实现。

所以,我们把输入的跳出条件改为有一个特殊的键按下(可见二维数组中的字母)。

为了防止输入第一个数的确认键和输入第二个数的确认键冲突,我们设置了两个确认键。

由于时间紧急,我们没能来得及去测试如果使用一个确认键,而调用输入程序两次会不会同样能够实现。

这样,K_int2函数就能缩短一半,程序更加优化。

6、voidK_int3(void)询问是否结束闭环控制函数

{unsignedcharl_val,r_val,r_state,temp,cont,x,c;

intkey;

key=0x0004;

for(x=1;x<5;x++,key++)

{

c=XBYTE[key];

if(r_state=~c&0x1f)

{

for(cont=1,temp=0x01;cont<6;++cont,temp=temp<<1)

if((r_state&temp)!

=0)

{

r_val=cont;

l_val=x;

DP_number7=table2[l_val-1][r_val-1];

}

}

}

}

在写程序之初,我们打算只有一个输入函数,结合上监测标识变量,无论是控制输入还是控制温度输入,还是询问是否终止闭环,凡事从键盘读取的,都调用同一个输入函数。

但当我们真正的做起来的时候,发现这样写起来程序非常困难,写一个输入函数需要考虑的问题太多。

所以在写程序的过程中,我们放弃了,决定先完成任务,不论算法的简单与复杂,所以便有了这个K_int3程序。

这个程序实现的是在闭环控制循环中,询问是否结束闭环控制。

结合着主函数中的闭环控制,如果输入的是闭环终止键,那么就让coop=0,而进入闭环控制的条件是coop=1,这样就自动的从循环中跳出来。

当然,在必要的位置,我们给两个检测标识变量清零,防止出现逻辑混乱。

7、voidRead(void)读取调试台温度函数

{

C2=r_number1;

delay();

r_number1=C2;

delay();

r_number2=r_number1*100/256;

DP_number1=r_number2%10;

DP_number2=r_number2/10;

}

这个函数没有什么好解释的,在实现从调试台读数然后送显的功能的时候,这个程序就编好了。

实现的是把调试台的温度换算成十位数和个位数,分别给两个数码管的数。

8、voidT_change(void)闭环温度改变函数

{intnumber_now,number_wish,compare;

number_now=DP_number2*10+DP_number1;

number_wish=DP_number3*10+DP_number4;

compare=number_wish-number_now;

if(compare>=3)

{control=0xff;}

elseif(compare>=1)

{control=(number_wish+15)*256/100;}

elseif(-1

{control=0x80;}

elseif(-3

{control=(number_wish-4)*256/100;}

else

{control=0x00;}

}

此函数中,我们设置了三个变量number_now是从调试台读取的温度number_wish是我们从键盘输入的温度compare是两个温度的差值。

我们设想的闭环温控是一个循环,这个循环不断的读取现在的温度值,与要求的温度值作比较,从而进行相应的加温,减温。

其中,我们对差值进行了分段处理,我们觉得乒乓算法并不是很好,即使在80度的时候,仍然有降温,所以我们结合着乒乓算法与PID算法(PID苦涩难懂,而且很长,我们就放弃了),创造了这样的一个算法。

温度差值在3度以外,是全速的升温降温。

为什么是3这个数值呢,这是我们在调试的过程中修改的,初始我们确定的是5,发现,5还是太大,3足够了。

然后差值在1~3之间,是采取比设定温度高15度升温,经过调试,我们发现,在高温区,其实没什么差别,在中温区,这个算法的效果就很明显了。

因为如果设定温度是80度,那么加上15度也就是95度,与全速升温没差别。

当设定在70度的时候,就有几度的差别,这个影响着精度。

1~3这个区间的划分以及15度的确定,都是实验的结果。

温度差值在-1~1之间,是恒温的。

温度差值在-3~-1之间是采取比设定的温度小4度进行降温。

这个在低温区效果非常明显。

同样,4这个数也是通过反复的修改实验确定的。

最后总体来说一个这个函数,在升温的时候,温度是不可能达到设定温度的,会比设定温度低两度左

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

当前位置:首页 > 经管营销 > 经济市场

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

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