<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于FPGA的數(shù)字溫度測量儀設計

          基于FPGA的數(shù)字溫度測量儀設計

          作者: 時間:2017-06-05 來源:網(wǎng)絡 收藏

          0 引言

          溫度作為一種最基本的環(huán)境參數(shù),與人民的生活有著密切關系。溫度的測量和控制在工業(yè)、農(nóng)業(yè)、國防、醫(yī)療等各個領域中應用普遍。溫度測量儀是利用物質(zhì)各種物理性質(zhì)隨溫度變化的規(guī)律,把溫度轉(zhuǎn)換為電量并顯示的一種儀器,有著廣泛的適用范圍。

          本文利用器件與DS18B20設計實現(xiàn)了一種數(shù)字溫度測量儀,用于檢測室溫。與其它系統(tǒng)相比較,此測量儀具有結構簡單、抗干擾能力強、精確性高、轉(zhuǎn)換速度快、擴展性好等優(yōu)點。

          本文引用地址:http://www.ex-cimer.com/article/201706/348911.htm

          1 軟件程序設計

          根據(jù)系統(tǒng)的設計要求,將程序部分設計分為5個模塊,包括分頻模塊、DS18B20通信模塊、控制模塊、數(shù)制轉(zhuǎn)換模塊、顯示模塊,如圖1所示。利用語言在QuartusII開發(fā)平臺上完成程序設計。



          1.1 分頻模塊

          分頻模塊是設計項目中的基本模塊之一。針對50MHz的時鐘頻率進行分頻產(chǎn)生1MHz頻率信號,分頻模塊如圖2所示。

          系統(tǒng)提時鐘信號進入分頻模塊clock引腳,經(jīng)過分頻后得到信號從clk 1m輸出。分頻模塊仿真結果如圖3所示。
          由圖3可知,輸入端的50MHz時鐘信號被50分頻后得到輸出端的1MHz信號。

          1.2 DS18B20通信模塊

          圖4中時鐘clock為輸入端口,DS18820數(shù)據(jù)總線口dq[0..0]為雙向端口,使能端enable為輸出端口,led[11..1]為測試時的指示端口,在實際操作中無需接出。

          DS18B20采用一根I/O總線讀寫數(shù)據(jù),因此它對讀寫數(shù)據(jù)位有嚴格的時序要求,如圖5所示。

          從分頻模塊的clk_1m輸出1MHz到通信模塊的clock作為時鐘信號;根據(jù)DS18B20所遵循的初始化時序、讀時序、寫時序等通信協(xié)議將程序完成;將獲取的12位的溫度信號傳送給下一個模塊。

          1.3 控制模塊

          通過控制模塊,將從DS18B20讀取的二進制溫度信息傳給數(shù)制轉(zhuǎn)換模塊,如圖6所示。

          程序中設定了三個狀態(tài)(清除clear、使能enable、顯示display),當ena為‘1’時,狀態(tài)從顯示轉(zhuǎn)到清除;ena為‘0’時,狀態(tài)一直為顯示,把輸入數(shù)據(jù)win[11..1]從輸出端口wout[11..1]輸出到下一模塊,之間的轉(zhuǎn)換關系如圖7所示。

          控制模塊仿真結果如圖8所示。

          圖8中,clock輸入為1 MHz信號,經(jīng)過500分頻后,得到頻率為1kHz的信號clk lk,此時累加器cnt0為‘0’。當cnt0為‘1’時,系統(tǒng)狀態(tài)由原來的清除狀態(tài)轉(zhuǎn)變?yōu)槭鼓軤顟B(tài),此時enb為‘1’,cnt0進行累加;當cnt0=‘1’時,系統(tǒng)狀態(tài)從使能狀態(tài)轉(zhuǎn)變到顯示狀態(tài),系統(tǒng)就把win[11..1]輸入的數(shù)據(jù)通過wout[11..1]輸出到下一模塊。

          1.4 數(shù)制轉(zhuǎn)換模塊

          利用數(shù)制轉(zhuǎn)換模塊將輸入的11位二進制的溫度數(shù)據(jù)轉(zhuǎn)換為3位十進制表示,如圖9所示。

          圖9中,clear為清零輸入端口,enable為使能輸入端口,indata[11..1]為數(shù)據(jù)輸入端口,b1『3..0]、b2[3..0]、b3[3..0]為三個輸出端口。如果clear輸入信號為‘1’時,程序?qū)⑶宄龝捍婕拇嫫髦袛?shù)據(jù);反之則不清除。enable輸入信號出現(xiàn)上升沿時,程序開始進行數(shù)制轉(zhuǎn)換,并通過b1[3..0]、b2[3..0]、b3[3..0]端口將得到的十進制數(shù)輸出到相應的顯示模塊中。數(shù)制轉(zhuǎn)換模塊仿真見圖10。

          由圖10知,輸入數(shù)據(jù)為“010011 10000”,clear端為低電平,當enable信號有上升沿時,數(shù)據(jù)開始轉(zhuǎn)換。轉(zhuǎn)換后數(shù)據(jù)為b1=0、b2=9、b3=3,符合設計值。

          1.5 顯示模塊

          從數(shù)制轉(zhuǎn)換模塊輸出的十進制數(shù)接入到顯示模塊中,將其譯碼為七段值,輸出到共陰數(shù)碼管上顯示,模塊如圖11所示。

          由圖12可知,當輸入為0時,輸出為“1111110”;當輸入為1時,輸出為“0000110”;當輸入為2時,輸出為“1101101”;當輸入為3時,輸出為“1111001”等,在七段數(shù)碼管上正好顯示相同數(shù)字,表明所編寫的程序正確。


          1.6 總體電路框圖

          整體電路圖如圖13所示。

          輸入50MHz信號接入分頻模塊的clock端口,經(jīng)過分頻后的信號輸入到DS18B20通信和數(shù)制轉(zhuǎn)換模塊的clock端,作為模塊的時鐘信號。DS 18B20將測得的溫度數(shù)據(jù)傳給控制模塊的win[11..1],通過數(shù)制轉(zhuǎn)換模塊將數(shù)據(jù)轉(zhuǎn)換為3位十進制表示,最后利用顯示模塊譯碼后由共陰數(shù)碼管顯示。

          2 硬件電路設計

          設計采用器件和DS18B20實現(xiàn)溫度測量儀,F(xiàn)PGA電路板主要由FPGA器件、時鐘電路、下載電路、電源電路、顯示電路、指示燈和按鍵等構成。核心芯片采用ALTERA公司生產(chǎn)的CycloneII系列EP2C5T144C8芯片。在設計部分時,由于DS18B20進行精確轉(zhuǎn)換時需要I/O引腳保持大電流供電,這樣對FPGA芯片引腳造成很大壓力,所以要使DS18B20的VDD引腳接外部電源。電路框圖如圖14所示。


          3 下載調(diào)試


          選擇下載FPGA芯片為EP2C5T144C8,在菜單中選擇Pins項設定引腳,在彈出的窗口中設置好各個輸入輸出端與硬件相對應的引腳,并編譯通過。

          將FPGA的下載數(shù)據(jù)線一端連接FPGA電路板,一端接計算機USB口,在命令欄里Programmer項,在彈出的窗口中選擇Hardware Setup,確認計算機已與DE2板連接好后,點擊Start開始下載運行。

          連接好DS18B20電路,即可測量室內(nèi)溫度,實物電路圖如圖15所示。由實測知,當前室溫為24.2℃。

          4 結束語

          本文利用FPGA與DS18B20設計并實現(xiàn)了一種用于檢測室溫的簡易的數(shù)字溫度測量儀。在QuartusII開發(fā)平臺上,利用語言完成軟件程序設計,并完成硬件電路板設計,最后下載驗證。實現(xiàn)的測量儀具有結構簡單、測量精確性高、使用方便、擴展性能好的優(yōu)點。



          關鍵詞: 溫度傳感器 VHDL FPGA

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();