1、数字温度传感器DS18B20控制接口设计 作者: 日期:25 个人收集整理 勿做商业用途数字温度传感器DS18B20控制接口设计摘 要: DS18B20是一款经典的单总线数字温度传感器芯片,较传统的温度传感器具有结构简单、体积小、功耗小、抗干扰能力强、使用简单、可组网实现多点温度测量等优点。本设计简要介绍了数字温度传感器DS18B20 的结构与性能,着重论述了用FPGA实现对此传感器的控制,并将测到的温度在LED数码管上显示出来.关键词:DS18B20;温度传感器;FPGA;LED数码管Abstract: DS18B20 is a classic single-bus digital temp
2、erature sensor chip, the more traditional temperature sensor has a simple structure, small size, low power consumption, and antiinterference ability, easy to use networking to achieve multi-point temperature measurement. This design provides an overview of the structure and properties of a digital t
3、emperature sensor DS18B20, focuses on the control of this sensor using FPGA, and the measured temperature is displayed on the LED digital tube.Keywords: DS18B20; temperature sensor; FPGA; LED digital tube1 引言随着科技的发展 ,温度的实时显示系统应用越来越广泛 ,比如空调遥控器上当前室温的显示、热水器温度的显示等等。实现温度的实时采集与显示系统有很多种解决方案 ,本文使用全数字温度传感器DS
4、18B20来实现温度的实时采集FPGA作为控制中心与数据桥梁; LED数码管作为温度实时显示器件。其中DS18B20作为FPGA的外部信号源,把所采集到的温度转换为数字信号,通过接口 (113脚)传给FPGA,FPGA启动ROM内的控制程序驱动液晶模块,通过IO口和数据线把数据传送给LED数码管,将采集到的温度实时显示出来。该设计结构简单、测温准确,成本低,工作稳定可靠,具有一定的实际应用价值.2 DS18B20温度传感器介绍DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的
5、编程实现位的数字值读数方式。DS18B20的性能特点如下:2.1 DS18B20的性能特点独特的单线接口仅需要一个端口引脚进行通信;多个DS18B20可以并联在惟一的三线上,实现多点组网功能;无须外部器件;可通过数据线供电,电压范围为3.05。5;零待机功耗;温度以或位数字;用户可定义报警设置;报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;2.2 DS18B20的内部结构图DS18B20采用脚PR35封装或脚SOIC封装,其内部结构框图如图2-1所示.图2-1 DS18B20内部结构框图 图22 DS18B20
6、字节定义64位ROM的结构开始位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器和,可通过软件写入户报警上下限。DS18B20温度传感器的内部存储器还包括一个高速暂存和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为字节的存储器,结构如图22所示.头个字节包含测得的温度信息,第和第字节和的拷贝,是易失的,每次上电复位时被刷新.第个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率.DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3-4
7、所示。低位一直为,是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为,用户要去改动,R1和0决定温度转换的精度位数,来设置分率.2。3 DS18B20供电方式DS18B20有两种供电方式,一种是寄生电源强上拉供电方式,一种是外部供电方式,如下图: 图23 寄生电源强上拉供电方式电路图在寄生电源供电方式下,DS18B20 从单线信号线上汲取能量:在信号线 DQ 处于高电平期间把能量储存在内部电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。为了使 DS18B20 在动态转换周期中获得足够的电流供应,当进行温度转
8、换或拷贝到 E2 存储器操作时,用 MOSFET 把 I/O 线直接拉到 VCC 就可提供足够的电流,在发出任何涉及到拷贝到 E2 存储器或启动温度转换的指令后,必须在最多 10S 内把 I/O 线转换到强上拉状态。在强上拉方式下可以解决电流供应不走的问题,因此也适合于多点测温应用,缺点就是要多占用一根 I/O 口线进行强上拉切换。图2-4 外部电源供电方式电路图 在外部电源供电方式下,DS18B20 工作电源由 VDD 引脚接入,此时 I/O 线不需要强上拉,不存在电源电流不足的问题,可以保证转换精度,同时在总线上理论可以挂接任意多个 DS18B20 传感器,组成多点测温系统.在外部供电的方
9、式下,DS18B20的GND引脚不能悬空,否则不能转换温度,读取的温度总是 85。3 设计需求温度测量范围:-55+125可编程为9位12位A/D转换精度 测温分辨率可达0。0625 LED数码管直读显示4 设计方案4.1 硬件设计将DF2C8FPGA 核心板和EBF2基础实验板连接在一起,同时使能DS18B20 模块和数码管模块:数码管使能:用“短路帽将实验板上的JP4和JP5全部短接。DS18B20 温度传感器使能跳线JP10 全部短接,元件安装示意如下图41和4-2(注意方向,半圆形的一边朝板子内部,平面朝外,和板上的图示一致)。 图 41:数码管使能图示 图 4-2:温度传感器安装和使
10、能图示4.2 程序设计 DS18B20的工作遵循严格的单总线协议.主机首先发一复位脉冲,使信号线上所有的DS18B20芯片都被复位,接着发送ROM操作命令,使序列号编码匹配的DS18B20被激活,准备接收下面的内存访问命令。内存访问命令控制选中的DS18B 20的工作状态,完成整个温度转换、读取等工作(单总线在ROM命令发送之前存储命令和控制命令不起作用)。在对DS18B20进行操作的整个过程中,主要包括三个关键过程:主机搜索 DS18B20序列号、启动在线DS18B20作温度转换、读取在线DS18B20温度值.工作中系统对DS18B20的操作以ROM命令和存储器命令形式出现。其中ROM 操作
11、命令均为8位长,命令代码分别为:读 ROM(33H)、匹配ROM(55H)、跳过ROM(C CH)、搜索ROM(FOH)和告警搜索(ECH)命令.存储器操作命令为:写暂存存储器(4E H)、读暂存存储器(BEH)、复制暂存存储器(48H)、温度变换(44H)、重新调出EE RAM(BSH)和读电源供电方式(B4H)命令.本设计通过FPGA上的核心芯片控制温度传感器进行温度到电量到数字量的转换,并通过数码管显示接口显示出来,其中最主要的温度传感器的控制模块的Verilog HDL 代码见附件DS18B20_CTL.v.5 设计说明 LED_CTL.v 是数码管显示功能模块,DS18B20_CTL
12、.v 是温度传感器的控制模块,TEMP.v为顶层模块,实例化了前面两个模块,并将采集的温度值送至数码管迚行显示。 6 仿真测试结果下载配置文件后,可在数码管上观察到带一位小数的温度数值。如果用手捏住传感器,会収现显示的温度在升高。如下图:图6-1 测温效果图示参考文献:1 沙占友 集成传感器的应用M。 中国电力出版社。2 罗钧,童景琳。 智能传感器数据采集与信号处理M. 化学工业出版社3 周月霞,孙传友。 DS18B20硬件连接及软件编程J. 传感器世界,2001,12. 4 王晓娟,张海燕,梁延兴.基于DS18B20的温度实时采集与显示系统的设计与实现J。 , 2007:38-41。5 党
13、峰, 王敬农, 高国旺. 基于DS18B20 的数字式温度计的实现 J . 山西电子技术, 2007( 3)6 金伟正。 单线数字温度传感器的原理与应用 J 。 仪表技术与传感器, 2000( 7) : 42 43.附件:DS18B20_CTL.v:define UD #1define ALL_CLEAR_T 16h0/0 at start, set to 0define INIT_SETZ_T 16h61A8/500us 50MHzdefine INIT_SAMP_T 16h7148/580us 50MHzdefine INIT_END_T 16hC350/1ms 50MHzdefine W
14、R_SETVAL_T 16hFA/5us 50MHzdefine WR_SETZ_T 16hEA6/75us 50MHzdefine WR_END_T 16hFA0/80us 50MHzdefine RD_SETZ_T 16h64/2us 50MHzdefine RD_SAMP_T 16h28A/13us 50MHzdefine RD_END_T 16hFA0/80us 50MHzdefine BIT_DELAY 16hDAC/70us 50MHzdefine BYTE_DELAY 16h618A/500us 50MHzmodule DS18B20_CTL(/Global input port
15、s.SYSCLK,RST_B,/TEMP ports。TEMP_IO,/Output ports.TEMP_D1,TEMP_D2,TEMP_D3,TEMP_D4,TEMP_D5,TEMP_D6,TEMP_D7,TEMP_D8,TEMP_D9);/=/Input and output declaration。/=inputSYSCLK;inputRST_B;inoutTEMP_IO;output7:0TEMP_D1;output7:0TEMP_D2;output7:0TEMP_D3;output7:0TEMP_D4;output7:0TEMP_D5;output7:0TEMP_D6;output
16、7:0TEMP_D7;output7:0TEMP_D8;output7:0TEMP_D9;/=/Wire and reg declaration./=wireSYSCLK;wireRST_B;wireTEMP_IO;reg7:0TEMP_D1;reg7:0TEMP_D2;reg7:0TEMP_D3;reg7:0TEMP_D4;reg7:0TEMP_D5;reg7:0TEMP_D6;reg7:0TEMP_D7;reg7:0TEMP_D8;reg7:0TEMP_D9;/=/Wire and reg in the module。/=/Used for bit control.reg3:0BIT_CS
17、;reg3:0BIT_NS;parameterBIT_IDLE = 4h0;parameterBIT_INIT = 4h1;parameterBIT_READ = 4h2;parameterBIT_WRITE = 4h3;parameterBIT_DELAY = 4h4;parameterBIT_END = 4h5;reg15:0TIME_CNT;reg15:0TIME_CNT_N;reg1:0TEMP_IOREG;reg1:0TEMP_IOREG_N;regTEMP_IO_FLAG;parameterSET0 = 2h0;parameterSET1 = 2h1;parameterSETZ =
18、 2h2;parameterNSET = 2h3;wireCMD_INIT;wireCMD_READ;wireCMD_WRITE;/Used for byte control.parameterBYTE_IDLE = 4h0;parameterBYTE_INIT = 4h1;parameterBYTE_READ = 4h2;parameterBYTE_WRITE = 4h3;parameterBYTE_DELAY = 4h4;parameterBYTE_END = 4h5;reg3:0BYTE_CS;reg3:0BYTE_NS;reg2:0CTL_FLAG;reg2:0CTL_FLAG_N;r
19、eg3:0BIT_CNT;reg3:0BIT_CNT_N;reg7:0SHIFT_REG_IO;reg7:0SHIFT_REG_IO_N;/Used for flow control。parameterFLOW_IDLE = 4h0;parameterFLOW_INIT = 4h1;parameterFLOW_START = 4h2;parameterFLOW_POLL = 4h3;parameterFLAG_IDLE = 3h0;parameterFLAG_INIT = 3h1;parameterFLAG_READ = 3h2;parameterFLAG_WRITE = 3h3;parame
20、terFLAG_DELAY = 3h4;reg3:0FLOW_CS;reg3:0FLOW_NS;reg4:0BYTE_CNT;reg4:0BYTE_CNT_N;reg7:0TEMP_DI;reg7:0TEMP_D1_N;reg7:0TEMP_D2_N;reg7:0TEMP_D3_N;reg7:0TEMP_D4_N;reg7:0TEMP_D5_N;reg7:0TEMP_D6_N;reg7:0TEMP_D7_N;reg7:0TEMP_D8_N;reg7:0TEMP_D9_N;/=/Bit Control Logic./=/-/Some control single of Bit control l
21、ogic./-/Command of input by outside.assign CMD_INIT = (BYTE_CS = BYTE_INIT);assign CMD_READ = (BYTE_CS = BYTE_READ);assign CMD_WRITE = (BYTE_CS = BYTE_WRITE);/TIME_CNT, time count for timing of TEMP.always (posedge SYSCLK or negedge RST_B)begin if(!RST_B) TIME_CNT= UD 16h0; else TIME_CNT= UD TIME_CN
22、T_N;endalways (*)begin if((BIT_CS != BIT_NS) (BYTE_CS != BYTE_NS) TIME_CNT_N = 16h0; else TIME_CNT_N = TIME_CNT + 16h1;end/-/State machine of Bit control logic。/-/Bit control state machine。always (posedge SYSCLK or negedge RST_B)begin if(!RST_B) BIT_CS= UD BIT_IDLE; else BIT_CS= UD BIT_NS;endalways
23、()begin case(BIT_CS) BIT_IDLE : if(CMD_INIT) BIT_NS = BIT_INIT; else if(CMD_READ) BIT_NS = BIT_READ; else if(CMD_WRITE) BIT_NS = BIT_WRITE; else BIT_NS = BIT_CS; BIT_INIT:if(TIME_CNT = INIT_END_T) BIT_NS = BIT_DELAY; else BIT_NS = BIT_CS; BIT_READ:if(TIME_CNT = RD_END_T) BIT_NS = BIT_DELAY; else BIT
24、_NS = BIT_CS; BIT_WRITE:if(TIME_CNT = WR_END_T) BIT_NS = BIT_DELAY; else BIT_NS = BIT_CS; BIT_DELAY : if(TIME_CNT = BIT_DELAY) BIT_NS = BIT_END; else BIT_NS = BIT_CS; BIT_END: BIT_NS = BIT_IDLE; default: BIT_NS = BIT_IDLE; endcaseend/-/18B20 output bit control./-/TEMP_IO, this is a tri-state io conn
25、ect to 18B20。/But it need a register for save the current time, otherwise latch./First, Register is 2bit , 2h0 for 0 , 2h1 for 1, 2h2 for z.always (posedge SYSCLK or negedge RST_B)begin if(!RST_B) TEMP_IOREG= UD SETZ; else TEMP_IOREG = UD TEMP_IOREG_N;end always (*)begin case(BIT_CS) BIT_IDLE : TEMP
26、_IOREG_N = SETZ; BIT_INIT:if(TIME_CNT = ALL_CLEAR_T) TEMP_IOREG_N = SET0; else if(TIME_CNT = INIT_SETZ_T) TEMP_IOREG_N = SETZ; else TEMP_IOREG_N = TEMP_IOREG; BIT_READ:if(TIME_CNT = ALL_CLEAR_T) TEMP_IOREG_N = SET0; else if(TIME_CNT = RD_SETZ_T) TEMP_IOREG_N = SETZ; else TEMP_IOREG_N = TEMP_IOREG; B
27、IT_WRITE:if(TIME_CNT = ALL_CLEAR_T) TEMP_IOREG_N = SET0; else if(TIME_CNT = WR_SETVAL_T) TEMP_IOREG_N = NSET; else if(TIME_CNT = WR_SETZ_T) TEMP_IOREG_N = SETZ; else TEMP_IOREG_N = TEMP_IOREG; default: TEMP_IOREG_N = TEMP_IOREG; endcaseend/Second, set the value of 18B20_I0.always ()begin case(TEMP_I
28、OREG) SET0:TEMP_IO_FLAG = 1h0; SET1:TEMP_IO_FLAG = 1h1; SETZ:TEMP_IO_FLAG = 1hz; NSET:TEMP_IO_FLAG = SHIFT_REG_IO0; default:TEMP_IO_FLAG = 1hz; endcaseendassign TEMP_IO = (TEMP_IOREG = SETZ) ? 1hz : TEMP_IO_FLAG; /Bit control, count when every bit end。always (posedge SYSCLK or negedge RST_B)begin if
29、(!RST_B) BIT_CNT= UD 4h0; else BIT_CNT= UD BIT_CNT_N;endalways ()begin if(BYTE_CS = BYTE_IDLE) BIT_CNT_N= 4h0; else if(BIT_CS = BIT_END) BIT_CNT_N= BIT_CNT + 4h1; else BIT_CNT_N= BIT_CNT;end /Shift reg for read/write the TEMP.always (posedge SYSCLK or negedge RST_B)begin if(!RST_B) SHIFT_REG_IO = UD
30、 8h0; else SHIFT_REG_IO = UD SHIFT_REG_IO_N;endalways (*)begin if(BYTE_CS = BYTE_IDLE) (BYTE_NS = BYTE_READ) SHIFT_REG_IO_N = 8h0; else if((BYTE_CS = BYTE_READ) & (BIT_CS = BIT_READ) & (TIME_CNT = RD_SAMP_T)) SHIFT_REG_IO_N = TEMP_IO /*1h1/ , SHIFT_REG_IO7:1; else if((BYTE_CS = BYTE_IDLE) & (BYTE_NS
31、 = BYTE_WRITE)) SHIFT_REG_IO_N = TEMP_DI; else if(BYTE_CS = BYTE_WRITE) & (BIT_CS = BIT_END)) SHIFT_REG_IO_N = 1h0,SHIFT_REG_IO7:1; else SHIFT_REG_IO_N = SHIFT_REG_IO;end /-/Byte control state machine./-/State machine.always (posedge SYSCLK or negedge RST_B)begin if(!RST_B) BYTE_CS= UD BYTE_IDLE; el
32、se BYTE_CS= UD BYTE_NS;endalways ()begin case(BYTE_CS) BYTE_IDLE :if(CTL_FLAG = FLAG_INIT) BYTE_NS = BYTE_INIT; else if(CTL_FLAG = FLAG_READ) BYTE_NS = BYTE_READ; else if(CTL_FLAG = FLAG_WRITE) BYTE_NS = BYTE_WRITE; else if(CTL_FLAG = FLAG_DELAY) BYTE_NS = BYTE_DELAY; else BYTE_NS = BYTE_CS; BYTE_IN
33、IT :if(BIT_CS = BIT_END) BYTE_NS = BYTE_END; else BYTE_NS = BYTE_CS; BYTE_READ :if((BIT_CNT = 4h7) & (BIT_CS = BIT_END)) BYTE_NS = BYTE_DELAY; else BYTE_NS = BYTE_CS; BYTE_WRITE :if((BIT_CNT = 4h7) & (BIT_CS = BIT_END) BYTE_NS = BYTE_END; else BYTE_NS = BYTE_CS; BYTE_DELAY :if(TIME_CNT = BYTE_DELAY)
34、 BYTE_NS = BYTE_END; else BYTE_NS = BYTE_CS; BYTE_END :BYTE_NS = BYTE_IDLE; default :BYTE_NS = BYTE_IDLE; endcaseend /=/Flow control./=/-/Some control single for flow control./-/Byte count, count when every byte end。always (posedge SYSCLK or negedge RST_B)begin if(!RST_B) BYTE_CNT= UD 5h0; else BYTE_CNT= UD BYTE_CNT_N;endalways ()begin if(FLOW_CS != FLOW_NS) BYTE_CNT_N= 5h0; else if(BYTE_CS = BYTE_END) BYTE_CNT_N= BYTE_CNT + 5h1; else BYTE_CNT_N= BYTE_CNT;end/-/Flow control state machine./-/State machine.always (posedge SYSCLK or negedge R