您当前的位置: 首页 >  正点原子 fpga开发

【正点原子FPGA连载】 第二十八章DHT11数字温湿度传感器实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

正点原子 发布时间:2021-11-04 12:05:10 ,浏览量:3

1)实验平台:正点原子新起点V2开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113
2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html
3)对正点原子FPGA感兴趣的同学可以加群讨论:994244016
4)关注正点原子公众号,获取最新资料更新

第二十八章DHT11数字温湿度传感器实验

DHT11是奥松(AoSong)公司生产的一款数字温湿度复合传感器。该传感器用途广泛、抗干扰能力强、可靠性高,在家电、汽车、医疗等方面有广泛的应用。本章我们将使用FPGA开发板实现对DHT11数据的采集,并将温湿度数据显示在数码管上。
本章包括以下几个部分:
2727.1简介
27.2实验任务
27.3硬件设计
27.4程序设计
27.5下载验证

28.1简介
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它使用专用的数字模块采集技术和温湿度传感技术,具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC(负温度系数热敏电阻器)测温元件,并与一个高性能8位MCU相连接。每个DHT11传感器都在湿度校验室中校准过,校准系数以程序的形式储存在OTP(一次性可编程)内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。DHT11使用单线制串行接口,4针单排引脚封装,信号传输距离可达20米以上,在各类应用甚至很苛刻的环境中都能正常工作。

图 28.1.1 DHT11内部原理图
上图为DHT11的内部原理图,可以看出感湿原件、感温元件和OTP内存直接连接在内部一个八位MCU上,该MCU通过计算得出测量数值。
DATA用于FPGA与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分为整数部分和小数部分,数据格式如下:
一次完整的数据传输为40bit,高位在前。
数据格式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和数据
数据传送正确时校验和数据等于“8bit湿度整数数据 + 8bit湿度小数数据 + 8bit温度整数数据 + 8bit温度小数数据”所得结果的末8位)。
接下来我们介绍一下DHT11的传输时序,DHT11的数据发送流程如图 28.1.2错误!未找到引用源。所示。

图 28.1.2 DHT11数据发送流程
主机(此处指FPGA)首先发送一次开始信号,即:拉低数据线,保持t1(至少18ms)时间;然后拉高数据线保持t2(20~40us)时间,随后开始读取DHT11的响应;如果操作正确的话,DHT11会拉低数据线,保持t3(80us)时间,作为响应信号;接下来DHT11会拉高数据线,保持t4(80us)时间,随后开始输出有效数据。
DHT11共输出40bit有效数据,每1bit数据都是以50us低电平开始,高电平的持续时间作为判断数据位的条件。当数据位为0时,高电平的持续时间为26~28us;当数据位为1时,高电平的持续时间为70us。
DHT11数据位“0”时序图和数据位“1”时序图如图 28.1.3和图 28.1.4所示。

图 28.1.3 DHT11数据位“0”时序图

图 28.1.4 DHT11数据位“1”时序图
需要注意的是,DHT11的温度和湿度转换较慢,如果读取速度过快会导致DHT11无法响应的情况。本次实验每100ms读取一次,如果DHT11长时间未响应,则重新发起开始信号。
28.2实验任务
本节实验任务是使用新起点FPGA开发板完成对DHT11温湿度数据的采集,并通过按键KEY0控制温度和湿度在数码管上的切换显示。
28.3硬件设计
我们的新起点开发板上有一个DS18B20/DTH11的扩展接口,该接口可以用来连接DS18B20或DHT11。其原理图如图 28.3.1所示。

图 28.3.1 DHT11/DS18B20扩展接口原理图
DHT11通过4个排针与外部连接,如图 28.3.2所示,将DHT11直接插在开发板上即可,接插之前注意正负极的方向,以免短路。

图 28.3.2 DHT11连接实物图
本次实验的管脚分配如下表所示:
表 28.3.1 管脚分配

本节实验使用的管脚基本都是数码管管脚,这里不再给出TCL文件。
28.4程序设计
根据实验任务,我们可以大致规划出系统的工作流程:FPGA控制DHT11采集温度和湿度,并将收到的温度和湿度数据转换成十进制显示在数码管上。本次实验使用按键来控制数码管显示温度和湿度,所以还需要添加消抖模块来对按键进行消抖,以及按键控制模块控制数码管切换显示温度和湿度。由此画出的系统框图如下图所示。

图 28.4.1 DHT11数字温湿度传感器系统框图
各模块端口及信号连接如图 28.4.2所示:

图 28.4.2 顶层模块原理图
FPGA部分包括5个模块,顶层模块(top_dht11)、DHT11驱动模块(dht11_drive)、按键消抖模块(key_debounce)、按键控制模块(dht11_key)、数码管驱动模块(seg_led)。其中在顶层模块完成对其他模块的例化。
DHT11驱动模块(dht11_drive):dht11_drive模块通过单总线引脚读取DHT11的温度值和湿度值,并将读取到的数据输出至按键控制模块。
按键消抖模块(key_debounce):消除按键抖动,在检测到有按键按下或释放时对按键数据进行消抖处理。
按键控制模块(dht11_key):根据输入的按键控制信号,将温度数据和湿度数据选择输出至数码管显示模块。
数码管显示模块(seg_led):将输入的数据显示到数码管上。
顶层模块代码如下:

1   module top_dht11(
2       input          sys_clk  ,  //系统时钟 
3       input          sys_rst_n,  //系统复位
4       
5       inout          dht11    ,  //DHT11总线
6       input          key      ,  //按键
7       output  [5:0]  sel      ,  //数码管位选信号
8       output  [7:0]  seg_led     //数码管段选信号
9   );
10  //wire define
11  wire  [31:0]  data_valid;
12  wire  [19:0]  data      ;
13  wire  [5:0]   point     ;
14  
15  //*****************************************************
16  //**                    main code
17  //*****************************************************
18  
19  //dht11驱动模块
20  dht11_drive u_dht11_drive (
21      .sys_clk        (sys_clk),
22      .rst_n          (sys_rst_n),
23      
24      .dht11          (dht11),
25      .data_valid     (data_valid)
26      );
27  
28  
29  //按键消抖模块
30  key_debounce u_key_debounce(
31      .sys_clk        (sys_clk),
32      .sys_rst_n      (sys_rst_n),
33      
34      .key            (key),
35      .key_flag       (key_flag),
36      .key_value      (key_value)
37      );
38  
39  //按键控制温/湿度显示
40  dht11_key u_dht11_key(
41      .sys_clk        (sys_clk),
42      .sys_rst_n      (sys_rst_n),
43      
44      .key_flag       (key_flag),
45      .key_value      (key_value),
46      .data_valid     (data_valid),
47      
48      .data           (data),
49      .sign           (sign),
50      .en             (en),                     
51      .point          (point)
52      );
53  
54  //动态数码管显示模块
55  seg_led u_seg_led (
56      .clk            (sys_clk),
57      .rst_n          (sys_rst_n),
58      
59      .seg_sel        (sel),
60      .seg_led        (seg_led),
61      
62      .data           (data),
63      .point          (point),
64      .en             (en),
65      .sign           (sign)
66      );
67  
68  endmodule 

顶层模块完成对其他模块的例化,dht11_drivr模块输出的数据信号(data_valid)和key_debounce模块输出的按键信号(key_flag和key_value)连接至dht11_key模块,dht11_key模块输出的温度/湿度数据(data)以及数码管控制信号连接至seg_led模块。
由本章简介部分介绍的DHT11传输时序可以发现,DHT11的传输时序适合用状态机来编写。DHT11驱动模块状态跳转图如下所示。

图 28.4.3 DHT11驱动状态跳转图
DHT11驱动模块使用三段式状态机来读取DHT11的温度和湿度值,从上图可以比较直观的看到每个状态实现的功能以及跳转都下一个状态的条件。这里需要注意的一点是,由于DHT11温度和湿度转换较慢,如果读取速度过快会导致DHT11无法响应的情况,所以我们在每次读操作结束后延时两秒。
由于DHT11驱动模块的代码较长,我们仅贴出部分源代码。

131         case (cur_state)
132                 //上电后延时1秒等待DHT11稳定
133             st_power_on_wait : begin                
134                 if(us_cnt             
关注
打赏
查看更多评论