基于FPGA的温度传感器(ds18b20)驱动设计

描述

本篇主要讨论基于FPGA的温度传感器(ds18b20)驱动设计---第一版

温度传感器

设计实现:利用FPGA驱动DS18b20,读取到温度数值显示到数码管上。

首先介绍DS18b20。

DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

DS18B20 数字温度计提供 9-12位摄氏温度测量(9-12位是测量精度),它的测温范围为-55~+125℃。

可编程的分辨率为9-12位,对应的分辨率温度分别为0.5度、0.25度、0.125度、0.0625度。   测量温度是需要转换时间的(将外界的问题转换为数字量),9bit的精度需要最大93.75ms;10bit的精度需要最大187.5ms;11bit的精度需要最大375ms;12bit的精度需要最大750ms。   上电后,默认的精度为12位,我们一般也采用这个精度。如果觉得这个转换时间较长,可以考虑配置为其他的精度。

每个DS18B20都有一个独特的64位序列号,从而允许多只 DS18B20同时连在一根单线总线上;因此很简单就可以用一个微控制器去控制很多覆盖在一大片区域的DS18B20。这一特性在HVAC环境控制、探测建筑物、仪器或机器的温度以及过程监测和控制等方面非常有用。

温度传感器

    通过上述实物图可以看到,DS18B20有三个管脚,VDD(电源管脚),DQ(数据线),GND(地线)。   在使用时,也可以不通过VDD供电,而采用DQ供电(此种模式在此不再介绍)。   在平常使用时,VDD接电源3V~5V,GND接地,DQ上面需要接一个上拉电阻(阻值通常为4.7K,或者10K),DQ就是进行通信的数据线(单数据总线)。   了解了使用的电路特性后,就得琢磨一下,如何利用一个数据线DQ来进行控制这个温度传感器。   下图是DS18B20的框图:  

温度传感器

  64bit的rom中的数值时固定的。高八位为:28h(表示为DS18b20);后续的48位为:芯片的序列号(每一个DS18B20都不相同);最后八位:前面56位的CRC校验序列。   DS18B20支持在一个总线上面加载多个DS18B20,那么此时就需要获取每一个DS18B20的ROM,这样就可以精准的控制每一个器件了。   在此我们不对在一个总线上加载多个DS18B20的情况,只讨论加载一个DS18B20的情况。   读取ROM的64bit的命令为33H,后面跟着读取64bit,就是器件的ROM值(只能用在总线上只有一个器件的情况)。   匹配ROM的命令为55H,后面跟着写入64bit数据,只有和这64bit的数据相同的器件才会开始工作。   跳过ROM的命令为CCH,接收到这个命令的器件,不需要匹配就可以直接工作(只能用在总线上只有一个器件的情况)。   在此我们不做多器件的情况,所以可以直接发送跳过ROM的命令。   DS18B20的测温是需要被通知的,也就说我们需要给器件发送一个开始测温的命令,他才会开始测量温度,并且转换称为数字信号(16bit的有符号数)。   分频率为12位,使用16bit后面的12位(11:0)。 分频率为11位,则16bit的最后一个bit不使用(11:1)。 ······  

温度传感器

   

温度传感器

  上图为默认精度(12bit、0.0625度),如果第12位为0,表示为正温度,测量出来的数据乘以0.0625就可以了。如果第12为1,表示为负温度,则需要将测量出来的数据减去1,然后所有位取反,得到的结果再乘以0.0625度。上述的表示方式就是有符号数在数字电路中的表示形式。   16bit的数字信息存储在内部暂存器中,占用两个字节(在0、1字节)。  

温度传感器

    测温的命令为44H。   暂存器的第四个4字节就是配置分辨率的寄存器。  

温度传感器

  TM设置为0即可;  

温度传感器

  可以通过配置这个寄存器的值,来配置我们想要的分辨率。在此,我将不配置此寄存器,使用默认分辨率12bit。   写入暂存器的命令为4EH,后面跟着写入3个字节的数据,这三个字节写入到暂存器的2、3、4的位置。   读出暂存器的命令为BEH,后面跟着读出N个字节的数据,如果只是想读取温度,那么只需要读出两个字节的数据就可以了。   基本的命令差不多都介绍完事了,那么下面开始介绍时序。   首先:在发送命令之前,器件要求必须要被初始化。时序如下:  

温度传感器

  控制器需要拉低DQ,至少保持480us(最大不超过960us,建议:600us),然后释放总线控制(由于DQ被上拉,所以会被拉成高电平)。如果器件存在并且可以正常工作,器件会拉低DQ一段时间60-240us。   所以建议:控制器拉低DQ960us,释放总线控制,检测DQ是否还会拉低。主机从释放总线控制开始,要等待600us的时间去检测DQ是否拉低,如果有拉低则证明器件存在并且可以工作,如果没有拉低,则证明器件不存在或者不可以工作。   证明器件存在并且可以工作后,我们就可以向器件发送命令了。   发送命令和和数据以低位优先。   发送1bit的时序为:  

温度传感器

  如果控制器想要发送1bit0,那么直接拉低DQ100us即可,然后释放总线;如果控制器想要发送1bit1,那么拉低DQ5us,然后释放总线即可。无论是写0,还是写1,建议每一bit的时长110us。   读取命令和数据以低位优先。   读取1bit的时序为:  

温度传感器

  如果控制器想要读取的话,那么拉低DQ5us的时间,释放总线,在10us时,读取总线的电平值即可获得读取值。建议每一bit的时长110us。   实现DS18B20的驱动主要有三步: 第一步:初始化DS18B20; 第二步:ROM命令(紧跟任何数据交换请求); 第三步:DS18B20功能命令(紧跟任何数据交换请求);   所以我们上电后,工作的过程如下:   初始化、发送跳过ROM命令 、发送转换温度命令;等待750ms;初始化、发送跳过ROM命令、发送读取暂存器的命令、读取两个字节的数据。不断重复以上的过程即可。   上面的工作方式模式为:总线上是一个器件、分辨率为默认的12bit、没有匹配ROM。   DS18B20一般会制作到一个板卡上面,下面是笔者自制的板卡;  

温度传感器

  如果有需要的小伙伴,可以点击下面的链接:  

 

https://item.taobao.com/item.htm?ft=t&id=862024382902
  设计实现:利用FPGA驱动DS18b20,读取到温度数值显示到数码管上。

 

 

1. 温度传感器为DS18B20。

2. 总线上只有一个器件、温度分辨率为12bit(默认)、跳过ROM指令。

3. 将温度显示到数码管上。

4. 温度精确到小数点后2位。

5. 数码管共计6个,最前面显示是否为负温度(不显示为正温度,显示一横杠为负温度)。

6. 数码管共计6个,后面五个显示温度,前面三个显示整数、后面两个显示小数。

7. 数码管共计6个,整数与小数中间点亮小数点。

8. 利用LED显示是否初始化成功,LED点亮表示初始化成功,LED熄灭表示初始化失败。

使用平台:本次设计应用Altera的平台设计(芯片:EP4CE10F17C8)、使用的DS18B20板卡为市面上常见的,如果没有的同学,可以联系笔者购买。

开发软件:quartus 18.0

开发语言:Verilog HDL

作者QQ:746833924

说明:本篇设计中不涉及到ip电路,如果在其他平台,rtl代码依然可以适用,当其他板卡电路不同时,会导致不同的现象出现,如有需要修改代码请联系作者;如需作者使用的板卡,请联系作者;

设计思想如下:

温度传感器

  ds18b20_drive模块的功能为驱动ds18b20,获取温度,并且输出符号和温度的BCD码;seven_tube_drive模块的功能将符号和温度的BCD码输出,并且在右侧第三个数码管点亮小数点用以区分整数和小数。   ds18b20_drive模块采用状态机的方式实现。   读取到温度信息后,转换为BCD码输出;   首先判断温度的正负性,然后计算它的绝对值。   绝对值要乘以0.0625,此时乘以625,相当于扩大了10000倍,然后除以100,则表示扩大了100倍(因为我们需要保留两位小数 ,正好扩大100倍使小数都变成了整数)。  

 

      if (data_r[12] == 1'b1) begin
          temp_sign <= 4'he;
          data_1 = (~(data_r - 1'b1)) * 16'd625 /7'd100;
        end
      else begin
          temp_sign <= 4'hf;
          data_1 <= (data_r * 16'd625) /7'd100;
      end

 

 

数码管驱动采用最基本动态驱动即可,在此不做介绍;

相关参考代码为:  

 

通过网盘分享的文件:温度传感器DS18b20驱动--第一版
链接: https://pan.baidu.com/s/1es-KpmP4PqZbaR76kTDlYA?pwd=vins 
提取码: vins

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分