基于FPGA的OLED动态显示(温湿度实时数据)

描述

实验结果

FPGA

从视频中,可以看到,当手指捏住传感器后,OLED屏上的温湿度数据发生变化。

基于FPGA的OLED动态显示(温湿度实时数据)

Part一

硬件解析

1. 国产FPGA:HME-P1P060

58K逻辑单元,36K LUT-6,4个PLL,32个全局时钟,144个DSP,基本上已经满足了学生等级开发,感兴趣的,可以去米联客店铺看看。

FPGA

2. 0.96寸OLED

FPGA

关于OLED的显示,这里不做介绍,详见二级菜单文章:京微齐力:基于HMEP060的OLED字符显示(及FUXI工程建立演示)

3. DTH11温湿度模块(比较枯燥,请耐心看完原理)

FPGA

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。

FPGA

上图为DHT11的内部原理图,可以看出感湿元件、感温元件和OTP内存直接连接在内部一个八位MCU上,该MCU通过计算得出测量数值。

DATA用于FPGA与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分为整数部分和小数部分,数据格式如下:一次完整的数据传输为40bit,高位在前。

数据格式:

FPGA

数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据”所得结果的末8位。校验和=数据之和,通过这个可以判断接收到的数据是否正确。

下面说一下,数据传输时序:

FPGA

主机(此处指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”时序图如图:

FPGA

需要注意的是,DHT11的温度和湿度转换较慢,如果读取速度过快会导致DHT11无法响应的情况。

Part二

程序设计

1. DTH11数据采集(状态机)

DHT11驱动模块使用三段式状态机来读取DHT11的温度和湿度值,从下图可以比较直观的看到每个状态实现的功能以及跳转到下一个状态的条件。

再次强调,这里需要注意:由于DHT11温度和湿度转换较慢,如果读取速度过快会导致DHT11无法响应的情况,所以我们在每次读操作结束后延时两秒(这样鲁棒性会比较高,也可以不要这步)。

FPGA

在时序图中,提到了18ms、26-28us、20-40us、50us、70us、80us等等,但是经过分析后,并不需要定义这么多个计时周期数,只需要定义两个即可。为什么只定义这两个就可以了呢?

在时序图中,需要FPGA判断时间的,有两个位置,一个是FPGA拉低18ms以上,另外一个是判断数据表示是数据0还是数据1。第一个很清楚就是18ms。数据0表示的数据位26-28us,为了保险起见,这里设置为35us,如果高电平的持续时间低于35us,那么就表示数据0。

FPGA

FPGA

FPGA

FPGA

FPGA

FPGA

2. 字符显示

OLED的显示(包括字符提取等),这里不做介绍,我在另一篇文章有介绍过,感兴趣的可以看看:京微齐力:基于HMEP060的OLED字符显示(及FUXI工程建立演示)

FPGA

3. 字符输出

代码有注释,可以看注释

FPGA

35 本例中,OLED显示一共分为如下5个状态。在初始化完成后,屏幕显示的是杂乱无章的数据,所以在初始化完成后,要进行一次刷新,将OLED中的数据全部写0。然后进行显示固定不变的支符,例如像温度湿度这样的字符。然后进入空闲态,直到DHT11采集到数据后,就进入到数据显示状态,数据显示完成后,又回到空闲态。这是整个的一个流程。

FPGA

FPGA

FPGA

FPGA

FPGA

FPGA

Part三

弧形抓取

在工程中,例化了debugware IP核,对温湿度传感器的波形进行抓取,可以看到如下:

FPGA

前文有说过,传感器的数据位总共有40位,考虑到后续可能抓取别的波形,所以此处debugware的数据位宽我设置到了45位,预留了5位。

这里抓到的波形是:2E 0019 034A
对应的二进制即:

0010_1110_0000_0000_0001_1001_0000_0011_0100_1010

根据上文数据公式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和数据

所以此刻的,湿度:

46.00(10_1110_0000_0000)

温度:

25.03(0001_1001_0000_0011)

FPGA

审核编辑:汤梓红

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

全部0条评论

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

×
20
完善资料,
赚取积分