LM35数字温度计最新.docx

上传人:b****3 文档编号:3651233 上传时间:2022-11-24 格式:DOCX 页数:16 大小:478.49KB
下载 相关 举报
LM35数字温度计最新.docx_第1页
第1页 / 共16页
LM35数字温度计最新.docx_第2页
第2页 / 共16页
LM35数字温度计最新.docx_第3页
第3页 / 共16页
LM35数字温度计最新.docx_第4页
第4页 / 共16页
LM35数字温度计最新.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

LM35数字温度计最新.docx

《LM35数字温度计最新.docx》由会员分享,可在线阅读,更多相关《LM35数字温度计最新.docx(16页珍藏版)》请在冰豆网上搜索。

LM35数字温度计最新.docx

LM35数字温度计最新

课程设计任务书

课程设计内容和要求:

以所学EDA课程内容为核心,结合LM35温度传感器,及A/D转换器等内容,设计所需的测温系统。

所设计的温度计的额定温度范围为-55℃—155℃,程序设计部分可利用所学二十四进制计数器进行改编。

对于其他辅助设备,A/D转换器等内容等需查阅资料,对符合要求的型号进行筛选,选出符合条件且最经济适用的部分。

确定其精度大小,适用范围及在整个系统中的连接设置。

将EDA技术使用于芯片设计和系统设计,可极大提高电路设计的效率和可靠性,且节约设计成本。

在实验过程中锻炼了我们的动手能力。

1.LM35温度传感器测温系统摘要…………………………

2.绪论——整个课程设计的思路……………………………

3.Protel99绘图过程…………………………………………

4.LM35温度传感器介绍……………………………………

5.主要芯片及程序……………………………………………

6.技术总结……………………………………………………

7.参考文献……………………………………………………

8.致谢…………………………………………………………

摘要

现在EDA技术是电子设计的重要工具,其核心是利用计算机完成电路设计的全程自动化,将EDA技术使用于芯片设计和系统设计,可极大提高电路设计的效率和可靠性,节约设计成本,减少设计人员的劳动强度。

本次课程设计以EDA技术为主体,辅助学习传感器原理,A/D转换器原理,设计LM35温度传感器测温系统,运用LM35为温度传感器收集信号,因为用计算机来构建数据采集系统时看,利用温度传感器的敏感特性,去检测周围的温度,所经采集的温度信号时连续的信号,而计算机能处理不连续变化的信号,因此必须用A/D转换器将模拟信号转换为电信号后进行处理,所以再利用A/D转换器将收集到的模拟信号转换为电信号送入计算机进行处理,再利用显示电路把转换后的数字信号显示出来。

本次设计将介绍EP2C5Q208C8芯片,温度传感器LM35及AD521芯片的基本原理和特点,及利用protel99画图的简要过程。

绪论

 本次课程设计主要对常规数字温度计设计。

LM35温度传感器测温系统的主要功能是测量周围环境的温度,在各类民用控制,工业控制以及航空航天技术方面,温度测量得到了广泛的使用。

小型、低功耗、可靠性高、低成本的LM35温度传感器便得以备受关注,利用LM35为温度传感器,去收集周围环境的温度信号即可。

因为所采集的温度信号是连续变化的模拟量,而只要功能芯片EP2C5Q208C8能处理不连续的信号,因此,必须用A/D转换器将模拟信号转换成数字信号,再放大相应的倍数,才能送给主芯片进行处理,再利用显示电路把转换后的数字信号显示出来。

对于显示电路的连接必须注意只能和能满足其需要的特定I/O口连接看,否则可能会导致显示的数值出现异常。

一.Protel99SE绘图过程

设置原理图设计环境,设计环境对画原理图人影响很大,在画原理图之前,应该把设计环境设置好,工作环境是使用DESIGN/OPTIONS和TOOL/PREFERENCE菜单进行的,画原理图环境的设置主要包括图纸大小,捕捉栅格,电气栅格,模板设置等。

A.放置元件。

将电气和电子元件放置到图纸上,一般情况下元件的原理图符号在元件库中都可以找到,只需要将元件从元件库中取出,放置在图上,但由于本次设计中有一些新元件,故还要自己画元件。

B.画元件图。

1、首先选择菜单FILE/NEW,然后在出现的窗口选择SCHEMATICLIBRARYDOCUMENT图标建立一个元件库,该库的缺省名为SCHLIBL.LIB;在设计管理器窗口中双击该元件库,这就进入了画元件图窗口,在元件管理器窗口,可以看到已经给元件取了个缺省名COMPONENT_。

2、进入编辑窗口后使用pageup键将窗口放大,放大到能清楚地看到可视栅格。

3、然后使用绘图工具箱中的工具依次绘出所需使用的元件,如LM35、芯片ADC0809、芯片EP2C5Q208C8、3-8译码器、74LS138等。

4、当需要对所画元件放置管脚时,单击工具箱上的放管脚工具,就会看见鼠标变成十字还带着一个管脚,将鼠标移动到放置管脚的地方,单击鼠标将管脚一个接一个放置,注意用空格键调整管脚方向。

其中管脚的系列号是Protel99SE软件自动加上去的,若管脚名称或管脚的序号需要按顺序排列,则在放置第一个管脚之前,按Tab键然后在管脚Name和Number属性中输入排列序号的第一个数值或字母加数字,例如,若管脚序列号按数字增加的顺序排列,则输入第一个数字:

若管脚名按D0、D1、D2……排列,则输入D0。

C.若需要将所画元件图放在原理图中,则需要将左上侧的Place单击则会自动跳转至原理图中,但选取适当的位置后,则单击右键即可确认。

D.原理图布线,元件一旦放置在原理图上,就需要用导线将元件连接起来,连接时一定要符合电气规则。

E.编辑和调整,编辑元件的属性,这些属性包括元件名,参数,封装图等,然后将元件和导线的位置进行细微的调整。

F.检查原理图在编辑元件的属性的基础上使用Protel99SE的电气规则检查功能,检查原理图的连线是否合理和正确,给出检查报告,若有错误,就需要根据错误情况进行改正。

G.在原理图右下角输入原理图名称,然后打印输出原理图。

原理图如下:

二.LM35传感器介绍

LM35是NS公司生产的集成电路温度传感器系列产品之一,它具有很高的工作精度和较宽的线性工作范围,该器件输出电压和摄氏温度线性成比例。

因而,从使用角度来说,LM35和用开尔文标准的线性温度传感器相比更有优越之处,LM35无需外部校准或微调,可以提供±1/4℃的常用的室温精度。

LM35在单电源模式下在25°C下静默电流为50μA,非常省电:

静默电流温度关系

单电源模式的接法

单电源供电模式下的温度和电压变化呈线性关系

·工作电压:

直流4―30V;

·工作电流:

小于133μA;

·输出电压:

+6V—-1.0V;

·输出阻抗:

1mA负载时0.1Ω;

·精度:

0.5℃精度(+25℃时);

·泄漏电流:

小于60μA;

·比例因数:

线性+10.0mV/℃;

·校准方式:

直接用摄氏温度校准;

·封装:

密封TO-46晶体管封装或塑料TO-92晶体管封装;

·使用温度范围:

-55—+150℃额定范围。

引脚介绍:

①正电压Vcc;②输出;③输出地/电源地。

三.主要芯片及程序

A/D转换器介绍

AD521是个增益放大器,AD521集成数据采集放大器可以在环境恶劣的工作条件下进行高精度的数据采集。

它线性好,并具有高共模抑制比、低电压漂移和低噪声的优点,适用于大多数12位数据采集系统。

AD521通常用于电阻传感器(电热调节器、应变仪等)构成的桥式传感器放大器以及过程控制、仪器仪表、信息处理和医疗仪器等方面。

AD521主要特性:

●低漂移:

2.0μV/℃(AD522B);

●非线性低:

0.005%(G=100);

●高共模抑制比:

>110dB(G=1000);

●低噪声:

1.5μVp-p(0.1~100Hz);

●单电阻可编程增益:

1≤G≤1000;

●具有输出参考端及远程补偿端;

●可进行内部补偿;

●除增益电阻外,不需其它外围器件;

●可调整偏移、增益和共模抑制比

4、温度采集模数信号转换部分电路图

工作芯片介绍

CycloneIIEP2C5Q208C8是Altera公司生产的一款具有较高性价比的FPGA芯片,它采用Stratix架构,使用90nm工艺生产,具有4608个LE,26个M4K单元,2个PLL以及13个乘法器,另外,其I/O管脚可以直接和系统中使用的其它芯片相连而不需要进行电平转换。

该款FPGA的内部资源以及管脚数量能够完全满足本案的设计需求。

故选用该款FPGA作为主控逻辑芯片。

FPGA的内部功能模块可以划分为UART收发、AD521控制、包络信号DDS、脉冲信号控制、变频控制信号输出这五个主要部分,另外,还包括各个模块间的协调以及时钟信号产生等部分。

这些控制逻辑都通过Verilog硬件描述语言来实现

主程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYclockIS

PORT(

clk:

INSTD_LOGIC;

enable:

INSTD_LOGIC;

sel:

OUTSTD_LOGIC_VECTOR(2DOWNTO0);

segment:

OUTSTD_LOGIC_VECTOR(6DOWNTO0));

ENDclock;

ARCHITECTURErt1OFclockIS

COMPONENTclk_div1000

PORT(clk:

INSTD_LOGIC;

clk_div:

OUTSTD_LOGIC);

ENDCOMPONENT;

COMPONENTcount100

PORT(

enable:

INSTD_LOGIC;

clk0:

INSTD_LOGIC;

qh:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

ql:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDCOMPONENT;

COMPONENTdisplay

PORT(

clk:

INSTD_LOGIC;

qh:

INSTD_LOGIC_VECTOR(3DOWNTO0);

ql:

INSTD_LOGIC_VECTOR(3DOWNTO0);

sel:

OUTSTD_LOGIC_VECTOR(2DOWNTO0);

segment:

OUTSTD_LOGIC_VECTOR(6DOWNTO0));

ENDCOMPONENT;

signalqh:

STD_LOGIC_VECTOR(3DOWNTO0);

signalql:

STD_LOGIC_VECTOR(3DOWNTO0);

signalclk0:

STD_LOGIC;

BEGIN

u0:

clk_div1000PORTMAP(clk,clk0);

u1:

count100PORTMAP(enable,clk0,qh,ql);

u2:

displayPORTMAP(clk,qh,ql,sel,segment);

ENDrt1;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYclk_div1000IS

PORT(

clk:

INSTD_LOGIC;

clk_div:

OUTSTD_LOGIC);

ENDclk_div1000;

ARCHITECTURErt1OFclk_div1000IS

SIGNALq_tmp:

INTEGERrange0to999;

BEGIN

PROCESS(clk)

BEGIN

IF(clk'eventandclk='1')THEN

IF(q_tmp=999)THEN

q_tmp<=0;

ELSE

q_tmp<=q_tmp+1;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clk)

BEGIN

IF(clk'eventandclk='1')THEN

IF(q_tmp=999)THEN

clk_div<='1';

ELSE

clk_div<='0';

ENDIF;

ENDIF;

ENDPROCESS;

ENDrt1;

Libraryieee;

Useieee.std_logic_1164.all;

Useieee.std_logic_unsigned.all;

Entitycont10is

Port(clk,clr:

instd_logic;

Y:

outstd_logic_vector(3downto0);

Cout:

outstd_logic);

Endcont10;

Architectureexampleofcont10is

Signaly_temp:

std_logic_vector(3downto0);

Begin

Process(clk)

Begin

Ifclr='1'then

Y_temp<="0000";

Elsifclk'eventandclk='1'then

Ify_temp="1001"then

Y_temp<="0000";

Cout<='1';

Else

Y_temp<=y_temp+1;

Cout<='0';

Endif;

Endif;

Endprocess;

Y<=y_temp;

Endexample;

Libraryieee;

Useieee.std_logic_1164.all;

Packagemy_pkgis

Componentcont10

Pork(clk,clr:

instd_logic;

Y:

outstd_logic_vector(3downto0);

Cout:

outstd_logic);

Endcomponent;

Endmy_pkg;

Libraryieee;

Useieee,std_logic_1164.all;

Usework.my_pkg.all;

Entitycont_100is

Pork(clk,clr:

instd_logic;

Y_l,y_h:

outstd_logic_vector(3downto0));

Endcont100;

Architectureexampleofcont100is

Signalx:

std_logic;

Begin

U1:

cont10portmap(clk,clr,y_l,x);

U2:

cont10portmap(clk=>x,clr=>clr,y=>y_h);

Endexample;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYcount8IS

PORT(

clk:

INSTD_LOGIC;

sel:

OUTSTD_LOGIC_VECTOR(2DOWNTO0));

ENDcount8;

ARCHITECTURErt1OFcount8IS

signalsel_temp:

STD_LOGIC_VECTOR(2DOWNTO0);

BEGIN

PROCESS(clk)

BEGIN

IF(clk'eventandclk='1')THEN

IF(sel_temp="111")THEN

sel_temp<=(others=>'0');

ELSE

sel_temp<=sel_temp+1;

ENDIF;

ENDIF;

sel<=sel_temp;

ENDPROCESS;

ENDrt1;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYtime_chooseIS

PORT(

sel:

INSTD_LOGIC_VECTOR(2DOWNTO0);

qh:

INSTD_LOGIC_VECTOR(3DOWNTO0);

ql:

INSTD_LOGIC_VECTOR(3DOWNTO0);

q:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDtime_choose;

ARCHITECTURErt1OFtime_chooseIS

BEGIN

PROCESS(sel,qh,ql)

BEGIN

CASEselIS

WHEN"000"=>q<=ql;

WHEN"001"=>q<=qh;

WHENOTHERS=>q<="XXXX";

ENDCASE;

ENDPROCESS;

ENDrt1;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYseg7IS

PORT(

q:

INSTD_LOGIC_VECTOR(3DOWNTO0);

segment:

OUTSTD_LOGIC_VECTOR(6DOWNTO0));

ENDseg7;

ARCHITECTURErt1OFseg7IS

BEGIN

PROCESS(q)

BEGIN

CASEqIS

WHEN"0000"=>segment<="0111111";

WHEN"0001"=>segment<="0000110";

WHEN"0010"=>segment<="1011011";

WHEN"0011"=>segment<="1001111";

WHEN"0100"=>segment<="1100110";

WHEN"0101"=>segment<="1101101";

WHEN"0110"=>segment<="1111101";

WHEN"0111"=>segment<="0100111";

WHEN"1000"=>segment<="1111111";

WHEN"1001"=>segment<="1101111";

WHENOTHERS=>segment<="XXXXXXX";

ENDCASE;

ENDPROCESS;

ENDrt1;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYdisplayIS

PORT(

clk:

INSTD_LOGIC;

qh:

INSTD_LOGIC_VECTOR(3DOWNTO0);

ql:

INSTD_LOGIC_VECTOR(3DOWNTO0);

sel:

OUTSTD_LOGIC_VECTOR(2DOWNTO0);

segment:

OUTSTD_LOGIC_VECTOR(6DOWNTO0));

ENDdisplay;

ARCHITECTURErt1OFdisplayIS

COMPONENTcount8

PORT(

clk:

INSTD_LOGIC;

sel:

OUTSTD_LOGIC_VECTOR(2DOWNTO0));

ENDCOMPONENT;

COMPONENTtime_choose

PORT(

sel:

INSTD_LOGIC_VECTOR(2DOWNTO0);

qh:

INSTD_LOGIC_VECTOR(3DOWNTO0);

ql:

INSTD_LOGIC_VECTOR(3DOWNTO0);

q:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDCOMPONENT;

COMPONENTseg7

PORT(

q:

INSTD_LOGIC_VECTOR(3DOWNTO0);

segment:

OUTSTD_LOGIC_VECTOR(6DOWNTO0));

ENDCOMPONENT;

SIGNALsel_tmp:

STD_LOGIC_VECTOR(2DOWNTO0);

SIGNALq:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALsegment_tmp:

STD_LOGIC_VECTOR(6DOWNTO0);

BEGIN

U0:

count8PORTMAP(clk,sel_tmp);sel<=sel_tmp;

U2:

time_choosePORTMAP(sel_tmp,qh,ql,q);

U3:

seg7PORTMAP(q,segment_tmp);

segment<=segment_tmp;

ENDrt1;

四、技术总结

为期两周的课设已经接近尾声了,在这2周中,我学到了很多,对EDA的认识也进一步加深了。

从一个刚入门的学习者,渐渐的爱上了这门技术,虽然说对于EDA的知识还有很多要学习和提高,但是在这2周中我还是感受到这门课程的魅力所在。

在拿到数字钟这个课题时,我和我的合作伙伴对这个课题感到比较轻松,脑海中一下子出现了许多设计念头,于是我们就分头去寻找这方面的资料,通过图书馆的书籍资料,网络上的虚拟资料。

在2天的找资料的过程中,我开始觉得所谓的数字钟并非我想象的那么简单。

一开始我想到的数字钟只是一般的计数功能并未涉及到调时,调分,和闹铃功能。

在如何显示方面也没有细细的考虑过。

在看过一些资料后,越来越感觉到数字钟课题并非手到擒来。

在和伙伴商量后,我们以一本参考书的资料为基础开始展开细致设计。

我们一开始的输入是有三个模块,输入模块,计数模块,和显示模块。

对于计数模块我们通过分频方法很快就得到了1HZ的频率用于计数,再通过计数进位标志实现秒,分,时的互相关联,再显示模块,我们通过7段数码管扫描显示也的到了实现。

但是在输入模块,我们却遇到了障碍,如何通过硬件上的有限的开关和按钮来实现呢。

我们首先想到了,做一个可以输入数字的键盘和开关(16*16),可是在想到键盘设计本身就是一个非常复杂的过程,想到2周能做好的话有一定的难度,于是我们果断的放弃了这一计划。

那么如何实现输入,这个问题摆在我们面前,我感到了课设以来前所未有的压抑感。

通过四个开关控制0—9的输入,但是如何控制是输入的是哪一位,如何进行调时,闹铃控制?

都是难题。

在冥想了2天后,我才发现自己陷如了思维的局限性中,为什么一定通过输入来完成调时呢,我们不可以通过他本身的计数功能来调时,这样虽然没有像我们所想的输入调时那样方便,但是它的简单在于充分利用了1HZ频率,通过干扰进位标志进行调时。

这一个方法想到后,其他的闹铃功能和报时功能也都迎刃而解了。

经过3天的编程和功能完善,我们基本实现了所有的功能,各个模块的编译和仿真也都实现了,第二个星期,实验室开放,我和伙伴就开始进行硬件上的实现了,在完成顶层设计后,我们成功的下载在硬件上了。

通过调时后,基本实现了全部功能,并通过了老师的检查。

到此本次课设基本上实现了所有的功能,但在有些功能的实现中,还有待提高。

比如说对于调时功能,只能等待调时,这样对于调时的机动性不好,如果控制不好,过了应调时间的话,就必须在等一次循环后才能调时,这样就很浪费时间了。

还有就是闹钟功能并未完全实现它,我们只是编写了一个特定的程序来闹铃,闹铃时间已经事先安排好了,无法再通过手动调节了,这样就缺少了人性化。

这在课设结束以后,要进一步的改进,争取获得一款高性能的人性化的数字钟。

通过本次课设,我不仅学到了关于EDA的许多专业知识,同时也让我感觉到团队合作的重要性。

其实如何有效和快速的找到资料也是课设给我的启发,利用好图书馆和网络,是资源的到最好的利用。

如果我们一味的屋子里苦思冥想那么再给2周的时间或许也不会有数字钟诞生,所以我觉得和

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

当前位置:首页 > 工程科技 > 能源化工

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

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