项目记录 / 基于FPGA实现数字温度计
目录
1、设计目标
1)温度测量范围0~125℃;
2)led数码管显示温度;
3)存在报警温度(可修改)。
2、硬件部分
主要由三个部分构成:
1)温度采集模块;(DS18B20)
2)数据处理模块;(FPGA)
3)温度显示模块。(LED数码管)
框图:
DS18B20
1. 特性
- 主要由七部分组成:高速暂存器、8位CRC发生器、64位ROM、寄生电源、温度传感器、高温触发器TH和低温触发器TL;
- 64位ROM是温度敏感元件,其中包含了DS18B20唯一的***;
- 单总线:输入输出共用,有严格的读写时序要求;
- 3个引脚:VDD、GND、DQ;
- 测量结果以9~12位数字量方式串行传送。
2. 温度数据输出
说明:本次试验显示忽略了小数位,只取整数位,那么只取data[10:4]这7位, 便是温度的整数值。
3、程序设计
分为四个模块:
1)DS18B20驱动模块(主程序);
2)分频模块;
3)数制转换模块(含报警);
4)显示模块。
3.1 DS18B20驱动模块
DS18B20驱动模块是总程序,调用三个子程序,从而达到温度的显示。DS18B20采用一根 I/O 总线读写数据,因此它对读写数据位有严格的时序要求。DS18B20 遵循相应的通信协议从而保证数据传输的正确性和完整性。该通信协议定义了多种信号时序 : 初始化时序、写时序、读时序。 从分频模块的clk_lm输出1MHz到通信模块的clk作为时钟信号;根据 DS18B20所遵循的初始化时序、读时序、写时序等通信协议将程序完成; 将获取的12位的温度信号传送给下一个模块。
3.2 分频模块
针对50MHz的时钟 频率进行分频产生1MHz频率控制信号和1KHz频率扫描信号。
1. 端口说明
clk:输入50M时钟;
rst:复位信号;
clk_lk:分频后输出的时钟
clk_lm:分频后输出的时钟。
2. 原理分析
系统时钟信号进入分频模块clk引脚,经过分频后得到信号clk_lm 和clk_lk输出。
输出的clk_lk的频率信号用于扫描数码管做动态显示,使人不会看到数码管的闪烁感;输岀的clk_lm的频率信号用于产生1us时钟,用于控制传感器读写时序。
3.3 数制转换模块
利用数制转换模块将输入的16位二进制的温度数据转换为BCD码。
1. 端口说明
data[15..0]:输入16位数据
bcd_out[11..0]:输出 12 位数据
led[2..0]:输出3位led灯电平数据
2. 原理分析
data[15..0]表示从DS18B20获取的16位数据,前4位表示温度的正负号,后12位表示数据,本次试验显示忽略了小数位和负号, 只取整数位,那么只取data[10:4]这7位,便是温度的整数值。
bcd_out[11..0]的每四位储存一个数据,一共有3个数据,这三个数据分别代表着温度的个位、十位、百位,便于在下一个模块中将其转换成十进制显示出来。
led[2..0]控制FPGA板子上的三个led灯,当温度数据超过所设定的范围时,送高电平,三个灯亮,实现报警功能。
3.4 显示模块
数码管采用动态显示(共阳极);从分频模块的clk_lk输出1KHz到该模块作为时钟扫描信号。
1. 端口说明
clk:输入clk_lk的时钟信号;
rst:复位信号
data[11..0]:进制转换岀的12位数据
seg[7..0]:段选信号;
en[3..0]:位选信号。
2. 原理分析
本次设计釆集的温度忽略了百位,所以只需要显示温度的十位跟个位就可以了,调用两个数码管,其中一个数码管当作十位,另一个数码管则是个位,当十位的数码译码为“00100101 ”时,则说明十位数码管将显示数值“2”,当个位的数码管译码为“00001101 ”时,则说明个位显示“3”。 因此个位和十位都是按照八段译码的原则将0〜9之间的数字显示出来。
4、仿真及测量效果
4.1 数制转换模块仿真
报警上下限设为100℃和10℃:
报警上下限设为30℃和10℃:
说明:由仿真结果可知,数制转换模块能成功将输入的数据转化为bcd码;同时可以看出,温度上限分别为100℃和30℃时,对应输入温度数据33,led分别为000和111,报警功能正常实现。
4.2 温度测量效果
说明:测量结果符合预期,数码管能正常显示温度数据,超过温度上限时led灯亮,表示报警。