本篇主要讨论基于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
全部0条评论
快来发表一下你的评论吧 !