本篇主要討論基于FPGA的溫度傳感器(ds18b20)驅(qū)動(dòng)設(shè)計(jì)---第一版
設(shè)計(jì)實(shí)現(xiàn):利用FPGA驅(qū)動(dòng)DS18b20,讀取到溫度數(shù)值顯示到數(shù)碼管上。
首先介紹DS18b20。
DS18B20是常用的數(shù)字溫度傳感器,其輸出的是數(shù)字信號(hào),具有體積小,硬件開銷低,抗干擾能力強(qiáng),精度高的特點(diǎn)。
DS18B20 數(shù)字溫度計(jì)提供 9-12位攝氏溫度測量(9-12位是測量精度),它的測溫范圍為-55~+125℃。
可編程的分辨率為9-12位,對(duì)應(yīng)的分辨率溫度分別為0.5度、0.25度、0.125度、0.0625度。 測量溫度是需要轉(zhuǎn)換時(shí)間的(將外界的問題轉(zhuǎn)換為數(shù)字量),9bit的精度需要最大93.75ms;10bit的精度需要最大187.5ms;11bit的精度需要最大375ms;12bit的精度需要最大750ms。 上電后,默認(rèn)的精度為12位,我們一般也采用這個(gè)精度。如果覺得這個(gè)轉(zhuǎn)換時(shí)間較長,可以考慮配置為其他的精度。
每個(gè)DS18B20都有一個(gè)獨(dú)特的64位序列號(hào),從而允許多只 DS18B20同時(shí)連在一根單線總線上;因此很簡單就可以用一個(gè)微控制器去控制很多覆蓋在一大片區(qū)域的DS18B20。這一特性在HVAC環(huán)境控制、探測建筑物、儀器或機(jī)器的溫度以及過程監(jiān)測和控制等方面非常有用。
通過上述實(shí)物圖可以看到,DS18B20有三個(gè)管腳,VDD(電源管腳),DQ(數(shù)據(jù)線),GND(地線)。 在使用時(shí),也可以不通過VDD供電,而采用DQ供電(此種模式在此不再介紹)。 在平常使用時(shí),VDD接電源3V~5V,GND接地,DQ上面需要接一個(gè)上拉電阻(阻值通常為4.7K,或者10K),DQ就是進(jìn)行通信的數(shù)據(jù)線(單數(shù)據(jù)總線)。 了解了使用的電路特性后,就得琢磨一下,如何利用一個(gè)數(shù)據(jù)線DQ來進(jìn)行控制這個(gè)溫度傳感器。 下圖是DS18B20的框圖:
64bit的rom中的數(shù)值時(shí)固定的。高八位為:28h(表示為DS18b20);后續(xù)的48位為:芯片的序列號(hào)(每一個(gè)DS18B20都不相同);最后八位:前面56位的CRC校驗(yàn)序列。 DS18B20支持在一個(gè)總線上面加載多個(gè)DS18B20,那么此時(shí)就需要獲取每一個(gè)DS18B20的ROM,這樣就可以精準(zhǔn)的控制每一個(gè)器件了。 在此我們不對(duì)在一個(gè)總線上加載多個(gè)DS18B20的情況,只討論加載一個(gè)DS18B20的情況。 讀取ROM的64bit的命令為33H,后面跟著讀取64bit,就是器件的ROM值(只能用在總線上只有一個(gè)器件的情況)。 匹配ROM的命令為55H,后面跟著寫入64bit數(shù)據(jù),只有和這64bit的數(shù)據(jù)相同的器件才會(huì)開始工作。 跳過ROM的命令為CCH,接收到這個(gè)命令的器件,不需要匹配就可以直接工作(只能用在總線上只有一個(gè)器件的情況)。 在此我們不做多器件的情況,所以可以直接發(fā)送跳過ROM的命令。 DS18B20的測溫是需要被通知的,也就說我們需要給器件發(fā)送一個(gè)開始測溫的命令,他才會(huì)開始測量溫度,并且轉(zhuǎn)換稱為數(shù)字信號(hào)(16bit的有符號(hào)數(shù))。 分頻率為12位,使用16bit后面的12位(11:0)。 分頻率為11位,則16bit的最后一個(gè)bit不使用(11:1)。 ······
上圖為默認(rèn)精度(12bit、0.0625度),如果第12位為0,表示為正溫度,測量出來的數(shù)據(jù)乘以0.0625就可以了。如果第12為1,表示為負(fù)溫度,則需要將測量出來的數(shù)據(jù)減去1,然后所有位取反,得到的結(jié)果再乘以0.0625度。上述的表示方式就是有符號(hào)數(shù)在數(shù)字電路中的表示形式。 16bit的數(shù)字信息存儲(chǔ)在內(nèi)部暫存器中,占用兩個(gè)字節(jié)(在0、1字節(jié))。
測溫的命令為44H。 暫存器的第四個(gè)4字節(jié)就是配置分辨率的寄存器。
TM設(shè)置為0即可;
可以通過配置這個(gè)寄存器的值,來配置我們想要的分辨率。在此,我將不配置此寄存器,使用默認(rèn)分辨率12bit。 寫入暫存器的命令為4EH,后面跟著寫入3個(gè)字節(jié)的數(shù)據(jù),這三個(gè)字節(jié)寫入到暫存器的2、3、4的位置。 讀出暫存器的命令為BEH,后面跟著讀出N個(gè)字節(jié)的數(shù)據(jù),如果只是想讀取溫度,那么只需要讀出兩個(gè)字節(jié)的數(shù)據(jù)就可以了。 基本的命令差不多都介紹完事了,那么下面開始介紹時(shí)序。 首先:在發(fā)送命令之前,器件要求必須要被初始化。時(shí)序如下:
控制器需要拉低DQ,至少保持480us(最大不超過960us,建議:600us),然后釋放總線控制(由于DQ被上拉,所以會(huì)被拉成高電平)。如果器件存在并且可以正常工作,器件會(huì)拉低DQ一段時(shí)間60-240us。 所以建議:控制器拉低DQ960us,釋放總線控制,檢測DQ是否還會(huì)拉低。主機(jī)從釋放總線控制開始,要等待600us的時(shí)間去檢測DQ是否拉低,如果有拉低則證明器件存在并且可以工作,如果沒有拉低,則證明器件不存在或者不可以工作。 證明器件存在并且可以工作后,我們就可以向器件發(fā)送命令了。 發(fā)送命令和和數(shù)據(jù)以低位優(yōu)先。 發(fā)送1bit的時(shí)序?yàn)椋?
如果控制器想要發(fā)送1bit0,那么直接拉低DQ100us即可,然后釋放總線;如果控制器想要發(fā)送1bit1,那么拉低DQ5us,然后釋放總線即可。無論是寫0,還是寫1,建議每一bit的時(shí)長110us。 讀取命令和數(shù)據(jù)以低位優(yōu)先。 讀取1bit的時(shí)序?yàn)椋?
如果控制器想要讀取的話,那么拉低DQ5us的時(shí)間,釋放總線,在10us時(shí),讀取總線的電平值即可獲得讀取值。建議每一bit的時(shí)長110us。 實(shí)現(xiàn)DS18B20的驅(qū)動(dòng)主要有三步: 第一步:初始化DS18B20; 第二步:ROM命令(緊跟任何數(shù)據(jù)交換請(qǐng)求); 第三步:DS18B20功能命令(緊跟任何數(shù)據(jù)交換請(qǐng)求); 所以我們上電后,工作的過程如下: 初始化、發(fā)送跳過ROM命令 、發(fā)送轉(zhuǎn)換溫度命令;等待750ms;初始化、發(fā)送跳過ROM命令、發(fā)送讀取暫存器的命令、讀取兩個(gè)字節(jié)的數(shù)據(jù)。不斷重復(fù)以上的過程即可。 上面的工作方式模式為:總線上是一個(gè)器件、分辨率為默認(rèn)的12bit、沒有匹配ROM。 DS18B20一般會(huì)制作到一個(gè)板卡上面,下面是筆者自制的板卡;
如果有需要的小伙伴,可以點(diǎn)擊下面的鏈接:
https://item.taobao.com/item.htm?ft=t&id=862024382902設(shè)計(jì)實(shí)現(xiàn):利用FPGA驅(qū)動(dòng)DS18b20,讀取到溫度數(shù)值顯示到數(shù)碼管上。
1. 溫度傳感器為DS18B20。
2. 總線上只有一個(gè)器件、溫度分辨率為12bit(默認(rèn))、跳過ROM指令。
3. 將溫度顯示到數(shù)碼管上。
4. 溫度精確到小數(shù)點(diǎn)后2位。
5. 數(shù)碼管共計(jì)6個(gè),最前面顯示是否為負(fù)溫度(不顯示為正溫度,顯示一橫杠為負(fù)溫度)。
6. 數(shù)碼管共計(jì)6個(gè),后面五個(gè)顯示溫度,前面三個(gè)顯示整數(shù)、后面兩個(gè)顯示小數(shù)。
7. 數(shù)碼管共計(jì)6個(gè),整數(shù)與小數(shù)中間點(diǎn)亮小數(shù)點(diǎn)。
8. 利用LED顯示是否初始化成功,LED點(diǎn)亮表示初始化成功,LED熄滅表示初始化失敗。
使用平臺(tái):本次設(shè)計(jì)應(yīng)用Altera的平臺(tái)設(shè)計(jì)(芯片:EP4CE10F17C8)、使用的DS18B20板卡為市面上常見的,如果沒有的同學(xué),可以聯(lián)系筆者購買。
開發(fā)軟件:quartus 18.0
開發(fā)語言:Verilog HDL
作者QQ:746833924
說明:本篇設(shè)計(jì)中不涉及到ip電路,如果在其他平臺(tái),rtl代碼依然可以適用,當(dāng)其他板卡電路不同時(shí),會(huì)導(dǎo)致不同的現(xiàn)象出現(xiàn),如有需要修改代碼請(qǐng)聯(lián)系作者;如需作者使用的板卡,請(qǐng)聯(lián)系作者;
設(shè)計(jì)思想如下:
ds18b20_drive模塊的功能為驅(qū)動(dòng)ds18b20,獲取溫度,并且輸出符號(hào)和溫度的BCD碼;seven_tube_drive模塊的功能將符號(hào)和溫度的BCD碼輸出,并且在右側(cè)第三個(gè)數(shù)碼管點(diǎn)亮小數(shù)點(diǎn)用以區(qū)分整數(shù)和小數(shù)。 ds18b20_drive模塊采用狀態(tài)機(jī)的方式實(shí)現(xiàn)。 讀取到溫度信息后,轉(zhuǎn)換為BCD碼輸出; 首先判斷溫度的正負(fù)性,然后計(jì)算它的絕對(duì)值。 絕對(duì)值要乘以0.0625,此時(shí)乘以625,相當(dāng)于擴(kuò)大了10000倍,然后除以100,則表示擴(kuò)大了100倍(因?yàn)槲覀冃枰A魞晌恍?shù) ,正好擴(kuò)大100倍使小數(shù)都變成了整數(shù))。
if(data_r[12] ==1'b1) begin temp_sign <= 4'he; ? ? ? ? ? data_1 = (~(data_r -?1'b1)) * 16'd625 /7'd100; ? ? ? ? end ? ? ? else begin ? ? ? ? ? temp_sign <= 4'hf; ? ? ? ? ? data_1 <= (data_r *?16'd625) /7'd100; ? ? ??end
數(shù)碼管驅(qū)動(dòng)采用最基本動(dòng)態(tài)驅(qū)動(dòng)即可,在此不做介紹;
相關(guān)參考代碼為:
通過網(wǎng)盤分享的文件:溫度傳感器DS18b20驅(qū)動(dòng)--第一版 鏈接: https://pan.baidu.com/s/1es-KpmP4PqZbaR76kTDlYA?pwd=vins 提取碼: vins
-
FPGA
+關(guān)注
關(guān)注
1630文章
21776瀏覽量
604679 -
溫度傳感器
+關(guān)注
關(guān)注
48文章
2961瀏覽量
156233 -
DS18B20
+關(guān)注
關(guān)注
10文章
780瀏覽量
80983
原文標(biāo)題:基于FPGA的溫度傳感器(ds18b20)驅(qū)動(dòng)設(shè)計(jì)
文章出處:【微信號(hào):HXSLH1010101010,微信公眾號(hào):FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論