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

DS18B20溫度傳感器是什么
DS18B20溫度傳感器實驗
智能溫度傳感器DS18B20的原理與應用
DS18B20溫度傳感器的溫度程序和驅動以及案例實現資料說明

ds18b20的特性_ds18b20溫度傳感器應用

評論