FPGA环境参数监测系统设计

博主福利:100G+电子设计学习资源包!

关注微信公众号→获取下载链接
--------------------------------------------------------------------------------------------------------------------------

本文设计了一个基于FPGA的环境监测系统,可以实现温湿度、光强、CO2、O2等环境参数的采集,并将数据通过串口WiFi的方式无线传输到上位机。温度的测量精度能达到0.4℃,湿度的测量精度能达到3.0%RH,光照度的测量精度能达到20%。

硬件设计方案

基于FPGA的环境监测系统在物理上主要由FPGA最小系统、各个传感器接口和通信接口组成。综合考虑了系统的设计要求和功能,以及产品的成本和开发的难易程度等问题,本系统选用Altera公司生产的Cyclone Ⅳ系列芯片EP4CE10F17C8,这款芯片有大量的逻辑单元和多个I/O口,还可以支持多种I/O标准,可以为系统提供低成本的设计平台。

传感器及其外围电路:保护传感器芯片,为系统采集环境信息。

电源电路:将5V电压转换成3.3V和1.2V,为FPGA芯片、各个传感器以及其它部分供电。

时钟电路:为FPGA提供参考时钟。

UART:连接串口WiFi模块,以实现数据的远程传输。

LCD:用于实时显示环境信息

配置电路:用于网表下载以及系统调试。

软件设计方案

系统的软件设计采用自上而下分模块的设计思路,所以首先要确定顶层架构以及顶层信号的输入输出关系。根据系统的设计要求,顶层信号首先需要参考时钟信号和复位信号的输入。其次根据系统的硬件设计,顶层还需要为各个传感器提供时钟信号线和数据信号线,以驱动传感器完成环境信息的采集。由于采集到的数据还需要通过串口发送和LCD显示,所以需要串口读写信号线,以及向LCD12864输出的信号线。

根据顶层的框架将系统软件分为五大模块:传感器控制模块、环境数据存储模块、液晶显示屏控制模块、串口WiFi驱动模块以及主控制模块。

传感器控制模块驱动传感器获取室内环境数据,并在主控制模块的控制下存储到FIFO中,为了实现实时采集数据又不使数据丢失,需要在每个传感器控制模块后连接FIFO,所以传感器控制模块的输出信号中有输入到FIFO中的数据信号和握手信号。

在主控制模块的控制下将各个FIFO中的数据按先后顺序读出来,由于有多个FIFO数据输出信号,所以在架构中加入了多路选择器,多路选择器的输出信号连接串口WiFi驱动模块的数据输入端口,串口WiFi驱动模块将这个并行的数据按固定的时序转换成串行数据发送到PC机。多路选择器的输出信号也连接到液晶显示屏驱动模块上,在液晶显示屏驱动模块的控制下将数据显示到显示屏的对应位置。

温湿度检测设计

温湿度传感器SHT11有两条信号线串行时钟输入信号(SCK)和串行数据信号(DATA),SCK用于同步FPGA芯片与SHT11之间的通讯,在VDD<4.5V的条件下SCK的最大频率为1MHz,由于SHT11的接口有完全静态逻辑,所以不存在最小频率。DATA三态门用于数据读取,仅在SCK上升沿有效,数据传输期间,SCK为高电平时,DATA必须保持稳定。由于系统在硬件设计中加入了外部的上拉电阻,所以FPGA芯片驱动DATA为低电平即可。

根据厂家提供的芯片手册,传感器上电后要等待11ms以越过休眠期,然后发送一组启动传输的时序,以表示数据传输的初始化。它包括:SCK为高电平时,驱动DATA为低电平,然后将SCK置低,紧接着在SCK为高电平时使DATA翻转为低电平。启动传输的时序图如图所示。

之后发送三个地址位000,和五个命令位,SHT11在第八个SCK上升沿将DATA拉为低电平表示已正确接收到命令。之后FPGA需要等待测量结束,SHT11将DATA拉为低电平以表示测量结束。在再次触发SCK之前,必须等待测量结束信号发出后,才能读出数据。传感器会先存储测量数据,等需要时再读出数据。接着传感器会传输2个字节的测量数据和1个字节的CRC奇偶校验,FPGA每收到一个字节的数据就将DATA下拉为低电平,以确认收到数据。数据为右值有效,例如,对于测量精度为12Bit的数据,第5个SCK起算有效数据。收到最后一个字节数据后保持DATA高电平来终止通信。测量和通信结束后,传感器进入休眠模式,等待下一组启动传输时序。具体工作时序如图所示。

在编写驱动代码之前首先要确定端口的输入输出关系。因为是按照时序发送信号,所以一定需要时钟信号的输入,为了方便模块调试还需要复位信号的输入。通过阅读芯片资料,为了能正常驱动温湿度传感器SHT11,还需要三态门DATA信号和串行时钟输出信号SCK。由于测量数据要先存储到FIFO中,所以需要温度和湿度数据的输出t_data和rh_data和握手信号t_flag和rh_flag,flag信号只有一个时钟周期,可以作为FIFO的写命令信号。因为FIFO的深度是有限的,所以还有FIFO满标志信号的输入,当FIFO的满标志信号为高电平时就停止读出传感器中的数据,防止数据丢失。模块的端口设计如图所示。

因为是按照固定的时序来编写代码,所以使用状态机的方式更加便捷。状态转移图如图所示。

光强检测设计

驱动光照度传感器BH1750FVI需要两条信号线,串行时钟输入信号(SCL)和串行数据信号(SDA),其控制时序为标准I2C接口时序。先进行模块端口的设计。因为驱动模块是按时序发送信号的,所以首先需要时钟的输入信号clk_1M。为了方便模块调试,还需要复位信号rst_n的输入。根据厂家提供的芯片手册,驱动BH1750FVI还需要三态门SDA信号和串行时钟输出信号SCL。为了防止数据堆积而导致数据丢失,测量数据需要存储到FIFO中,那么光强传感器的驱动模块就需要对FIFO输出的测量数据信号lx_data和握手信号lx_flag,lx_flag只有一个时钟周期,在这里充当FIFO的写请求信号。

AD驱动设计

要想测量氧气和二氧化碳的浓度,需要驱动A/D转换芯片TLC549,它有一个时钟信号和一个片选信号的输入,以及A/D转换后数据的串行输出,所以该驱动模块的端口除了时钟和复位信号的输入外,还有串行数据输入data,以及时钟信号clk_out和片选信号cs_n的输出,为了方便数据的存储和发送,模块还要有A/D转换后并行数据的输出data_out和一个时钟周期的握手信号flag,flag可以作为FIFO的写命令信号。

串口驱动设计

系统通过串口将数据发送到串口WiFi模块,从而实现PC机远程获取环境监测信息。本系统中串口的数据格式为1位起始位、8位数据位、1位停止位。在空闲状态时FPGA驱动TxD为高电平,要发送数据时先驱动TxD为低电平,再发送8位数据,最后发送停止位,即驱动TxD为高电平。

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

电子开发圈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值