课程设计任务书
课程设计内容与要求:
以所学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口连接看,否则可能会导致显示的数值出现异常。 一.Protel 99 SE 绘图过程
设置原理图设计环境,设计环境对画原理图人影响很大,在画原理图之前,应该把设计环境设置好,工作环境是使用DESIGN/OPTIONS和TOOL/PREFERENCE菜单进行的,画原理图环境的设置主要包括图纸大小,捕捉栅格,电气栅格,模板设置等。 A.
放置元件。将电气和电子元件放置到图纸上,一般情况下元件的原理图符号在元件库中都可
以找到,只需要将元件从元件库中取出,放置在图上,但由于本次设计中有一些新元件,故还要自己画元件。 B.
画元件图。1、首先选择菜单FILE/NEW,然后在出现的窗口选择SCHEMATIC LIBRARY DOCUMENT图标建立一个元件库,该库的缺省名为SCHLIBL.LIB;在设计管理器窗口中双击该元件库,这就进入了画元件图窗口,在元件管理器窗口,可以看到已经给元件取了个缺省名COMPONENT_ 。 2、进入编辑窗口后使用page up键将窗口放大,放大到能清楚地看到可视栅格。 3、然后使用绘图工具箱中的工具依次绘出所需使用的元件,如LM35、芯片ADC0809、芯片EP2C5Q208C8、3-8译码器、74LS138等。 4、当需要对所画元件放置管脚时,单击工具箱上的放管脚工具,就会看见鼠标变成十字还带着一个管脚,将鼠标移动到放置管脚的地方,单击鼠标将管脚一个接一个放置,注意用空格键调整管脚方向。 其中管脚的系列号是Protel 99 SE软件自动加上去的,若管脚名称或管脚的序号需要按顺序排列,则在放置第一个管脚之前,按Tab键然后在管脚Name和Number属性中输入排列序号的第一个数值或字母加数字,例如,若管脚序列号按数字增加的顺序排列,则输入第一个数字:若管脚名按D0、D1、D2……排列,则输入D0。 C.
若需要将所画元件图放在原理图中,则需要将左上侧的Place单击则会自动跳转至原理图中,但选取适当的位置后,则单击右键即可确认。 D.
原理图布线,元件一旦放置在原理图上,就需要用导线将元件连接起来,连接时一定要符合电气规则。 E.
编辑与调整,编辑元件的属性,这些属性包括元件名,参数,封装图等,然后将元件与导线的位置进行细微的调整。 F.
检查原理图在编辑元件的属性的基础上使用Protel 99 SE的电气规则检查功能,检查原理图的连线是否合理与正确,给出检查报告,若有错误,就需要根据错误情况进行改正。 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、温度采集模数信号转换部分电路图
工作芯片介绍
Cyclone II EP2C5Q208C8是Altera公司生产的一款具有较高性价比的FPGA芯片,它采用Stratix架构,使用90nm工艺生产,具有4608个LE,26个M4K单元,2个PLL以及13个乘法器,另外,其I/O管脚可以直接与系统中使用的其它芯片相连而不需要进行电平转换。该款FPGA的内部资源以及管脚数量能够完全满足本案的设计需求。故选用该款FPGA作为主控逻辑芯片。
FPGA的内部功能模块可以划分为UART收发、AD521控制、包络信号DDS、脉冲信号控制、变频控制信号输出这五个主要部分,另外,还包括各个模块间的协调以及时钟信号产生等部分。这些控制逻辑都通过Verilog硬件描述语言来实现
主程序 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY clock IS PORT(
clk:IN STD_LOGIC; enable:IN STD_LOGIC;
sel:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); segment:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END clock;
ARCHITECTURE rt1 OF clock IS COMPONENT clk_div1000 PORT(clk:IN STD_LOGIC; clk_div:OUT STD_LOGIC); END COMPONENT; COMPONENT count100 PORT(
enable:IN STD_LOGIC; clk0:IN STD_LOGIC;
qh:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); ql:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT; COMPONENT display PORT(
clk:IN STD_LOGIC;
qh: IN STD_LOGIC_VECTOR(3 DOWNTO 0); ql: IN STD_LOGIC_VECTOR(3 DOWNTO 0); sel:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); segment:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END COMPONENT;
signal qh:STD_LOGIC_VECTOR(3 DOWNTO 0); signal ql:STD_LOGIC_VECTOR(3 DOWNTO 0); signal clk0:STD_LOGIC; BEGIN
u0:clk_div1000 PORT MAP(clk,clk0); u1:count100 PORT MAP(enable,clk0,qh,ql); u2:display PORT MAP(clk,qh,ql,sel,segment); END rt1;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY clk_div1000 IS PORT(
clk:IN STD_LOGIC; clk_div:OUT STD_LOGIC); END clk_div1000;
ARCHITECTURE rt1 OF clk_div1000 IS SIGNAL q_tmp:INTEGER range 0 to 999; BEGIN PROCESS(clk) BEGIN
IF(clk'event and clk='1')THEN IF(q_tmp=999)THEN q_tmp<=0; ELSE
q_tmp<=q_tmp+1; END IF; END IF; END PROCESS; PROCESS(clk) BEGIN
IF(clk'event and clk='1')THEN IF(q_tmp=999)THEN clk_div<='1';
ELSE clk_div<='0'; END IF; END IF; END PROCESS; END rt1;
Library ieee;
Use ieee.std_logic_1164.all; Use ieee.std_logic_unsigned.all; Entity cont10 is Port(clk,clr:in std_logic;
Y: out std_logic_vector(3 downto 0); Cout:out std_logic); End cont10;
Architecture example of cont10 is
Signal y_temp:std_logic_vector(3 downto 0); Begin Process(clk) Begin
If clr='1' then Y_temp<=\"0000\"; Elsif clk'event and clk='1' then If y_temp=\"1001\"then Y_temp<=\"0000\"; Cout<='1'; Else
Y_temp<=y_temp+1; Cout<='0'; End if; End if; End process; Y<=y_temp; End example;
Library ieee;
Use ieee.std_logic_1164.all; Package my_pkg is Component cont10 Pork(clk,clr:in std_logic;
Y: out std_logic_vector(3 downto 0); Cout: out std_logic); End component; End my_pkg;
Library ieee;
Use ieee,std_logic_1164.all; Use work.my_pkg.all; Entity cont_100 is Pork( clk,clr:in std_logic;
Y_l, y_h:out std_logic_vector(3 downto 0)); End cont100;
Architecture example of cont100 is Signal x:std_logic; Begin
U1:cont10 port map( clk,clr,y_l,x);
U2:cont10 port map( clk=>x,clr=>clr,y=>y_h); End example; LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY count8 IS PORT(
clk:IN STD_LOGIC;
sel:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END count8;
ARCHITECTURE rt1 OF count8 IS
signal sel_temp:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN PROCESS(clk) BEGIN
IF(clk'event and clk='1')THEN IF(sel_temp=\"111\") THEN sel_temp<=(others=>'0'); ELSE
sel_temp<=sel_temp+1; END IF; END IF;
sel<=sel_temp; END PROCESS; END rt1;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY time_choose IS PORT(
sel:IN STD_LOGIC_VECTOR(2 DOWNTO 0); qh:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ql:IN STD_LOGIC_VECTOR(3 DOWNTO 0); q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END time_choose;
ARCHITECTURE rt1 OF time_choose IS BEGIN
PROCESS(sel,qh,ql) BEGIN CASE sel IS
WHEN \"000\"=>q<=ql; WHEN \"001\"=>q<=qh;
WHEN OTHERS=>q<=\"XXXX\"; END CASE; END PROCESS; END rt1;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY seg7 IS PORT(
q:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
segment:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END seg7;
ARCHITECTURE rt1 OF seg7 IS BEGIN PROCESS(q) BEGIN CASE q IS
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\"; WHEN OTHERS=>segment<=\"XXXXXXX\"; END CASE; END PROCESS; END rt1; LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY display IS PORT(
clk:IN STD_LOGIC;
qh: IN STD_LOGIC_VECTOR(3 DOWNTO 0); ql: IN STD_LOGIC_VECTOR(3 DOWNTO 0); sel:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); segment:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END display;
ARCHITECTURE rt1 OF display IS COMPONENT count8 PORT(
clk:IN STD_LOGIC;
sel:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END COMPONENT; COMPONENT time_choose PORT(
sel:IN STD_LOGIC_VECTOR(2 DOWNTO 0); qh:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ql:IN STD_LOGIC_VECTOR(3 DOWNTO 0); q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END COMPONENT; COMPONENT seg7 PORT(
q:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
segment:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END COMPONENT ;
SIGNAL sel_tmp:STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL q:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL segment_tmp:STD_LOGIC_VECTOR(6 DOWNTO 0); BEGIN
U0:count8 PORT MAP(clk,sel_tmp);sel<=sel_tmp; U2:time_choose PORT MAP(sel_tmp,qh,ql,q); U3:seg7 PORT MAP(q,segment_tmp); segment<=segment_tmp; END rt1;
四、技术总结
为期两周的课设已经接近尾声了,在这2周中,我学到了很多,对EDA的认识也进一步加深了。从一个刚入门的学习者,渐渐的爱上了这门技术,虽然说对于EDA的知识还有很多要学习和提高,但是在这2周中我还是感受到这门课程的魅力所在。
在拿到数字钟这个课题时,我和我的合作伙伴对这个课题感到比较轻松,脑海中一下子出现了许多设计念头,于是我们就分头去寻找这方面的资料,通过图书馆的书籍资料,网络上的虚拟资料。在2天的找资料的过程中,我开始觉得所谓的数字钟并非我想象的那么简单。一开始我想到的数字钟只是一般的计数功能并未涉及到调时,调分,和闹铃功能。在如何显示方面也没有细细的考虑过。在看过一些资料后,越来越感觉到数字钟课题并非手到擒来。
在与伙伴商量后,我们以一本参考书的资料为基础开始展开细致设计。我们一开始的输入是有三个模块 ,输入模块,计数模块,和显示模块。对于计数模块我们通过分频方法很快就得到了1HZ的频率用于计数,再通过计数进位标志实现秒,分,时的互相关联,再显示模块,我们通过7段数码管扫描显示也的到了实现。但是在输入模块,我们却遇到了障碍,如何通过硬件上的有限的开关和按钮来实现呢。我们首先想到了 ,做一个可以输入数字的键盘和开关(16*16),可是在想到键盘设计本身就是一个非常复杂的过程,想到2周能做好的话有一定的难度,于是我们果断的放弃了这一计划。那么如何实现输入,这个问题摆在我们面前,我感到了课设以来前所未有的压抑感。通过四个开关控制0—9的输入,但是如何控制是输入的是哪一位,如何进行调时,闹铃控制?都是难题。
在冥想了2天后,我才发现自己陷如了思维的局限性中,为什么一定通过输入来完成调时呢,我们不可以通过他本身的计数功能来调时,这样虽然没有像我们所想的输入调时那样方便,但是它的简单在于充分利用了1HZ频率,通过干扰进位标志进行调时。这一个方法想到后,其他的闹铃功能和报时功能也都迎刃而解了。经过3天的编程和功能完善,我们基本实现了所有的功能,各个模块的编译和仿真也都实现了,第二个星期,实验室开放,我和伙伴就开始进行硬件上的实现了,在完成顶层设计后,我们成功的下载在硬件上了。通过调时后,基本实现了全部功能,并通过了老师的检查。到此本次课设基本上实现了所有的功能,但在有些功能的实现中,还有待提高。比如说对于调时功能,只能等待调时,这样对于调时的机动性不好,如果控制不好,过了应调时间的话,就必须在等一次循环后才能调时,这样就很浪费时间了 。还有就是闹钟功能并未完全实现它,我们只是编写了一个特定的程序来闹铃,闹铃时间已经事先安排好了,无法再通过手动调节了,这样就缺少了人性化。这在课设结束以后,要进一步的改进,争取获得一款高性能的人性化的数字钟。 通过本次课设,我不仅学到了关于EDA的许多专业知识,同时也让我感觉到团队合作的重要性。其实如何有效和快速的找到资料也是课设给我的启发,利用好图书馆和网络,是资源的到最好的利用。如果我们一味的屋子里苦思冥想那么再给2周的时间或许也不会有数字钟诞生,所以我觉得与他人交流思想是取得成功的关键,在交流中,不仅强化了自己原有的知识体系也可以扩展自己的思维。通过思考、发问、自己解惑并动手、改进的过程,才能真正的完成课题。经过这次课程设计的过程,我相信在以后的课程设计中我们会吸取经验教训,做出更好的设计来。 五、参考文献
1电子技术基础 (数字部分) 2 EDA技术课程设计(刘江海 主编)
3电路原理与电路板设计教程(夏路易 石宗义 编著) 4基于LM35温度传感器的温控系统设计(李志宇 肖前贵编) 5数字温度计的设计(崔葛瑾 周易编) 致谢
在此 特别感谢刘江海老师。
在刘老师两个星期的耐心指导下,才使得我们能够顺利的完成课程设计,同时也感谢学校给我
们提供实验场所!
因篇幅问题不能全部显示,请点此查看更多更全内容