名稱:LM75溫度傳感器數(shù)碼管顯示溫度(代碼在文末付費(fèi)下載)
軟件:VIVADO
語言:Verilog
代碼功能:
使用verilog編寫代碼,讀取IIC(I2C)接口的LM75溫度傳感器數(shù)據(jù),并在數(shù)碼管顯示,代碼兼容LM75A,LM75BD,tmp1075
本代碼已在開發(fā)板驗(yàn)證,開發(fā)板資料:
FPGA代碼Verilog/VHDL代碼資源下載網(wǎng):www.hdlcode.com
部分代碼展示
//?*************************************************************/ `define?????SCL_POS??????????(cnt==3'd0)?????? `define?????SCL_HIG??????????(cnt==3'd1) `define?????SCL_NEG??????????(cnt==3'd2)????? `define?????SCL_LOW??????????(cnt==3'd3)?? `define????DEVICE_READ????????8'b1001_0001????//read?device?addr //************************************************************/ module?i2c_read_lm75 ( ?input??????????????sys_clk, ?input??????????????rst_n, ?output?????????????scl,? ?inout??????????????sda,?????? ?output?reg[16:0]???????data ??);??????????????????????? //--------------------------------------------??????? reg[2:0]?cnt;?? reg[7:0]?cnt_delay;???? reg?scl_r;?????? always?@?(posedge?sys_clk?or?negedge?rst_n) ????if(!rst_n)?cnt_delay?<=?8'd0; ????else?if(cnt_delay?==?8'd199)?cnt_delay?<=?8'd0;??? ????else?cnt_delay?<=?cnt_delay+1'b1; always?@?(posedge?sys_clk?or?negedge?rst_n)? begin ????if(!rst_n)?cnt?<=?3'd5; ????else?begin ????????case?(cnt_delay) ????????????9'd49:?????cnt?<=?3'd1; ????????????9'd99:?????cnt?<=?3'd2;? ????????????9'd149:????cnt?<=?3'd3;?? ????????????9'd199:????cnt?<=?3'd0;? ????????????default:???cnt?<=?3'd5; ????????????endcase ????????end end ? always?@?(posedge?sys_clk?or?negedge?rst_n) ????if(!rst_n)?scl_r?<=?1'b0; ????else?if(cnt==3'd0)?scl_r?<=?1'b1; ???????else?if(cnt==3'd2)?scl_r?<=?1'b0; assign?scl?=?scl_r;??? //---------------------------------------------??????????????? reg[7:0]?db_r;???? (*mark_debug="TRUE"*)?reg[15:0]?read_data;?? //--------------------------------------------- parameter?????IDLE??????=?4'd0; parameter?????START?????=?4'd1; parameter?????ADDR??????=?4'd2; parameter?????ACK1??????=?4'd3; parameter?????DATA1?????=?4'd4; parameter?????ACK2??????=?4'd5; parameter?????DATA2?????=?4'd6; parameter?????NACK??????=?4'd7; parameter?????STOP??????=?4'd8; (*mark_debug="TRUE"*)reg[3:0]?cstate;???? reg?sda_r;? reg?sda_link;????????? reg[3:0]?num;?? reg[25:0]?tim; always?@?(posedge?sys_clk?or?negedge?rst_n)? ????if(!rst_n)?tim<=26'd0; ????else?tim<=tim+1'b1; always?@?(posedge?sys_clk?or?negedge?rst_n)?begin ????if(!rst_n)?begin ????????????cstate?<=?IDLE; ????????????sda_r?<=?1'b1; ????????????sda_link?<=?1'b0; ????????????num?<=?4'd0; ????????????read_data?<=?16'd0; ????????end ????else??????? ????????case?(cstate)
設(shè)計(jì)文檔:
1實(shí)驗(yàn)簡介
本教程介紹使用溫度傳感器 LM75 來進(jìn)行溫度測試,例程中主要介紹溫度傳感器的 ?FPGA 驅(qū)動(dòng)和數(shù)碼管顯示。
2實(shí)驗(yàn)原理
2.1 LM75原理介紹
LM75BD 是一個(gè)高速 I2C 接口的溫度傳感器,可以在-55℃~+125℃的溫度范圍內(nèi)將溫度直接轉(zhuǎn)換為數(shù)字信號,并可實(shí)現(xiàn) 0.125℃的精度。
控制器可以通過 I2C 總線直接讀取其內(nèi)部寄存器中的數(shù)據(jù),并可通過 I2C 對 4 個(gè)數(shù)據(jù)寄存器進(jìn)行操作,以設(shè)置成不同的工作式。
LM75BD有 3 個(gè)可選的邏輯地址管腳,使得同一總線上可同時(shí)連接 8 個(gè)器件而不發(fā)生地址沖突。
LM75BD 可配置成不同的工作模式。它可設(shè)置成在正常工作方式下周期性地對環(huán)境溫度進(jìn)行監(jiān)控,或進(jìn)入關(guān)斷模式來將器 件功耗降至最低。
OS 輸出有 2 種可選的工作模式:OS 比較器模式和 OS 中斷方式,OS 輸出可選擇高電平或低電平有效。
正常工作模式下,當(dāng)器件上電時(shí),OS 工作在比較器模式,溫度閾值為80℃,滯后閾值為 75℃。
低功耗設(shè)計(jì),工作電流典型值為 250uA,掉電模式為 3.5uA;寬工作電壓范圍:2.8V~5.5V。
LM75BD 管腳說明如下圖:
引腳名稱 |
引腳序號 |
說明 |
SDA |
1 |
I2C串行雙向數(shù)據(jù)線,開漏口 |
SCL |
2 |
I2C串行時(shí)鐘輸入,開漏口 |
OS |
3 |
過熱關(guān)斷輸出,開漏輸出 |
GND |
4 |
地,連接到系統(tǒng)地 |
A2 |
5 |
用戶定義的地址2 |
A1 |
6 |
用戶定義的地址1 |
A0 |
7 |
用戶定義的地址0 |
VCC |
8 |
a)溫度寄存器Temp(地址0x00)
溫度寄存器是一個(gè)只讀寄存器,包含?2?個(gè)?8?位的數(shù)據(jù)字節(jié),由一個(gè)高數(shù)據(jù)字節(jié)(MS)和一個(gè)低數(shù)據(jù)字節(jié)(LS)組成。這兩個(gè)字節(jié)中只有?11?位用來存放分辨率為?0.125℃的?Temp?數(shù)據(jù)(以二進(jìn)制補(bǔ)碼數(shù)據(jù)的形式),如下表所示。對于?8?位的?I2C?總線來說,只要從?LM75BD?的“00地址”連續(xù)讀兩個(gè)字節(jié)即可(溫度的高?8?位在前)。
下表給出了一些 Temp 數(shù)據(jù)和溫度值的例子。
b)配置寄存器(地址 0x01)
配置寄存器為 8 位可讀寫寄存器,其位功能分配如下表所示。
B7-B5: 保留,默認(rèn)為 0。
B4-B3: 用來編程 OS 故障隊(duì)列。00 到 11 代表的值為 1、2、4、6,默認(rèn)值為 0。
B2: 用來選擇 OS 極性。B2=0,OS 低電平有效(默認(rèn));B2=1,OS 高電平有效。
B1: 選擇 OS 工作模式。B1=0,配置成比較器模式,直接控制外圍電路;B1=1,OS 控制輸出功能配置成中斷模式,以通知 MCU 進(jìn)行相應(yīng)處理。
B0: 選擇器件工作模式。B0=0,LM75A 處于正常工作模式(默認(rèn));B0=1,LM75A 進(jìn)入關(guān)斷模式。
c)滯后寄存器 Thyst(0x02)
滯后寄存器是讀/寫寄存器,也稱為設(shè)定點(diǎn) ? ?存器,提供了溫度控制范圍的下限溫度。每次轉(zhuǎn)換結(jié)束后,Temp 數(shù)據(jù)(取其高 9 位)將會(huì)與存放在該寄存器中的數(shù)據(jù)相比較,當(dāng)環(huán)境溫度低于此溫度的時(shí)候,LM75BD 將根據(jù)當(dāng)前模式(比較、中斷)控制 ?OS ?引腳作出相應(yīng)反應(yīng)。該寄存器都包含 2 個(gè) 8 位的數(shù)據(jù)字節(jié),但 2 個(gè)字節(jié)中,只有 9 位用來存儲(chǔ)設(shè)定點(diǎn)數(shù)據(jù)(分辨率為 0.5℃的二進(jìn)制補(bǔ)碼),其數(shù)據(jù)格式如下表所示,默認(rèn)為 75℃。
d)超過溫關(guān)斷閾值寄存器 Tos(0x03)
超溫關(guān)斷寄存器提供了溫度控制范圍的上限溫度。每次轉(zhuǎn)換結(jié)束后,Temp 數(shù)據(jù)(取其高 9 位)將會(huì)與存放在該寄存器中的數(shù)據(jù)相比較,當(dāng)環(huán)境溫度高于此溫度的時(shí)候,LM75BD將根據(jù)當(dāng)前模式(比較、中斷)控制 OS 引腳作出相應(yīng)反應(yīng)。其數(shù)據(jù)格式如表 4 所示,默認(rèn)為 80℃。
e)OS 輸出
OS ?輸出為開漏輸出口。為了觀察到這個(gè)輸出的狀態(tài),需要接一個(gè)外部上拉電阻,其阻值應(yīng)當(dāng)足夠大(高達(dá) 200kΩ),以減少溫度讀取誤差。OS 輸出可通過編程配置寄存器的 B2 位設(shè)置為高或低有效。如下圖所示,為 LM75BD在不同模式下 OS 引腳對溫度作出的響應(yīng)。OS 設(shè)為低有效。
可以看出,當(dāng) LM75BD工作在比較器模式時(shí),當(dāng)溫度高于 Tos 時(shí),OS 輸出低電平。此時(shí)采取了降溫措施,啟動(dòng)降溫設(shè)備(如風(fēng)扇),直到溫度再降 ? ?Thyst,則停止降溫,因此在這 ? ?式下,LM75BD可以直接控制外部電路來保持環(huán)境溫度;而在中斷模式,則在溫度高于 Tos 或低于Thyst 時(shí)產(chǎn)生中斷。注意:在中斷式下,只有當(dāng) MCU 對 LM75BD進(jìn)行讀操作后,其中斷信號才會(huì)消失(圖中 OS 變?yōu)楦唠娖剑?/p>
f)I2C 串行接口
在主控器的控制下,LM75BD可以通過 SCL 和 SDA 作為從器件連接到 I2C 總線上。主控器必須提供 SCL 時(shí)鐘信號,可以通過 SDA 讀出器件數(shù)據(jù)或?qū)?shù)據(jù)寫入到器件中。LM75BD從地址(7 位地址)的低 3 位可由地址引腳 A2、A1 和 A0 的邏輯電平來決定。地址的高 4 位預(yù)先設(shè)置為‘1001’。
2.2 ? ?硬件原理圖
如下為開發(fā)板的溫度傳感器 LM75BD 部分原理圖:
LM75 部分原理圖
3程序設(shè)計(jì)
程序設(shè)計(jì)比較簡單,功能是 FPGA 驅(qū)動(dòng) LM75 溫度傳感器不斷地讀取溫度值并送到數(shù)碼管進(jìn)行顯示。
代碼說明:
temp_test.v 是頂層模塊,包含了 i2c_read_lm75,hextobcd 和 smg_interface 模塊;
i2c_read_lm75.v 是 LM75 的溫度讀取模塊,實(shí)時(shí)讀取溫度值;
hextobcd.v 為十六進(jìn)制轉(zhuǎn) BCD 模塊;
smg_interface.v 為數(shù)碼管顯示模塊,在數(shù)碼管上顯示 LM75 的溫度。
信號名 |
方向 |
管腳 |
BANK |
端口說明 |
TEM_SCL |
output |
N2 |
BANK34 |
IIC時(shí)鐘信號線 |
TEM_SDA |
inout |
M3 |
BANK34 |
IIC雙向數(shù)據(jù)線 |
TEM_OS |
input |
P2 |
BANK34 |
超溫輸出 |
4實(shí)驗(yàn)現(xiàn)象
將工程目錄下的bit文件下載至開發(fā)板,8位數(shù)碼管顯示實(shí)際采集到板卡溫度,如下圖所示:
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=223