SoC实战项目: 温湿度传感通过AMBA总线传输数据并给UART打印

soc入门实战 - 温湿度传感并显示

  1. 注:源代码参见我的博客主页下–温湿度传感器 - soc系统 verilog quartus2+keil5https://download.csdn.net/download/qq_43029779/85907117
    资源仅用于学习和交流,如需转载请注明,欢迎交流
  2. 环境:keil5+quartus2+modelsim +fpga DE10_LITE_Golden

题目:设计APB接口IIC模块,外接DHT11 温度传感器,在LED数码管上温度值/湿度值(通过按键切换),每5秒中通过UART在上位机PC实时显示
解题:题目要求设计一个简单soc系统,我们应该将一下简单外设挂接在apb上,将高速接口如dma等挂接在ahb总线上。

1.设计架构

本设计是基于 AMBA 总线协议来实现的,主要实现的功能是 APB 外接 DHT11 温度传感器,在 LED 数码管上通过按键切换显示温度值/湿度值,并且每 5 秒通 过 UART 在上位机 PC 实时显示。主要的架构如下图所示,ARM 处理器和 SRAM 挂载在 AHB 总线上,而 UART、RTC、DHT11、按键以及数码管则挂载在 APB 总 线上。考核点:1)硬件访问 DHT11 2)UART 输出打印 3)RTC 定时 5s
在这里插入图片描述

二、硬件设计

2.1 寄存器与引脚设计
2.1.1 Rtc 模块
通过总线读写寄存器可以将数据写入、读出设定地址内的数据即可完成主机 与从机的数据交互。以下模块都挂在 apb 总线上,总线的地址根据 slave 的 id 决 定。注意:在将 slave 连接到总线时,需要将 hready 拉高,否则 hsel 将不开启。

Rtc 模块初始化时先置时间为 2022 年 12 月 29 日 23 时 59 分 59 秒,寄存器 可读写,支持软件置入数据,RTC 模块将每 5s 开启一次计数中断标志位,用以 软件中断打印 uart 传输的信息。


2.硬件设计
顶层引脚连接:根据用户手册可以先将外设与引脚相连接。我们只需source 一下tcl文件即可完成管脚配置。其他的引脚只需在顶层文件上连接,如下
在这里插入图片描述Rtc 模块初始化时先置时间为 2022 年 12 月 29 日 23 时 59 分 59 秒,寄存器 可读写,支持软件置入数据,RTC 模块将每 5s 开启一次计数中断标志位,用以 软件中断打印 uart 传输的信息。
在这里插入图片描述

Uart挂在apb上,
CM3DS_MPS2.h文件Peripheral memory map 外设存储器映射定义了各个部分不同的位置定义。这里UART地址=0x40000000UL(apb_base)+0x4000UL
apb选通了psel4来挂。
在这里插入图片描述
相似地,我们写硬件语言将寄存器配置好:如下图是数码管写入数据与读出数据的代码
在这里插入图片描述
经过以前的文章我们可以配置好软硬件环境以及fpga管脚,我们只需写好外设并挂载在apb上就可以了。

2.1.7 soc 电路设计下载到 fpga
都配置好后直接 compile design,生成的文件中会有如下两中可下载文件,其中,sof 文 件下载速度快,但是掉电易失,pof 文件下载速度慢,但掉电不易失 在 programmer 中只要配置好 hardware 和 file 就好,好现在我们已经完成了硬件的程序 设计、pin 脚连接、程序下载,下面我们要开始在软件上看我们的 soc 上调试程序能否正确 执行。顶层引脚连接:根据用户手册可以先将外设与引脚相连接。其他的引脚只需 在顶层文件上定义并连接,如下图: 数码管分别连接相应的管脚,reset 脚连接 key[1]按键,dht11 作为 inout 管脚 连接 gpio[8],key 按键控制温湿度切换的按键连接了 key[0]。
在这里插入图片描述
2.2 Rtc 模块
RTC 是个独立的定时器。RTC 模块拥有一个连续计数的计数器,在相应的软 件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和 日期 RTC 还包含用于管理低功耗模式的自动唤醒单元。两个 32 位寄存器包含二 进码十进数格式 (BCD) 的秒、分钟、小时(12 或 24 小时制)、星期几、日期、 月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数 补偿为 28、29(闰年)、30 和 31 天。无论器件状态如何(运行模式、低功耗模 式或处于复位状态),只要电源电压保持在工作范围内,RTC 使不会停止工作。
在这里插入图片描述
在这里插入图片描述

2.3 DHT11 传感器模块
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传 感器。它使用专用的数字模块采集技术和温湿度传感技术,具有极高的可靠性与 卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个 NTC(负温度系数热 敏电阻器)测温元件,并与一个高性能 8 位 MCU 相连接。每个 DHT11 传感器都 在湿度校验室中校准过,校准系数以程序的形式储存在 OTP(一次性可编程)内 存中,传感器内部在检测信号的处理过程中要调用这些校准系数。DHT11 使用单 线制串行接口,4 针单排引脚封装,信号传输距离可达 20 米以上,在各类应用 甚至很苛刻的环境中都能正常工作。
在这里插入图片描述
DATA 用于 FPGA 与 DHT11 之间的通讯和同步,采用单总线数据格式,一次 通讯时间 4ms 左右,数据分为整数部分和小数部分,一次完整的数据传输为 40bit, 高位在前。数据格式如下: 8bit 湿度整数数据+8bit 湿度小数数据 +8bit 温度整数数据+8bit 温度小数数据 +8bit 校验和数据
数据传送正确时校验和数据等于“8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据”所得结果的末 8 位)。 接下来我们介绍一下 DHT11 的传输时序,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”时序图如图。
在这里插入图片描述
DHT11 驱动模块使用三段式状态机来读取 DHT11 的温度和湿度值,从下图 可以比较直观的看到每个状态实现的功能以及跳转都下一个状态的条件。这里需 要注意的一点是,由于 DHT11 温度和湿度转换较慢,如果读取速度过快会导致 DHT11 无法响应的情况,所以我们在每次读操作结束后延时两秒。
在这里插入图片描述
2.4 数码管显示
先将数据 data 的个位、十位、百位、千位、万位和十万位分别取出,分别 赋 值 给 wire 型 变 量 data0 、 data1 、 data2 、 data3 、 data4 和 data5 。
在这里插入图片描述
将 data 与数码管的输入 bin_data 相连,将 seg 与数码管输出 seg_data 相连 进行 apb 写操作,定义 seg_decoder,根据不同的 bin_data 输入控制数码管 段选信号,显示到数码管上。
在这里插入图片描述

2.5 Key 模块
将小数部分和整数部分分别定义寄存器,并且使能数码管。检测到按键按下 时,切换温/湿度标志信号。flag 为“0”时显示温度,为“1”时显示湿度。温 度最高位为符号位,bit7 为 1 时表示负温度。
在这里插入图片描述
2.6 IIC_apb 接口
IIC_apb 的寄存器如下
在这里插入图片描述
下面是 apb 地址写入数据的和读取数据的赋值块
在这里插入图片描述
下图是 iic 的收发模型波形变化,根据波形变化收发数据。
在这里插入图片描述
三、软件设计

3.1 寄存器初始化 通过插桩的方式将寄存器的数值写入、读出。可以通过软件程序来驱动硬件实现相应功 能。如:通过插桩的方式向固定的寄存器内写入或读取数据。此时,打开相应的寄存器窗口,寄 存器内将会显示 soc 内对应 slave 相应寄存器内的数据。
//----------dht11 set-------------------------------- tempture = ((uint32_t*) 0x40001000UL);//read tempture data_temp=*tempture;
在这里插入图片描述
3.2 上升沿检测方式
由于需要每 5 秒通过 UART 在上位机 PC 实时显示温湿度的数值,在硬件中 设置了中断信号,第五秒时中断信号为高电平。但是这里只需要检测出中断的上 升沿即可,因此通过增添一个 zero_one 变量和中断配合来检测出 5 秒中断的上 升沿,并在上升沿时通过串口打印出相应的 RTC 信息以及实时的温湿度信息。
在这里插入图片描述
也可以通过中断程序方式编程: 首先,先写好中断函数如下
在这里插入图片描述
首先设计一个 rtc 数据结构谁家一个中断处理函数,当 rtc 硬件产生一个中断时, 软件就会设置一个 flag=1。控制 uart 打印温湿度信息。
在这里插入图片描述
四、结果展示

4.1uart 打印信息
如图所示,uart 打印的信息包括 rtc 模块输出的信息,温度,与湿度。初始 的数据时间是 2022 年 12 月 31 日 23:59:59,每五秒采集一次数据。温度的初 始化数据为 0,接着将会采集到温度传感器送来的数据,27.06℃,用手升温传感 器,湿度由 79 变为 95,温度由 27.06 摄氏度变为 31.07 摄氏度。
在这里插入图片描述
4.2 按键控制切换数码管显示
下图展示了数码管显示温度传感器采集的温度和湿度的数据,温度采集为 28.09,湿度为 79.00,都是符合下述的 dht11 的标准。
在这里插入图片描述
在这里插入图片描述
五、总结

熟悉了 UART、RTC、DHT11 等模块的原理和实现 方法,对 AMBA 总线也有了更深刻的理解。在进行作业的过程中,也遇到了不少问题,比如数码管驱动模块编译正确了,但是数码管却不显示相应的数值, 后来结合 DE10-Lite 的手册我们发现它上面的数码管不是通过位选加段选控制的, 而是每个数码管单独控制的,因此只需要对每个数码管进行段选控制即可。通过 对程序进行修改,数码管也能正常显示数值。再比如每 5 秒通过 UART 在上位机 PC 实时显示温湿度的数值,在硬件中设置了中断信号,第五秒时中断信号 为高电平。但这样带来了相应问题,就是在第 5 秒这整 1 秒的时间内 UART 一直 在打印温湿度数据,后来通过在软件程序中增加一个变量进行联合控制,在中断信号上升沿的时候才打印温湿度以及 RTC 的相应信息。

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sr_shirui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值