wwe狂野角斗士直播

8、STM32_DS18B20_分析及實驗

目錄

1、DS18B20介紹

2、DS18B20的內部結構

3、DS18B20的內部存儲器

4、DS18B20控制流程

5、程序中我們對溫度測量的處理

PS:  ROM操作命令  和  RAM指令

1、DS18B20介紹

DS18B20是美國DALLAS公司推出的一款單線數字溫度傳感器。它具有:體積小,功耗低,精度高,可靠性好,易于單片機接口等優點,每片DS18B20都有唯一的一個可讀出的序列號,同時DS18B20還采用了寄生電源技術,可以不用外接電源。綜合以上特點,DS18B20特別適合于多點測溫系統。

DS18B20主要有以下特點:

●單線接口:DS18B20與單片機連接時僅需一根I/O口線即可實現單片機與DS18B20之間的雙向通信。

●實際使用中不需要任何外圍元件。

●可用數據線供電,電壓范圍3.0-5.5V。測溫范圍-55-+125oC。

●可編程實現9-12位的數字讀數方式。

●用戶可設定的非易失性(掉電不丟失)的溫度上下線報警值。

●支持多點組網功能,多個DS18B20可并聯在唯一的三總線上,實現多點溫度測量。

●負壓特性:電源極性接反時不會燒壞DS18B20,但是也不能正常工作

 

TO-92封裝的DS18B20的引腳排列見上圖。

DS18B20引腳定義: 

(1)DQ為數字信號輸入/輸出端;

開漏單總線接口引腳。當被用著在寄生電源下,也可以向器件提供電源。 

(2)GND為電源地; 

(3)VDD為外接供電電源輸入端,當工作于寄生電源時,此引腳必須接地。

電路和連接:

 

串口電路前面已經介紹,本例中不再重復。本例中DS18B20與單片機的連接如圖所示,由于DS18B20的數據線要求空閑狀態為高電平,所以我在DS18B20的數據線與電源線VCC之間加了一個4.7K的上拉電阻,如果不想接上拉電阻的話,可以使能PA2口的內部上拉功能。從圖中可以看出,本例使用的是給DS18B20外接電源的方式。

 

 

2、DS18B20的內部結構

DS18B20的內部結構如圖7.1.2。DS18B20的內部結構主要有64位ROM、溫度靈敏元件、內部存儲器和配置寄存器四部分組成。

 

     圖7.1.2  DS18B20的內部結構

● 64位ROM:64位ROM的內容是64位序列號,是出廠前用激光刻好的。它可以用作該DS18B20的地址序列碼。每一個DS18B20的64位ROM都不同,這樣就可以實現一根總線上掛多個DS18B20的目的。這64位 ROM的排列是:開始8位是產品類型號,接著的48位是該DS18B20的自身的序列號,最后8位是前面56位的循環冗余(CRC,CRC=X8+X5+X4+1)校驗碼。

● 溫度靈敏元件:溫度靈敏元件完成對溫度的測量,測量后的結果存儲在兩個8位的寄存器中,這兩個寄存器定義如圖7.1.3。溫度寄存器高字節的高5位是符號位,溫度為負時這5位為1;溫度為正時,這5位為0。高字節寄存器的低3位與低字節寄存器的高4位組成溫度的整數部分,低字節寄存器的低4位是溫度的小數部分。當溫度大于0時,溫度值以原碼存放。而當溫度小于0時,以二進制補碼形式存放。

   當轉換位數為12位時,溫度的精度為1/16(4位小數位,所以為16)=0.0625度。同理,當轉換位數為11位時,精度為1/8=0.125度。

   對于溫度的計算,以12位轉換位數為例:對于正的溫度,只要將測到的數值的整數部分取出,轉換為10進制,再將小數部分乘以0.0625就可以得到10進制的小數位的溫度值了。而對于負的溫度,則需要將采集到的數值取反加1,即可得到實際溫度的16進制表示。再按照正溫度的計算方法就可以得出10進制的負的溫度了。

  

              圖7.1.3 DS18B20溫度寄存器格式

   圖7.1.4所示是在12位轉換位數情況下的溫度轉換值和溫度對照表

 

               圖7.1.4  12位轉換位數的溫度轉換值和溫度對照表

 

兩種供電方式:

 

 

使用寄生電源方式時,VDD 引腳必須接地。

VDD 引腳接入一個外部電源

接電源有點:

1、這樣做的好處是 I/O線上不需要加強上拉,而且總線控制器不用在溫度轉換期間總保持高電平。這樣在轉換期間可以允許在單線總線上進行其他數據往來。

2、另外,在單線總線上可以掛任意多片 DS18B20,而且如果它們都使用外部電源的話,就可以先發一個Skip ROM 命令,再接一個 Convert T命令,讓它們同時進行溫度轉換。

注意:

1、在外部供電的方式下,DS18B20的GND引腳不能懸空,否則不能轉換溫度,讀取的溫度總是85℃。

2、溫度高于 100℃時, 不推薦使用寄生電源, 因為DS18B20 在這種溫度下表現出的漏電流比較大,通訊可能無法進行。

在類似這種溫度的情況下,強烈推薦使用 DS18B20 的 VDD 引腳。

 

 

 

 

 

 

 

 3、DS18B20的內部存儲器

DS18B20的內部存儲器包括一個告訴暫存RAM和一個非易失性的可電擦除的EEPROM,后者存放溫度的上下限報警值和配置寄存器。

高速暫存RAM以及EEPROM的構成如圖7.1.5所示。高速暫存RAM由9個字節組成,當溫度轉換命令發出后,經轉換獲得的溫度值以二進制補碼形式存放在第0(LSB)和第一(MSB)個字節內。單片機通過單線接口DQ讀出該數據,讀取時低位在前,高位在后。

 

第二和第三個字節是溫度的上(TH)下限(TL)報警值,他們沒有小數位,第四個字節是配置寄存器,主要用以設置工作模式和轉換位數。

第五、第六和第七字節是保留位,沒有實際意義,第八個字節是前面所有8個字節的CRC校驗碼。

 

EEPROM由3個字節構成,用來存放溫度的上下限報警值以及配置寄存器的內容。

 

圖7.1.5    高速暫存RAM以及EEPROM的構成

 

   配置寄存器的各位意義如圖7.1.6所示。低五位的讀出值總是為1,第7位是測試模式位,用于設置DS18B20是工作在測試模式還是工作模式,出廠時默認設置為0,用戶不用改動。R1和R0用來設置溫度轉換位數。具體設置如圖7.1.7所示。

 

                  圖7.1.6  配置寄存器結構

 

                    圖7.1.7  溫度值轉換位數設置表

 

4、  DS18B20控制流程

在由DS18B20構成的單總線系統中,DS18B20只能作為從機,單片機或者其它部件作為主機。

       根據DS18B20的通信協議,主機控制DS18B20完成一次溫度轉換必須經過3個步驟:

       一)、每次讀寫之前都要對DS18B20進行復位操作

       二)、復位成功后發送一條ROM指令 (器件尋址)

       三)、最后發送RAM指令,這樣才能夠對DS18B20進行正確的操作。

● 復位:復位要求主機將數據線拉低最少480us,然后釋放,當DS18B20受到信號后,等待15-60us,然后把總線拉低60-240us,主機接收到此信號表示復位成功。

● ROM指令:ROM指令表明了主機尋址一個或多個DS18B20中的某個或某幾個,或者是讀取某個DS18B20的64位序列號。

● RAM指令:RAM指令用于主機對DS18B20內部RAM的操作(如啟動溫度轉換、讀取溫度等)。

 

直入正題:

DS18B20的操作時序(本人查看數據手冊和網上的例程,然后結合實際測試結果)

  1、DS18B20的初始化

  (1) 先將數據線置高電平“1”。

  (2) 延時(該時間要求的不是很嚴格,但是盡可能的短一點)。

  (3) 數據線拉到低電平“0”。

  (4) 延時490微秒(該時間的時間范圍可以從480到960微秒)。

  (5) 數據線拉到高電平“1”。

  (6) 延時等待(如果初始化成功則在15到60毫秒時間之內產生一個由DS18B20所返回的低電平“0”。據該狀態可以來確定它的存在,但是應注意不能無限的進行等待,不然會使程序進入死循環,所以要進行超時控制)。

  (7) 若CPU讀到了數據線上的低電平“0”后,還要做延時,其延時的時間從發出的高電平算起(第(5)步的時間算起)最少要480微秒。

  (8) 將數據線再次拉高到高電平“1”后結束。  

  2、DS18B20的寫操作

  (1) 數據線先置低電平“0”。

  (2) 延時確定的時間為2(小于15)微秒。

  (3) 按從低位到高位的順序發送字節(一次只發送一位)。

  (4) 延時時間為62(大于60)微秒。

  (5) 將數據線拉到高電平,延時2(小于15)微秒。

  (6) 重復上(1)到(6)的操作直到所有的字節全部發送完為止。

  (7) 最后將數據線拉高。  

  3、 DS18B20的讀操作

  (1)將數據線拉高“1”。

  (2)延時2微秒。

  (3)將數據線拉低“0”。

  (4)延時2(小于15)微秒。

  (5)將數據線拉高“1”,同時端口應為輸入狀態。

  (6)延時4(小于15)微秒。

  (7)讀數據線的狀態得到1個狀態位,并進行數據處理。

  (8)延時62(大于60)微秒。

  

暢學STM32串口顯示程序:

復位:

 

溫度傳感器檢測:

 

 

寫操作:

 

讀操作:

讀一個位:

 

 

讀一個字節:

 

 

 

1、DS18B20的初始化

2、DS18B20的寫操作

3、DS18B20的讀操作

 

1、過程1、2是初始化過程,每次讀取都要初始化,否則18b20處于待機狀態,無法成功讀取。

過程1:拉低信號線480-700us,使它復位,然后釋放總線15-60us,

18b20會拉低總線60-240us,然后它釋放總線。所以初始化成功的一個標志就是能否讀到18b20這個先低后高的操作時序。

注意:黑色部分表示主機操作,藍色部分表示18b20操作,每次主機操作完成之后等待18b20狀態時,必須要釋放總線,比如將IO設置為高阻態什么的。否則18B20沒法把狀態寫到線上

2、過程3、4是寫1bit數據過程。過程3是寫0 ,過程4是寫1。

過程3:拉低總線60us,然后抬高總線5us,完成。

過程4:拉低總線5us,然后抬高總線60us,完成

3、過程5、6是讀1bit過程。過程5是讀0,過程6是讀1。

過程5、6:拉低總線5us,然后釋放總線,讀取總線,如果為0,則讀入0,如果為1,則讀入1。

 

 

5、程序中我們對溫度測量的處理是:

1)復位(假定復位成功,不檢測復位是否成功),

2)發送跳過ROM指令(我們系統只連接了一個DS18B20,所以可以使用這條指令),

3)發送溫度轉換命令(我們采用DS18B20默認的12位溫度轉換,所以不用對DS18B20進行任何配置,直接指示DS18B20開始采集溫度),

4)延時1S,等待DS18B20完成溫度采集(默認12位溫度轉換時,采集一次溫度的時間為750ms,所以至少要延時750ms以上),

5)復位(每次對DS18B20進行操作都要進行復位、ROM操作、RAM操作這三個步驟),

6)發送跳過ROM指令

7)發送讀內部RAM命令(這個指令讀取DS18B20中RAM的全部9個字節,而我們只需要得到溫度值就可以了,溫度值存儲在RAM的前兩個字節里面,所以我們讀取完前兩個字節的內容后可以不必理會后面的內容),

8)將采集到的溫度值進行處理(判斷溫度的正負,分離溫度的整數位和小數位),然后將處理后的數據發送到串口。

9)延時4S,然后跳到步驟1),重復步驟1)-8),完成下一次溫度測量

 

溫度轉換

 

讀取RAM

 

 

暢學STM32對應程序:

溫度轉換:

 

 

讀暫存器:

 

從ds18b20得到溫度值:

 

這里注意的字節問題,tem 返回的是雙字節的數據,得到返回值之后,對數據再做處理。

 

其中對負數也做了一個判斷與處理,至于取反之后沒有加1,這是一個問題。

因為加1,就設計到一個低字節到高字節的僅為問題,可以好好思考一下:

給一個AVR的進位涉及的程序:

 

主函數中還有的字節處理:

其中注釋的部分為沒有小數點的部分

 

這里用了我用了 強制轉換, 變成了單字節,因為OLED顯示函數的參數,之前寫的時候就是一個字節的函數,所以不進行強制轉換的話,返回造成錯誤。。。

應該有其他的解決方案,暫時用的這個!

 

PS:還有一個問題,這里沒有對溫度為負數,做出什么反應,只是一個判斷問題,不做過多介紹。

 

 問題注意地方:

字節對齊問題

器件識別

溫度為負數情況

時序問題 (特別是延時時間)

 

基本配置程序:

 

 

 

       1、ROM操作命令:DS18B20采用一線通信接口。因為一線通信接口,必須在先完成ROM設定,否則記憶和控制功能將無法使用。一旦總線檢測到從屬器件的存在,它便可以發出器件ROM操作指令,所有ROM操作指令均為8位長度,主要提供以下功能命令: 

1 )讀ROM(指令碼0X33H):當總線上只有一個節點(器件)時,讀此節點的64位序列號。如果總線上存在多于一個的節點,則此指令不能使用。

 2 )ROM匹配(指令碼0X55H):此命令后跟64位的ROM序列號,總線上只有與此序列號相同的DS18B20才會做出反應;該指令用于選中某個DS18B20,然后對該DS18B20進行讀寫操作。

3 )搜索ROM(指令碼0XF0H): 用于確定接在總線上DS18B20的個數和識別所有的64位ROM序列號。當系統開始工作,總線主機可能不知道總線上的器件個數或者不知道其64位ROM序列號,搜索命令用于識別所有連接于總線上的64位ROM序列號。

4 )跳過ROM(指令碼0XCCH): 此指令只適合于總線上只有一個節點;該命令通過允許總線主機不提供64位ROM序列號而直接訪問RAM,以節省操作時間。

5 )報警檢查(指令碼0XECH):此指令與搜索ROM指令基本相同,差別在于只有溫度超過設定的上限或者下限值的DS18B20才會作出響應。只要DS18B20一上電,告警條件就保持在設置狀態,直到另一次溫度測量顯示出非告警值,或者改變TH或TL的設置使得測量值再一次位于允許的范圍之內。儲存在EEPROM內的觸發器用于告警。

這些指令操作作用在每一個器件的64位光刻ROM序列號,可以在掛在一線上多個器件選定某一個器件,同時,總線也可以知道總線上掛有有多少,什么樣的設備。

  2、RAM指令

    DS18B20有六條RAM命令: 

  1)溫度轉換(指令碼0X44H):啟動DS18B20進行溫度轉換,結果存入內部RAM。 

  2)讀暫存器(指令碼0XBEH):讀暫存器9個字節內容,此指令從RAM的第1個字節(字節0)開始讀取,直到九個字節(字節8,CRC值)被讀出為止。如果不需要讀出所有字節的內容,那么主機可以在任何時候發出復位信號以中止讀操作。

  3)寫暫存器(指令碼0X4EH): 將上下限溫度報警值和配置數據寫入到RAM的2、3、4字節,此命令后跟需要些入到這三個字節的數據。 

  4)復制暫存器(指令碼0X48H):把暫存器的2、3、4字節復制到EEPROM中,用以掉電保存。 

  5)重新調E2RAM(指令碼0XB8H):把EEROM中的溫度上下限及配置字節恢復到RAM的2、3、4字節,用以上電后恢復以前保存的報警值及配置字節。

6)讀電源供電方式(指令碼0XB4H):啟動DS18B20發送電源供電方式的信號給主CPU。對于在此命令送至DS18B20后所發出的第一次讀出數據的時間片,器件都會給出其電源方式的信號。“0”表示寄生電源供電。“1”表示外部電源供電。

 

 

州仔 發表于08-21 13:51 瀏覽10899次
分享到:

已有0條評論

暫時還沒有回復喲,快來搶沙發吧

添加一條新評論

只有登錄用戶才能評論,請先登錄注冊哦!

話題作者

州仔
州仔()
金幣:3353個|學分:117650個
立即注冊
暢學電子網,帶你進入電子開發學習世界
專業電子工程技術學習交流社區,加入暢學一起充電加油吧!

x

暢學電子網訂閱號

wwe狂野角斗士直播 23520156313624895274917912340915575516034296929579259311718174891633970798220692938974349448072946 (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); })();