王春玲,王美紅,寧崇森,薛長忠
(泰山學(xué)院物理與電子工程學(xué)院,山東泰安 271021)
溫度是最常見的測量和控制對象.常規(guī)溫度測控系統(tǒng)一般采用熱電阻、熱電偶等傳感器元件,輸出信號(hào)是模擬信號(hào),需要經(jīng)過A/D轉(zhuǎn)換、放大等信號(hào)處理后,送入單片機(jī)、DSP等微控制器中進(jìn)行相應(yīng)數(shù)據(jù)處理,并通過軟件設(shè)計(jì)實(shí)現(xiàn)針對控制對象特征的控制算法,再經(jīng)D/A轉(zhuǎn)換后輸出溫度控制驅(qū)動(dòng)信號(hào),實(shí)現(xiàn)溫度控制.這種溫度測控系統(tǒng)結(jié)構(gòu)的缺陷,首先是硬件組成元件較多,成本較高;其次,信號(hào)在處理過程中抗干擾能力較差,容易失真,造成測控精度偏低;第三,針對不同控制對象,在元器件選用、算法設(shè)計(jì)上都需要單獨(dú)進(jìn)行,設(shè)計(jì)通用性差,難以在線升級(jí).在我們設(shè)計(jì)的小環(huán)境溫控系統(tǒng)中,我們采用并使用FPGA器件替代單片機(jī)進(jìn)行控制,大大簡化了外圍電路的設(shè)計(jì),同時(shí)保證了測量的準(zhǔn)確性,便于功能擴(kuò)展和升級(jí).本文主要闡述FPGA+DS18B20的測溫控制設(shè)計(jì)實(shí)現(xiàn)方法.
小環(huán)境溫控系統(tǒng)面向便攜式設(shè)備需要進(jìn)行設(shè)計(jì),采用直流開關(guān)電源和熱電制冷器件實(shí)現(xiàn)恒溫控制,控制要求較復(fù)雜,對精度和速度要求較高,用戶要求功能可裁剪和升級(jí).為此,我們利用FPGA器件集成度高、體系結(jié)構(gòu)和邏輯單元豐富、靈活、系統(tǒng)功能和結(jié)構(gòu)可重構(gòu)等特點(diǎn),選取了Altera公司高性價(jià)比的颶風(fēng)系列FPGA器件Cyclone EP1C6,其工作電壓為3.3V,內(nèi)核電壓1.5V,內(nèi)嵌兩個(gè)鎖相環(huán)電路,工作頻率高達(dá)200MHz,以簡化設(shè)計(jì),降低成本,并可實(shí)現(xiàn)軟件移植和設(shè)計(jì)升級(jí).
由于空間狹小,溫度場均勻,選用一只DS18B20測溫即可[1].DS18B20是美國DALLAS公司生產(chǎn)的單線數(shù)字溫度傳感器,價(jià)格低廉,體積小.其與控制器之間通信只需一根數(shù)據(jù)線,測量溫度范圍為-55℃到125℃,精度為±0.5℃.與傳統(tǒng)溫度傳感器不同的是,它的溫度轉(zhuǎn)換精度9-12位可編程,直接將溫度轉(zhuǎn)換值以二進(jìn)制碼的方式串行輸出;同時(shí),芯片內(nèi)部將模擬信號(hào)轉(zhuǎn)換為12位數(shù)字量的時(shí)間最大為750ms,對于一般溫控系統(tǒng),完全可以滿足實(shí)時(shí)性需要.
相應(yīng)的硬件電路方案如圖1所示,DS18B20的三個(gè)引腳中,引腳VDD通過濾波電容接3.3V TTL電平,對傳感器供電.引腳DQ是數(shù)據(jù)傳輸線,即一線總線,F(xiàn)PGA通過該引腳控制DS18B20采集溫度.通過一個(gè)4.7KΩ的上拉電阻,使得數(shù)據(jù)線在空閑狀態(tài)下能自動(dòng)上拉為高電平.GND為公共地.
圖1 DS18B20與FPGA的連接電路圖
DS18B20作為單總線數(shù)字測溫器件,其硬件連接簡單,相對地控制過程比較復(fù)雜,時(shí)序要求非常嚴(yán)格.通過對DS18B20功能的分析可知,單片DS18B20的工作流程相對多片系統(tǒng)可以適當(dāng)簡化,其工作流程如圖2所示.
圖2 單片DS18B20的工作控制流程示意圖
由圖2可見,DS18B20的工作流程具有顯著的順序控制和循環(huán)工作特點(diǎn);一個(gè)完整的工作周期分為溫度檢測轉(zhuǎn)換和數(shù)據(jù)傳輸兩大階段;兩個(gè)階段均以初始化開始,并通過主(控)設(shè)備(此處是FPGA)向其(從設(shè)備)發(fā)送ROM命令和功能命令,實(shí)現(xiàn)其工作循環(huán).
ROM命令和功能命令均為字節(jié)型命令.在只有一片DS18B20的情況下,ROM命令只有一個(gè),即跳過ROM命令(SKIP ROM,代碼是CCH),其功能是使主設(shè)備判斷該芯片存在并可以工作.功能命令包括溫度轉(zhuǎn)換指令(CONVERT CMD,代碼是44H)和讀暫存器指令(READ RESULT,代碼是4EH),分別用于啟動(dòng)溫度轉(zhuǎn)換和讀取DS18B20暫存的溫度數(shù)據(jù).
由于DS18B20的單線通信特征,所有操作必須分時(shí)完成,時(shí)隙(Time slot,即完成一位傳輸所用的時(shí)間)是其操作時(shí)序的重要特征和基本時(shí)間單位.主要操作時(shí)隙包括初始化、應(yīng)答、主機(jī)寫0、主機(jī)寫1、主機(jī)讀0、主機(jī)讀1等.除應(yīng)答時(shí)隙外,所有時(shí)隙都由主設(shè)備發(fā)出同步信號(hào),并且發(fā)送所有的命令和數(shù)據(jù)都是字節(jié)的低位在前(這一點(diǎn)與多數(shù)串行通信一般字節(jié)高位在前的格式是不同的).兩個(gè)時(shí)隙之間最小的時(shí)間間隔是1μs.
圖3 為DS18B20的讀寫時(shí)隙
對DS18B20進(jìn)行讀操作時(shí),F(xiàn)PGA先將數(shù)據(jù)線從高電平拉至低電平,進(jìn)入讀時(shí)間隙.FPGA保持低電平1μs以上,然后釋放總線.在讀時(shí)隙的下降沿后15μs之內(nèi),DS18B20會(huì)將數(shù)據(jù)送到總線上.FPGA必須在這15μs之內(nèi)完成讀數(shù).在讀取數(shù)據(jù)結(jié)束時(shí),I/O引腳應(yīng)拉回到高電平.對于主設(shè)備master而言,無論讀入數(shù)據(jù)是1還是0,其本身的操作及時(shí)序相同.
對DS18B20進(jìn)行寫操作時(shí),F(xiàn)PGA先將數(shù)據(jù)線從高電平拉至低電平,進(jìn)入寫時(shí)間隙.15μs之內(nèi),F(xiàn)PGA應(yīng)將數(shù)據(jù)送到總線上,DS18B20在15~60μs內(nèi)對總線采樣.低電平則寫入0,高電平則寫入1,連續(xù)寫入數(shù)據(jù)位的間隙應(yīng)大于1μs.
輸入時(shí)鐘頻率取1MHz,即周期為1μs時(shí),1個(gè)時(shí)隙至少需要60μs,且兩個(gè)時(shí)隙間最小間隔1μs.故可以設(shè)定基本時(shí)隙時(shí)間為70μs,具體如圖3所示.
DS18B20的工作周期和操作時(shí)隙具有顯著的順序控制特征,適于用有限狀態(tài)機(jī)(FSM)實(shí)現(xiàn)[2].實(shí)現(xiàn)DS18B20測溫控制的有限狀態(tài)機(jī)DS18B20_CTRL的狀態(tài)轉(zhuǎn)換圖如圖4所示.
圖4 DS18B20_CTRL的狀態(tài)圖
3.2.1 DS18B20測溫控制狀態(tài)機(jī)DS18B20_CTRL的程序設(shè)計(jì)
DS18B20_CTRL狀態(tài)圖中,定義了11個(gè)狀態(tài),如表1所示.
表1 DS18B20_CTRL狀態(tài)定義
我們用硬件描述語言VHDL編寫該狀態(tài)機(jī)程序.編譯后的原理圖元件符號(hào)如圖5所示.其中clk1μs和rst端口分別是1MHz時(shí)鐘信號(hào)和系統(tǒng)復(fù)位輸入端;dq是與DS18B20單總線的連接線,定義為雙向(INPUT)端口[3];temp_h和temp_l兩個(gè)8位寄存器分別用于存儲(chǔ)接收到的溫度數(shù)據(jù)高低字節(jié).
圖5 DS18B20_CTRL的元件圖
DS18B20_CTRL狀態(tài)機(jī)的設(shè)計(jì)關(guān)鍵有兩點(diǎn):初始化狀態(tài)和三個(gè)8位字節(jié)型命令的執(zhí)行狀態(tài)的設(shè)計(jì).
初始化狀態(tài)根據(jù)其時(shí)序要求,利用一個(gè)計(jì)數(shù)器cnt控制其進(jìn)程.在490μs復(fù)位脈沖后釋放總線(輸出高阻),然后占用190μs以確定DS18B20器件是否存在,并根據(jù)DS18B20器件存在與否決定返回初始化還是進(jìn)入后續(xù)狀態(tài).核心程序段如下:
三個(gè)8位命令即CMD_CC、CMD_44和CMD_BE的執(zhí)行共同點(diǎn)在于均為8位寫入,所以在進(jìn)入其中某一狀態(tài)后均需要轉(zhuǎn)入字節(jié)寫狀態(tài).并且由于寫1和寫0的區(qū)別,需對將要寫入數(shù)據(jù)位的數(shù)據(jù)進(jìn)行判斷,以確定進(jìn)入WRITE_LOW還是WRITE_HIGH狀態(tài).其次,需要設(shè)置一個(gè)寫字節(jié)位數(shù)計(jì)數(shù)器WRITE_BYTE_CNT來控制字節(jié)寫狀態(tài)的結(jié)束.并且考慮到在圖2所示的一個(gè)完整的工作周期中共需要順序執(zhí)行四次8位命令,所以設(shè)置了字節(jié)寫標(biāo)志W(wǎng)RITE_BYTE_FLAG用來控制三個(gè)8位命令的狀態(tài)轉(zhuǎn)換次序.具體程序段如下:
3.2.2 DS18B20測溫控制狀態(tài)機(jī)的仿真結(jié)果分析
選用ALTERA公司EP1C6Q240C8芯片,在QuartusII平臺(tái)上編譯仿真DS18B20_CTRL的結(jié)果如圖6所示.
圖6 DS18B20_CTRL程序仿真結(jié)果
圖6中給出了系統(tǒng)復(fù)位后DS18B20一個(gè)基本完整的工作周期.第一個(gè)初始化狀態(tài)(state.reset=0)后,字節(jié)寫標(biāo)志W(wǎng)RITE_BYTE_FLAG依次從0、1、2加到3,完成四次8位命令的寫入,依次是CMD_CC→CMD_44→CMD_CC→CMD_BE,完成溫度采集與轉(zhuǎn)換;然后,即可讀入測得溫度數(shù)據(jù),經(jīng)過12個(gè)位讀狀態(tài)(GET_TMP_CNT從1遞增至12),將12位溫度數(shù)據(jù)格式轉(zhuǎn)換后存入兩個(gè)字節(jié)型寄存器temp_l和temp_h.注意圖中4個(gè)8位命令字均為從低位到高位的格式寫入,作為總線輸出寄存器的dq_result以粗實(shí)線表示高阻態(tài).
本文在對單總線數(shù)字溫度傳感器DS18B20進(jìn)行時(shí)序分析的基礎(chǔ)上,完成了利用FPGA控制DS18B20實(shí)現(xiàn)溫度數(shù)據(jù)采集的軟硬件設(shè)計(jì),重點(diǎn)剖析了采用有限狀態(tài)機(jī)方法進(jìn)行程序設(shè)計(jì)的關(guān)鍵點(diǎn),仿真結(jié)果驗(yàn)證了設(shè)計(jì)的可行性.考慮到本設(shè)計(jì)采用的狀態(tài)個(gè)數(shù)達(dá)11個(gè),可以進(jìn)一步采用層次狀態(tài)機(jī)的方法對其加以改進(jìn).
[1]袁偉亭,周潤景.FPGA與DS18B20組成的測溫系統(tǒng)的設(shè)計(jì)[J].內(nèi)蒙古大學(xué)學(xué)報(bào)(自然科學(xué)版),2006,37(7):459-463.
[2]王曉磊,李宏生.基于有限狀態(tài)機(jī)的數(shù)字溫度傳感器控制系統(tǒng)設(shè)計(jì)[J].艦船電子工程,2010,30(12):182-185.
[3]穆振海.基于FPGA的智能溫度采集控制器[J].微計(jì)算機(jī)信息(嵌入式與 SOC),2008,7(20):225-243.