【正点原子FPGA连载】第二十七章DS18B20数字温度传感器实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)實驗平臺:正點原子新起點V2開發(fā)板
2)平臺購買地址:https://detail.tmall.com/item.htm?id=609758951113
2)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/thread-300792-1-1.html
3)對正點原子FPGA感興趣的同學(xué)可以加群討論:994244016
4)關(guān)注正點原子公眾號,獲取最新資料更新
第二十七章DS18B20數(shù)字溫度傳感器實驗
DS18B20是常用的數(shù)字溫度傳感器,其輸出數(shù)字信號來表示溫度,具有體積小,硬件開銷低,抗干擾能力強,精度高的特點,又由于封裝形式多樣,適用于各種狹小空間設(shè)備數(shù)字測溫和控制領(lǐng)域,也可應(yīng)用于鍋爐測溫,機房測溫,農(nóng)業(yè)大棚測溫,潔凈室測溫,彈藥庫測溫等各種非極限溫度場合。本章我們將使用FPGA開發(fā)板學(xué)習(xí)如何使用DS18B20進(jìn)行溫度測量。
本章包括以下幾個部分:
2626.1簡介
26.2實驗任務(wù)
26.3硬件設(shè)計
26.4程序設(shè)計
26.5下載驗證
27.1簡介
溫度傳感器(temperature transducer)是指能感受溫度并轉(zhuǎn)換成可用輸出信號的傳感器,是各種傳感器中最常用的一種。早期使用的是模擬溫度傳感器,如熱敏電阻,隨著環(huán)境溫度的變化,其阻值也隨之發(fā)生變化,用處理器采集電阻兩端的電壓,然后根據(jù)給定的公式就可計算出當(dāng)前環(huán)境溫度。隨著科技的進(jìn)步,現(xiàn)代的溫度傳感器已經(jīng)走向數(shù)字化,外形小,接口簡單,廣泛應(yīng)用在生產(chǎn)實踐的各個領(lǐng)域,為我們的生活提供便利。隨著現(xiàn)代儀器的發(fā)展,微型化、集成化、數(shù)字化正成為傳感器發(fā)展的一個重要方向。美國DALLAS半導(dǎo)體公司推出的數(shù)字化溫度傳感器DS18B20采用單總線協(xié)議,即與FPGA接口僅需占用一個I/O端口,無須任何外部元件,直接將環(huán)境溫度轉(zhuǎn)化成數(shù)字信號,以數(shù)字碼方式串行輸出,從而大大簡化了傳感器與FPGA的接口設(shè)計。
DS18B20測量溫度范圍為-55+125℃,精度為±0.5℃。現(xiàn)場(實時)溫度直接以“單總線”的數(shù)字方式傳輸,大大提高了系統(tǒng)的抗干擾性。它能直接讀出被測溫度,并且可根據(jù)實際要求通過簡單的編程實現(xiàn)9l2位的數(shù)字值讀數(shù)方式。它工作在3~5.5V的電壓范圍,采用多種封裝形式,從而使系統(tǒng)設(shè)計靈活、方便,設(shè)定分辨率及用戶設(shè)定的報警溫度存儲在EEPROM中,掉電后依然保存。其內(nèi)部結(jié)構(gòu)如圖 27.1.1所示:
圖 27.1.1 DS18B20內(nèi)部結(jié)構(gòu)
DS18B20的內(nèi)部結(jié)構(gòu)主要由8部分組成:64位ROM和單線接口、存儲器和控制邏輯、高速緩存器、溫度傳感器、配置寄存器、高溫觸發(fā)器TH、低溫觸發(fā)器TL、8位CRC生成器。那么,FPGA需要怎樣控制才能讓DS18B20工作并將溫度數(shù)據(jù)讀取出來呢?
首先我們來看一下操作DS18B20的命令:
DS18B20的命令分為兩類,分別是ROM功能命令和RAM功能命令。ROM功能命令是對64位ROM進(jìn)行操作。64位ROM的具體內(nèi)容如下圖:
圖 27.1.2 64位ROM內(nèi)容
64位ROM中的序列號是出廠前被光刻好的,它可以看做該DS18B20的地址序列碼。其各位排列順序是:開始8位為產(chǎn)品類型標(biāo)號,接下來48位是該DS18B20自身的序列號,最后8位是前面56位的CRC循環(huán)冗余校驗碼(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一個DS18B20都各不相同,這樣就可以實現(xiàn)一條總線上掛接多個DS18B20的目的。與此對應(yīng)的命令有如下5條:
1)33H:讀ROM
這個命令允許總線控制器(FPGA)讀取DS18B20的8位系列編碼、唯一的序列號和8位CRC碼。只有在總線上存在單只DS18B20的時候才能使用該命令。
7)55H:匹配ROM
發(fā)出此命令之后,接著發(fā)出64位ROM編碼,讓總線控制器(FPGA)在多點總線上定位一只特定的DS18B20。只有和64位ROM序列完全匹配的DS18B20才會做出響應(yīng)。所有和64位ROM序列不匹配的DS18B20都將等待復(fù)位脈沖。這條命令在總線上有單個或多個器件時都可以使用。
8)CCH:跳過ROM
這條命令允許總線控制器(FPGA)不用提供64位ROM編碼就進(jìn)行下一步操作,在單點總線(一個DS18B20)情況下可以節(jié)省時間。如果總線上不止一個從機,在跳過ROM命令之后跟著發(fā)一條讀命令,由于多個從機同時傳送信號,總線上就會發(fā)生數(shù)據(jù)沖突(漏極開路上拉效果相當(dāng)于相與)。
9)F0H:搜索ROM
當(dāng)一個系統(tǒng)初次啟動時,總線控制器可能并不知道總線上有多少器件或它們的64位ROM編碼。搜索ROM命令允許總線控制器用排除法識別總線上的所有DS18B20的64位編碼。
10)ECH:報警搜索命令
發(fā)出此命令后,只有溫度超過設(shè)定值上限或下限的DS18B20才做出響應(yīng)。要注意的是只要DS18B20不掉電,報警狀態(tài)將一直保持,直到再一次測得的溫度值達(dá)不到報警條件為止。
下面介紹以上幾條指令的用法。當(dāng)主機需要對眾多在線DS18B20中的某一個進(jìn)行操作時,首先應(yīng)將主機逐個與DS18B20掛接,讀出其序列號;然后再將所有的DS18B20掛接到總線上,主機發(fā)出匹配ROM命令(55H)之后,主機緊接著提供的64位ROM編碼(包括該DS18B20的48位序列號)之后的操作就是針對該DS18B20。
如果主機只對一個DS18B20進(jìn)行操作,就不需要讀取ROM編碼以及匹配ROM編碼,只要用跳過ROM(CCH命令),就可進(jìn)行下一步對高速緩存器的操作。
主機發(fā)出對ROM的操作命令之后,就進(jìn)一步發(fā)出對RAM的命令。這里的RAM主要是指高速緩存器。我們先了解一下高速緩存器的數(shù)據(jù)結(jié)構(gòu),如下圖所示:
圖 27.1.3 高速緩存器的數(shù)據(jù)結(jié)構(gòu)
由上圖可知DS18B20的高速緩存器共有9個8位寄存器,其中溫度數(shù)據(jù)低位(LSB)對應(yīng)字節(jié)地址0,溫度數(shù)據(jù)高位(MSB)對應(yīng)字節(jié)地址1,以此類推,配置寄存器的字節(jié)地址為4。溫度數(shù)據(jù)存放的格式如下圖:
圖 27.1.4 溫度數(shù)據(jù)格式
DS18B20在出廠時默認(rèn)配置溫度數(shù)據(jù)為12位,其中最高位為符號位,即溫度值共11位,最低四位為小數(shù)位。FPGA在讀取溫度數(shù)據(jù)時,一次會讀2字節(jié)共16位,讀完后將低11位的二進(jìn)制數(shù)轉(zhuǎn)化為十進(jìn)制數(shù)后再乘以0.0625得到所測的實際溫度值。另外還需要判斷溫度的正負(fù),前5個數(shù)字為符號位,這5位同時變化,我們只需要判斷其中任何一位就可以了。前5位為1時,讀取的溫度為負(fù)值,則測到的數(shù)值需要取反加1再乘以0.0625才可得到實際溫度值。前5位為0時,讀取的溫度為正值,只要將測得的數(shù)值乘以0.0625即可得到實際溫度值。
了解了高速緩存器的數(shù)據(jù)結(jié)構(gòu)后,就可以用命令控制高速緩存器。DS18B20具有6條對RAM的命令:
1)44H:溫度轉(zhuǎn)換。
這條命令啟動一次溫度轉(zhuǎn)換。溫度轉(zhuǎn)換命令被執(zhí)行,而后DS18B20保持等待狀態(tài)。如果總線控制器在這條命令之后跟著發(fā)出讀時間隙,而DS18B20又忙于做時間轉(zhuǎn)換的話,DS18B20將在總線上輸出“0”,若溫度轉(zhuǎn)換完成,則輸出“1”。如果使用寄生電源,總線控制器必須在發(fā)出這條命令后立即啟動強上拉,并保持500ms。轉(zhuǎn)換結(jié)果的低位存入BYTE0、高位存入BYTE1。
11)BEH:讀高速緩存器。
這個命令讀取暫存器的內(nèi)容。讀取將從BYTE0開始,一直進(jìn)行下去,直到第9個字節(jié)(BYTE8,CRC)讀完。如果不想讀完所有字節(jié),控制器可以在任何時間發(fā)出復(fù)位命令來終止讀取。另外需要注意的是,字節(jié)內(nèi)容都是最低位先傳送。
12)4EH:寫暫存器。
這個命令向DS18B20的高速緩存器中寫入數(shù)據(jù),開始位置在地址2。接下來寫入的兩個字節(jié)將被存到高速緩存器的字節(jié)地址位2和3的高、低溫觸發(fā)器。可以在任何時刻發(fā)出復(fù)位命令來終止寫入。
13)48H:復(fù)制高速緩存器
這條命令把高速緩存器的內(nèi)容拷貝到DS18B20的E2PROM存儲器中,即把溫度報警觸發(fā)字節(jié)存入非易失性存儲器里。如果總線控制器在這條命令之后跟著發(fā)出讀時間隙,而DS18B20又正在忙于把暫存器拷貝到E2PROM存儲器,DS18B20就會輸出一個“0”,如果拷貝結(jié)束的話,DS18B20則輸出“1”。如果使用寄生電源,總線控制器必須在這條命令發(fā)出后立即起動強上拉并最少保持10ms。
14)B8H:重調(diào)E2PROM
這條命令把E2PROM里的值拷回高速緩存器。這種拷回操作在DS18B20上電時自動執(zhí)行,這樣器件一上電高速緩存器里馬上就存在有效的數(shù)據(jù)了。若在這條命令發(fā)出之后發(fā)出讀時間隙,器件會輸出溫度轉(zhuǎn)換忙的標(biāo)識:“0”=忙,“1”=完成。
15)B4H:讀供電方式
讀DS18B20的供電方式。若把這條命令發(fā)給DS18B20后發(fā)出讀時間隙,器件會返回它的電源模式:“0”=寄生電源,“1”=外部電源。
知道了DS18B20的結(jié)構(gòu)和命令,那么我們該如何發(fā)送命令和接收數(shù)據(jù)呢?
由于DS18B20溫度傳感器采用單總線的方式進(jìn)行通信,因此我們先簡略的介紹一下單總線通信的原理。
單總線傳輸?shù)亩x:顧名思義,即主機和從機用一根總線進(jìn)行通信,是一種半雙工的通信方式,單線=時鐘線+數(shù)據(jù)線+控制線(+電源線)。理想狀況下一條總線上的從器件數(shù)量幾乎不受數(shù)量限制。
單總線技術(shù)具有線路簡單,硬件開銷少,成本低廉,便于總線擴展和維護(hù)等優(yōu)點。但由于只有一根總線,驅(qū)動能力一般較差,不能接過多的從器件,實際使用中,一般最多只能接8個從器件;抗干擾能力較差,一般只能在中短距離的低速傳輸中使用;軟件設(shè)計復(fù)雜,事物往往有兩面性,硬件部分的簡單往往需要軟件在復(fù)雜度上做出犧牲。
單總線傳輸就如同一根獨木橋,行走于獨木橋上的各種信號必須嚴(yán)格遵守通信協(xié)議才能“安全過橋”。接下來我們就簡單的介紹一下數(shù)據(jù)是如何傳輸?shù)摹?br /> 單總線通信協(xié)議為確保數(shù)據(jù)的完整性,定義了如下幾種單線信號類型:復(fù)位脈沖、存在脈沖、寫0、寫1、讀0和讀1。所有這些信號,除存在脈沖外,都是由總線控制器發(fā)出的。
單總線協(xié)議中主機和從機(DS18B20)間的任何通訊都需要以初始化序列開始,初始化序列見下圖。
圖 27.1.5 初始化時序圖
一個復(fù)位脈沖跟著一個存在脈沖表明DS18B20已經(jīng)準(zhǔn)備好發(fā)送和接收數(shù)據(jù)(適當(dāng)?shù)腞OM命令和RAM操作命令)。主機輸出低電平,保持低電平時間至少480us,以產(chǎn)生復(fù)位脈沖。接著主機釋放總線,4.7K的上拉電阻將單總線拉高,延時15~60us,此時DS18B20拉低總線60~240us,以產(chǎn)生低電平存在脈沖以應(yīng)答主機。
初始化完成之后,主機就可以向從機讀寫數(shù)據(jù)。讀寫數(shù)據(jù)涉及到讀寫時隙的概念。在單總線通信協(xié)議中,讀寫時隙的概念十分重要,當(dāng)主機向從機輸出數(shù)據(jù)時產(chǎn)生寫時隙,當(dāng)主機從從機讀取數(shù)據(jù)時產(chǎn)生讀時隙,每一個時隙總線只能傳輸一位數(shù)據(jù)。無論是在讀時隙還是寫時隙,它們都以主機拉低數(shù)據(jù)線開始,數(shù)據(jù)線的下降沿使從設(shè)備觸發(fā)其內(nèi)部的延時電路,使之與主機同步。在寫時隙內(nèi),該延遲電路決定從設(shè)備采樣數(shù)據(jù)線的時間延遲。
單總線通信協(xié)議中寫時隙有兩種:寫1和寫0。主機采用寫1時隙向從機寫入1,而采用寫0時隙向從機寫入0。所有寫時隙至少要60us,且在兩次獨立的寫時隙之間至少需要1us的恢復(fù)時間。兩種寫時隙均起始于主機拉低數(shù)據(jù)總線。產(chǎn)生寫0時隙的方式:在主機拉低數(shù)據(jù)線后,只需要在整個時隙間保持低電平即可(至少60us)。產(chǎn)生1時隙的方式:主機拉低總線后,接著必須在15us之內(nèi)釋放總線,由上拉電阻將總線拉至高電平;在寫時隙開始后15us~60us期間,單總線器件采樣總電平狀態(tài)。如果在此期間采樣值為高電平,則邏輯1寫入器件;如果為0,寫入邏輯0,時隙圖如下圖所示:
圖 27.1.6 寫時隙圖
對于讀時隙,單總線器件僅在主機發(fā)出讀數(shù)據(jù)命令后,才向主機傳輸數(shù)據(jù)。主機發(fā)出讀數(shù)據(jù)命令后,必須馬上產(chǎn)生讀時隙,以便從機能夠傳輸數(shù)據(jù)。所有讀時隙至少需要60us,且在兩次獨立的讀時隙之間至少需要1us的恢復(fù)時間。每個讀時隙都由主機發(fā)起,至少拉低總線1us。在主機發(fā)出讀時隙之后,單總線器件才開始在總線上發(fā)送0或1。若從機發(fā)送1,則保持總線為高電平;若發(fā)出0,則拉低總線。當(dāng)發(fā)送0時,從機在讀時隙結(jié)束后釋放總線,由上拉電阻將總線拉回至空閑高電平狀態(tài)。從機發(fā)出的數(shù)據(jù)在起始時隙之后,保持有效時間15us,因此主機在讀時隙期間必須釋放總線,并且在時隙起始后的15us之內(nèi)采樣總線狀態(tài),時隙圖如下圖所示:
圖 27.1.7 讀時隙圖
在了解了單總線時序之后,我們來看看DS18B20的典型溫度讀取過程,DS18B20的典型溫度讀取過程為:初始化發(fā)跳過ROM命令(CCH)發(fā)開始轉(zhuǎn)換命令(44H)延時初始化發(fā)送跳過ROM命令(CCH)發(fā)讀存儲器命令(BEH)連續(xù)讀出兩個字節(jié)數(shù)據(jù)(即溫度)結(jié)束或開始下一循環(huán)。
27.2實驗任務(wù)
本節(jié)實驗任務(wù)是使用新起點FPGA開發(fā)板通過DS18B20采集溫度,并將采集到的溫度值(帶符號位)用數(shù)碼管顯示。
27.3硬件設(shè)計
DS18B20的引腳圖如下所示:
圖 27.3.1 DS18B20引腳圖
對于DS18B20而言,有兩種供電方式:寄生電源和外部電源供電。
寄生電源供電時DS18B20的GND和VDD引腳都接地,DS18B20從數(shù)據(jù)線DQ上汲取能量:在信號線處于高電平期間把能量存儲在內(nèi)部電容,在信號線處于低電平期間消耗電容上的電能工作,直到高電平到來再給寄生電源(電容)供電。使用這種電路供電時,要想使DS18B20進(jìn)行精確的溫度轉(zhuǎn)換,IO線必須保證在溫度轉(zhuǎn)換期間提供足夠的能量,否則會造成無法轉(zhuǎn)換溫度或者溫度誤差極大。寄生電源供電方式如下圖所示:
圖 27.3.2 寄生電源供電
在外部電源供電方式下,DS18B20工作電源由VDD引腳接入,不存在電源電流不足的問題,可以保證轉(zhuǎn)換精度,同時理論上總線可以掛接任意多個DS18B20傳感器。在使用外部供電方式下,DS18B20的GND引腳不能懸空,否則不能轉(zhuǎn)換溫度。外部電源供電方式是DS18B20最佳的供電方式,穩(wěn)定可靠,抗干擾能力強。外部電源供電方式如下圖所示:
圖 27.3.3 外部電源供電
我們的新起點FPGA開發(fā)板上DS18B20采用外部電源供電,其原理圖如下圖所示:
圖 27.3.4 DS18B20接口原理圖
本實驗中,各端口信號的管腳分配如下表所示:
表 27.3.1 溫度傳感器(DS18B20)數(shù)碼管顯示實驗管腳分配
這里用到的也都是數(shù)碼管的IO所以就不再給出TCL約束文件了,大家可以參考數(shù)碼管實驗的TCL約束文件。
27.4程序設(shè)計
根據(jù)實驗任務(wù),我們可以大致規(guī)劃出系統(tǒng)的工作流程:FPGA控制DS18B20采集溫度數(shù)據(jù),并將收到的溫度數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制顯示在數(shù)碼管上。由此畫出的功能框圖如下圖所示。
圖 27.4.1 溫度傳感器數(shù)碼管顯示系統(tǒng)框圖
程序中各模塊端口及信號連接如下圖所示:
圖 27.4.2 頂層模塊原理圖
FPGA頂層(temp_disp)例化了以下兩個模塊:DS18B20驅(qū)動模塊(ds18b20_dri)和數(shù)碼管動態(tài)顯示模塊(seg_led),實現(xiàn)各模塊間信號的交互。
DS18B20驅(qū)動模塊(ds18b20_dri):搭建單總線通信協(xié)議與DS18B20進(jìn)行通信,并控制DS18B20采集溫度,并將采集到溫度值進(jìn)行處理與輸出。
數(shù)碼管動態(tài)顯示模塊(seg_led):將采集到的溫度值顯示到數(shù)碼管上。
頂層模塊的代碼如下所示:
代碼第10行的POINT參數(shù)用于控制數(shù)碼管小數(shù)點的顯示位置,小數(shù)點顯示在哪一位,哪一位就置“1”,本次實驗保留溫度值的小數(shù)點后兩位,所以其參數(shù)值為“000100”。動態(tài)數(shù)碼管顯示模塊請大家參考“動態(tài)數(shù)碼管顯示實驗”,在該實驗已詳細(xì)介紹。
前面我們講了控制DS18B20讀取溫度的順序,可以發(fā)現(xiàn),DS18B20的讀寫操作很適合使用狀態(tài)機來實現(xiàn),下圖為DS18B20驅(qū)動模塊的狀態(tài)跳轉(zhuǎn)圖。
圖 27.4.3 DS18B20驅(qū)動模塊的狀態(tài)轉(zhuǎn)換圖
DS18B20驅(qū)動模塊使用三段式狀態(tài)機來實現(xiàn)溫度的讀取,從上圖可以比較直觀的看到每個狀態(tài)實現(xiàn)的功能以及跳轉(zhuǎn)到下一個狀態(tài)的條件。首先初始化,初始化完成后,由于單總線上只有一個DS18B20,所以可以跳過DS18B20的身份識別,即發(fā)送跳過ROM命令,進(jìn)入寫字節(jié)狀態(tài),向DS18B20發(fā)送該命令;發(fā)送完該命令后發(fā)送溫度轉(zhuǎn)換命令進(jìn)行溫度轉(zhuǎn)換,狀態(tài)機再次進(jìn)入寫字節(jié)狀態(tài);寫完溫度轉(zhuǎn)換命令后,為了兼容寄生電源供電,進(jìn)入延時狀態(tài)以適當(dāng)?shù)难訒r,延時結(jié)束后,進(jìn)入初始化狀態(tài),初始化完成后發(fā)送跳過ROM命令,進(jìn)入寫字節(jié)狀態(tài);寫完跳過ROM命令后,發(fā)送讀取溫度命令,從DS18B20中讀取溫度數(shù)據(jù),讀取完溫度數(shù)據(jù)后,再次進(jìn)入初始化狀態(tài)以循環(huán)操作。
因為代碼較長,只粘貼了第二段狀態(tài)機組合邏輯狀判斷狀態(tài)轉(zhuǎn)換條件的源代碼,代碼如下:
代碼綜合后的狀態(tài)機如下圖所示,同我們規(guī)劃的狀態(tài)轉(zhuǎn)換相符。
圖 27.4.4 綜合后的狀態(tài)機
27.5下載驗證
首先將DS18B20接插到新起點開發(fā)板上的單總線接口,如下圖所示。然后連接電源線和JTAG并打開電源開關(guān)。
圖 27.5.1 插入DS18B20
接下來我們下載程序,驗證溫度傳感器數(shù)碼管顯示實驗的功能。下載完成后,實驗結(jié)果如下圖所示,數(shù)碼管上顯示讀取到的溫度值,與用室內(nèi)溫度計測量到的溫度值接近,說明溫度傳感器數(shù)碼管顯示實驗下載驗證成功。需要說明的是,下載完成后,開始顯示的是“0.00”,短暫的顯示“0.00”后顯示“85.00”,這過程不超過1秒,然后顯示當(dāng)前環(huán)境溫度值,出現(xiàn)這種現(xiàn)象的原因是在進(jìn)行溫度轉(zhuǎn)換化時有500ms的延時,這500ms的延時是為了兼容寄生電源供電,此時顯示“0.00”,延時結(jié)束后溫度轉(zhuǎn)換并未結(jié)束,此時讀到的溫度值為DS18B20的默認(rèn)值85,故而顯示“85.00”,轉(zhuǎn)換結(jié)束后讀到的值為當(dāng)前環(huán)境溫度值。
圖 27.5.2 實驗結(jié)果
總結(jié)
以上是生活随笔為你收集整理的【正点原子FPGA连载】第二十七章DS18B20数字温度传感器实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 首届波卡黑客松项目「Manta Netw
- 下一篇: 计算机操作系统-3-存储管理