完整版基于FPGA的温度传感器课程设计.docx
- 文档编号:30708040
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:15
- 大小:340.14KB
完整版基于FPGA的温度传感器课程设计.docx
《完整版基于FPGA的温度传感器课程设计.docx》由会员分享,可在线阅读,更多相关《完整版基于FPGA的温度传感器课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
完整版基于FPGA的温度传感器课程设计
FPGA课程设计论文
学生姓名周悦
学号20091321018
院系电子与信息工程学院
专业电子科学与技术
指导教师李敏
二O一二年5月28日
基于FPGA的温度传感器系统设计
1引言
温度是一种最基本的环境参数,人们的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。
测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:
传统的分立式温度传感器;模拟集成温度传感器;智能集成温度传感器。
目前,国际上新型温度传感器正从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展。
本文将介绍采用智能集成温度传感器DS18B20,并以FPGA为控制器的温度测量装置的硬件组成和软件设计,用液晶来实现温度显示。
2电路分析
系统框图如下:
DS18B20
温度传感器
FPGA
LCD1602
液晶显示器
第一部分:
DS18B20温度传感器
美国Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持"一线总线"接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。
全部传感元件及转换电路集成在形如一只三极管的集成电路内。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
现在,新一代的DS18B20体积更小、更经济、更灵活。
使你可以充分发挥“一线总线”的优点。
DS18B20的主要特性:
(1)适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电
(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测(4)DS18B20在使用中不需要任何外
围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快(8)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力(9)负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
DS18B20引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:
用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。
第二部分EPM240系列芯片
基本参数:
CPLD类型:
闪存
宏单元数:
192
输入/输出线数:
80
传播延迟时间:
5.9ns
整体时钟设定时间:
2.7ns
频率:
201.1MHz
电源电压范围:
2.375Vto2.625V,3Vto3.6V
工作温度范围:
0°Cto+85°C 针脚数:
100
封装类型:
TQFP
工作温度最低:
0°C
工作温度最高:
85°C
逻辑芯片功能:
CPLD
逻辑芯片基本号:
EPM240T
可编程逻辑类型:
CPLD
输入/输出接口标准:
LVTTL,LVCMOS,PCI
第三部分:
LCD1602液晶显示屏
液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。
1602采用标准的16脚接口,其中:
第1脚:
VSS为地电源
第2脚:
VDD接5V正电源
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
指令1:
清显示,指令码01H,光标复位到地址00H位置
指令2:
光标复位,光标返回到地址00H
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁
指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时双行显示F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符(有些模块是DL:
高电平时为8位总线,低电平时为4位总线)
指令7:
字符发生器RAM地址设置
指令8:
DDRAM地址设置
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据
指令11:
读数据
电路连接如图所示~
2.2软件设计
1、18b20驱动时序
程序采用C语言进行编写,主要完成LCD1602初始化、DS18B20的初始化、从DS18B20读取数据、向DS18B20写数据及温度转化等子程序的编写,此外在进行程序的编写时一定要严格保证读写时序的正确性,否则无法读取测温结果,其初始化时序和写时序的程序分别如下:
初始化时序包括一个主机发出的复位脉冲以及从机的应答脉冲这一过程,如图所示复位脉冲是一个480~960us的低电平然后释放总线,将总线拉至高电平,时间持续15~60us之后从机开始向总线发出一个应答脉冲,该脉冲是一个60~240us的低电平信号,表示从机已准备好,在初始化过程中主机接收脉冲的时间最少为480us。
DSl8820的访问步骤为:
先进行初始化(Ini—tialization),然后发送ROM命令,最后发送Func—tion功能命令.对DSl8820访问必须通过上述步骤完成.初始化命令使主设备知道从设备是在总线上并可以进行访问.ROM命令可以使主设备知道有多少和什么类型的从设备连接在总线上并且判断是否超过温度报警值.共有5种ROM命令,分别是READROM(33H)、MATCHROM(55H)、SEARCHROM(FOH)、SKIPROM(CCH)、ALARMSEARCH命令(ECH).主设备可以通过功能命令来对DSl8820内部存储器进行读写.有6种功能命令,分别是CONVERT(44H)、WRITESCRATCHPAD(BEH)、READSCRATCHPAD(4EH)、COPYSCRATCHPAD(48H)、RECALLE2(B8H)、读电源供电方式(B4H).DSl8820的单线通信功能是分时完成的,它有严格的时隙要求.
LibraryIEEE;
UseIEEE.Std_Logic_1164.All;
Entitywenduis
Port
(
led:
outstd_logic_vector(0to16);
wireout:
inoutstd_logic;
clk:
instd_logic;
rst:
instd_logic);
Endentityb;
Architectureinitofwenduis
typeinit_statesis(s00,s0,s1,s2,s3,s4,s5,s6,s7,w0,w1,w00,w01,read0,read1,read2,read3);
signalstate:
init_states;
signali:
integerRange0to1000000;
signalreset:
std_logic;
begin
process(rst,wireout,clk)
--variablei:
IntegerRange0to1000;
variableflag:
IntegerRange0to200;
variablelight:
IntegerRange0to16;
begin
ifrst='0'then
state<=s00;
wireout<='Z';
flag:
=0;
elsifrising_edge(clk)then
casestateis
whens00=> flag:
=0;
state<=s0;
whens0=> --初始化18b20
wireout<='0';
--主机拉底总线
reset<='1';
state<=s1;
whens1=>
reset<='0';
if(i=500)then --延时500us
wireout<='Z'; --释放总线
reset<='1';
state<=s2;
endif;
whens2=> reset<='0';
if(i=100)then --等待100us
reset<='1';
state<=s3;
endif;
whens3=>if(wireout='0')then --若18b20拉低总线,初始化成功
state<=s4;
led(16)<='1'; --led16灯亮
elsif(wireout='1')then--否则,初始化不成功,返回S0
state<=s0;
endif;
whens4=> reset<='0';
if(i=400)then --再延时400us
reset<='1';
state<=s5;
endif;
whens5=> --写数据
if (flag=0 )thenflag:
=1;state<=w0; --cch
elsif(flag=1 )thenflag:
=2;state<=w0;
elsif(flag=2 )thenflag:
=3;state<=w01;wireout<='0';
elsif(flag=3 )thenflag:
=4;state<=w01;wireout<='0';
elsif(flag=4 )thenflag:
=5;state<=w0;
elsif(flag=5 )thenflag:
=6;state<=w0;
elsif(flag=6 )thenflag:
=7;state<=w01;wireout<='0';
elsif(flag=7 )thenflag:
=8;state<=w01;wireout<='0';
--第一次写完,750ms后,跳回s0
elsif(flag=16)thenflag:
=20;state<=s6;wireout<='Z';
--再次置数cch和beh
elsif(flag=20 )thenflag:
=21;state<=w0; --cch
elsif(flag=21 )thenflag:
=22;state<=w0;
elsif(flag=22 )thenflag:
=23;state<=w01;wireout<='0';
elsif(flag=23 )thenflag:
=24;state<=w01;wireout<='0';
elsif(flag=24 )thenflag:
=25;state<=w0;
elsif(flag=25 )thenflag:
=26;state<=w0;
elsif(flag=26 )thenflag:
=27;state<=w01;wireout<='0';
elsif(flag=27 )thenflag:
=28;state<=w01;wireout<='0';
elsif(flag=28 )thenflag:
=29;state<=w0; --beh10111110
elsif(flag=29 )thenflag:
=30;state<=w01;wireout<='0';
elsif(flag=30 )thenflag:
=31;state<=w01;wireout<='0';
elsif(flag=31 )thenflag:
=32;state<=w01;wireout<='0';
elsif(flag=32 )thenflag:
=33;state<=w01;wireout<='0';
elsif(flag=33 )thenflag:
=34;state<=w01;wireout<='0';
elsif(flag=34 )thenflag:
=35;state<=w0;
elsif(flag=35 )thenflag:
=36;state<=w01;wireout<='0';
--第二次写完,跳到s7,直接开始读数据
elsif(flag=36 )thenflag:
=40;state<=s7;
endif;
whens6=>
reset<='0';
if(i=750000orwireout='1')then --延时750ms!
!
!
!
state<=s0;
reset<='1'; --跳回s0,再次初始化
endif;
whens7=> --读数据
if (flag=40)thenflag:
=41;state<=read0;light:
=0;wireout<='0';
elsif(flag=41)thenflag:
=42;state<=read0;light:
=1;wireout<='0';
elsif(flag=42)thenflag:
=43;state<=read0;light:
=2;wireout<='0';
elsif(flag=43)thenflag:
=44;state<=read0;light:
=3;wireout<='0';
elsif(flag=44)thenflag:
=45;state<=read0;light:
=4;wireout<='0';
elsif(flag=45)thenflag:
=46;state<=read0;light:
=5;wireout<='0';
elsif(flag=46)thenflag:
=47;state<=read0;light:
=6;wireout<='0';
elsif(flag=47)thenflag:
=48;state<=read0;light:
=7;wireout<='0';
elsif(flag=48)thenflag:
=49;state<=read0;light:
=8;wireout<='0';
elsif(flag=49)thenflag:
=50;state<=read0;light:
=9;wireout<='0';
elsif(flag=50)thenflag:
=51;state<=read0;light:
=10;wireout<='0';
elsif(flag=51)thenflag:
=52;state<=read0;light:
=11;wireout<='0';
elsif(flag=52)thenflag:
=53;state<=read0;light:
=12;wireout<='0';
elsif(flag=53)thenflag:
=54;state<=read0;light:
=13;wireout<='0';
elsif(flag=54)thenflag:
=55;state<=read0;light:
=14;wireout<='0';
elsif(flag=55)thenflag:
=60;state<=read0;light:
=15;wireout<='0';
elsif(flag=60)thenflag:
=0;state<=s0;
endif;
whenw0=> wireout<='0'; --输出0
reset<='0';
if(i=80)then --延时80us
wireout<='Z'; --释放总线,自动拉高
reset<='1';
state<=w00;
endif;
whenw00=>state<=s5; --空状态
whenw01=> state<=w1; --空状态
whenw1=> wireout<='Z'; --输出1 释放总线,自动拉高
reset<='0';
if(i=80)then --延时80us
reset<='1';
state<=s5;
endif;
whenread0=>state<=read1; --空延时状态
whenread1=> wireout<='Z'; --释放总线
reset<='0';
if(i=10)then --再延时10us
reset<='1';
state<=read2;
endif;
whenothers=>
state<=s00;
endcase;
endif;
endprocess;
process(clk,reset)
begin
if(reset='1')then
i<=0;
elsifrising_edge(clk)theni<=i+1;
endif;
endprocess;
endarchitectureinit;
2、液晶显示程序
libraryieee;
useIEEE.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitylcd1602is
port(clk,reset:
instd_logic;
LCD_Data:
out
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整版 基于 FPGA 温度传感器 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)