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