当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]1. 概述本设计基于CPLD设计一款数字温度计,温度传感器使用DS18B20,CPLD采用EPM240T100C5。DS18B20 具有体积小,硬件开销低(只需要一根信号线),抗干扰能力强等优点。EPM

1. 概述

本设计基于CPLD设计一款数字温度计,温度传感器使用DS18B20,CPLD采用EPM240T100C5。DS18B20 具有体积小,硬件开销低(只需要一根信号线),抗干扰能力强等优点。EPM240T00C5具有延时低、功耗小、稳定性高等优点。

2. 硬件简介

硬件平台采用BigTree的CPLD开发板,有如下硬件资源:

CPLD EPM240T100C5;

USB 转串口(省去 USB 转串口线);

LED;

有源蜂鸣器;

DS18B20 温度传感器;

四位共阳极数码管;

按键;

GPIO 拓展接口(18 个通用 IO)。

有需要的朋友可以在 shop397545458.taobao.com购买。

3. 系统框图

 


温度采集模块:负责初始化、读写DS18B20温度传感器;

十六进制转十进制模块:将DS18B20的温度输出数据转换成十进制数据;

数码管显示模块:将转换好的十进制数据动态显示在数码管上。

4. DS18B20 工作原理

DS18B20 引脚功能

GND: 地信号

DQ: 数据信号线

VDD: 电源

存储资源

ROM: 只读存储器,用于存放 DS18B20 编码,一共 64 位,第一个 8 位是 1-wire 家族号(28h),第二个 48 位是唯一的序列号。最后一个 8 位是前 56 位的 CRC 校验码。

RAM: 数据暂存器,共 9 个字节,第 1、 2 字节是温度转后的数据值。

EEPROM: 用于存放长期需要保持的数据,如上下限温度报警值等。

设备操作

1.初始化

-> 数据线拉高 1;

-> 短延时;

-> 数据线拉底 0;

-> 延时 750ms;

-> 数据线拉高 1;

-> 延时等待(如果初始化成功则在 15~60 毫秒内产生一个由 DS18B20 返回的低电平);

->若读到数据线上的低电平,再做延时(第五步算起,最少 480ms);

-> 数据线拉高,结束。

2.发送 ROM 指令

ROM 指令共 5 条,每一个工作周期只能发一条,分别为:读 ROM、匹配 ROM、跳跃ROM、查找 ROM 和报警查找。一般只有单个 18B20 芯片,可使用跳过 ROM 指令[CCH]。

3.发送存储器操作指令

在 ROM 指令后,紧接着发送存储器操作指令,分别为:

? 温度转换 44H:

启动 DS18B20 进行温度转换,将温度值放入 RAM 的第 1、 2 个地址。

? 读暂存器 BEH

从 RAM 中读数据,读地址从 0 开始到 9,可只读前两个字节。

? 写暂存器 4EH

将数据写入暂存器的 TH、 TL 字节。

? 复制暂存器 48H

把暂存器的 TH、 TL 字节写到 E2RAM 中。

? 重新调 E2RAM B8H

把 E2RAM 中的 TH、 TL 字节写到暂存器 TH、 TL 字节 。

? 读电源供电方式 B4H

启动 DS18B20 发送电源供电方式的信号给主控。

4.读当前温度数据

需要执行两次工作周期,第一个周期为复位,跳过 ROM 指令,执行温度转换存储器指令等待 500us 温度转换时间。紧接着执行第二个周期为复位,跳过 ROM 指令,执行读 RAM 的存

储器,读数据。

5.写操作

 


写时隙分为写“0”和写“1”, 时序如图,在写数据时间间隙的前 15us 总线需要是被主控拉低,然后则将是芯片对总线数据的采样时间,采样时间在 15-60us,采样时间内,如果主控将 总线拉高则表示写 1,如果主控将总线拉低则表示写 0。每一位的发送都应该有一个至少15us 的低电平起始位随后的数据 0 或 1 应该在 45us 内完成。整个位的发送时间应该保持 在60-120us,否则不能保证通信的正常。

6.读操作

 


读时隙时也是必须先由主控产生至少 1us 的低电平,表示读时间的起始。随后在总线被释放后的 15us 中 DS18B20 会发送内部数据位。注意必须要在读间隙开始的 15us 内读数据为才 可以保持通信的正确。通信时,字节的读或写是从高位开始的,即 A7 到 A0。控制器释放总线,也相当于将总线置 1。

更多关于DS18B20的资料可以查看其应用手册。

5. 进制转换(Hex2Dec)

由于 DS18B20 输出的是十六进制数据, 所以需要做进制转换为 10 进制输出。这里由于CPLD 资源问题,故只设计温度显示范围为: 0~47 度,最小分辨率为 1 度。

```

wire [7:0] data_in;

assign data_in = {1‘b0,temperature_buf[10:4]};

reg [7:0] buf0;

reg [7:0] buf1;

reg [7:0] buf2;

reg [7:0] data_out;

always @(*)

case(data_in[7:4])

0:

begin

buf0[3:0] = (data_in[3:0]> =10)?(data_in[3:0]-10):data_in[3:0];

buf0[7:4] = (data_in[3:0]> =10)?(data_in[7:4]+1):data_in[7:4];

data_out = buf0;

end

1:

begin

buf0[3:0] = (data_in[3:0]> =10)?(data_in[3:0]-10 + 6):(data_in[3:0]+6);

buf0[7:4] = (data_in[3:0]> =10)?(data_in[7:4]+1):data_in[7:4];

buf1[3:0] = (buf0[3:0]> =10)?(buf0[3:0]-10):buf0[3:0];

buf1[7:4] = (buf0[3:0]> =10)?(buf0[7:4]+1):buf0[7:4];

data_out = buf1;

end

2:

begin

buf0[3:0] = (data_in[3:0]> =10)?(data_in[3:0]-10 + 6):(data_in[3:0]+6);

buf0[7:4] = (data_in[3:0]> =10)?(data_in[7:4]+1):data_in[7:4];[!--empirenews.page--]

buf1[3:0] = (buf0[3:0]> =10)?(buf0[3:0]-10 + 6):(buf0[3:0]+6);

buf1[7:4] = (buf0[3:0]> =10)?(buf0[7:4]+1):buf0[7:4];

buf2[3:0] = (buf1[3:0]> =10)?(buf1[3:0]-10):(buf1[3:0]);

buf2[7:4] = (buf1[3:0]> =10)?(buf1[7:4]+1):buf1[7:4];

data_out = buf2;

end

default:

begin

data_out = data_in;

end

endcase

assign temperature = data_out[7:0]

# 6. 数码管显示

本设计采用4位共阳极数码管作为温度显示模块,驱动代码如下:

//-----------------数码管显示-------------------

assign sm_sel ={2’b11,sm_sel_r};

assign sm_dat = sm_dat_r;

//XXXX = 8‘b{a,b,c,d,e,f,g,dp}

parameter ZERO = 8’b0000_0011,//8‘b1100_0000,

ONE = 8’b1001_1111,//8‘b1111_1001,

TWO = 8’b0010_0101,//8‘b1010_0100,

THREE = 8’b0000_1101,//8‘b1011_0000,

FOUR = 8’b1001_1001,//8‘b1001_1001,

FIVE = 8’b0100_1001,//8‘b1001_0010,

SIX = 8’b0100_0001,//8‘b1000_0010,

SEVEN = 8’b0001_1111,//8‘b1111_1000,

EIGHT = 8’b0000_0001,//8‘b1000_0000,

NINE = 8’b0000_1001;//8‘b1001_0000;

reg [7:0] sm_dat_r;

reg [7:0] sm_dat_r1;

reg [7:0] sm_dat_r2;

always @ (*)

case( temperature[3:0] )

4’d0 : sm_dat_r1 <= ZERO;

4‘d1 : sm_dat_r1 <= ONE;

4’d2 : sm_dat_r1 <= TWO;

4‘d3 : sm_dat_r1 <= THREE;

4’d4 : sm_dat_r1 <= FOUR;

4‘d5 : sm_dat_r1 <= FIVE;

4’d6 : sm_dat_r1 <= SIX;

4‘d7 : sm_dat_r1 <= SEVEN;

4’d8 : sm_dat_r1 <= EIGHT;

4‘d9 : sm_dat_r1<= NINE;

default:sm_dat_r1 <= 8’hFF;

endcase

always @ (*)

case( temperature[6:4] )

4‘d0 : sm_dat_r2 <= ZERO;

4’d1 : sm_dat_r2 <= ONE;

4‘d2 : sm_dat_r2 <= TWO;

4’d3 : sm_dat_r2 <= THREE;

4‘d4 : sm_dat_r2 <= FOUR;

4’d5 : sm_dat_r2 <= FIVE;

4‘d6 : sm_dat_r2 <= SIX;

4’d7 : sm_dat_r2 <= SEVEN;

4‘d8 : sm_dat_r2 <= EIGHT;

4’d9 : sm_dat_r2 <= NINE;

endcase

reg [1:0] sm_sel_r;

reg [0:0] sm_cnt;

always @(posedge clk_ref)

sm_cnt <= sm_cnt + 1‘b1;

always @(sm_cnt)

case(sm_cnt)

’d0:

begin

sm_sel_r <= 2‘b01;

sm_dat_r <= sm_dat_r1;

end

’d1:

begin

sm_sel_r <= 2‘b10;

sm_dat_r <= sm_dat_r2;

end

default:

begin

sm_sel_r<= 2’b11;

sm_dat_r <= ZERO;

end

endcase

```

7. 最终结果

下图为实测的温度结果,比实际温度高出2-3度。由于芯片出厂的误差(没有对0校准),加上板卡本身的散热,使得温度偏高2~3度。但不影响我们学习使用。

 


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭