引言
DS18B20是一款由美國DALLAS公司生產的單總線數字溫度傳感器,以其高精度、微型封裝和獨特的單總線通信協議而著稱。它無需外部元件,可直接將溫度值轉換為數字信號,通過一條通信線路與微控制器(如Arduino、STM32等)進行數據交換,極大地簡化了測溫系統的硬件設計與布線。本文旨在詳細闡述基于DS18B20的測溫實驗工作原理、具體實現步驟,并深入剖析其核心的通信線路機制。
一、實驗原理
1. 核心特性
DS18B20的核心是一個經過激光修正的硅溫度傳感器和數字轉換模塊。其關鍵特性包括:
- 高精度:典型精度為±0.5°C(在-10°C至+85°C范圍內)。
- 數字輸出:直接輸出9至12位的二進制溫度數據,無需A/D轉換。
- 單總線接口:僅需一條數據線(DQ)即可完成電源供給和數據通信,支持“寄生電源”模式(從數據線“竊取”電源)和外部供電模式。
- 多點組網能力:每個DS18B20都有唯一的64位激光ROM序列號,允許在同一條總線上掛載多個傳感器,實現多點測溫。
2. 測溫與轉換原理
傳感器內部的核心是一個對溫度高度敏感的振蕩器,其頻率隨溫度變化。通過一個低溫系數振蕩器產生的固定頻率脈沖作為基準,對溫度敏感振蕩器的脈沖進行計數,從而將溫度信息轉換為數字值,并存儲在內部的溫度寄存器中。轉換分辨率可通過配置寄存器設定(9、10、11或12位),分辨率越高,轉換時間越長。
二、通信線路詳解
通信線路是DS18B20實驗實現的關鍵,特指連接微控制器與DS18B20的單總線(1-Wire Bus)。
1. 物理連接
- 基本電路:DS18B20的DQ引腳(數據輸入/輸出)通過一個4.7kΩ的上拉電阻連接到微控制器的某個I/O引腳(如GPIO)和電源VCC(通常為3.3V或5V)。VDD引腳在外部供電模式下接VCC,在寄生電源模式下接地。GND引腳接地。
- 上拉電阻的作用:單總線協議是開漏輸出,需要上拉電阻將總線在空閑時保持在高電平狀態,并為總線提供驅動能力。
- 多點組網連接:所有DS18B20的DQ引腳并聯接至同一條總線上,VCC和GND并聯。微控制器通過識別每個器件的唯一ROM序列號來分別訪問。
2. 單總線通信協議
單總線協議通過精確的時序來完成數據讀寫,所有操作均以微控制器作為主機(Master),DS18B20作為從機(Slave)。一次完整的溫度數據獲取流程通常包括以下序列:
- 初始化(復位脈沖 + 存在脈沖):主機拉低總線至少480μs,然后釋放(進入接收模式)。DS18B20在檢測到上升沿后,等待15-60μs,然后拉低總線60-240μs作為“存在脈沖”,向主機表明其在線。
- ROM命令(如搜索ROM、匹配ROM):主機發送命令,用于在多點系統中尋址特定的DS18B20。對于單點系統,通常使用“跳過ROM”命令(0xCC)來忽略地址匹配,直接與總線上的唯一器件通信。
- 功能命令:最重要的功能命令是啟動溫度轉換(0x44)和讀取暫存器(0xBE)。發送啟動轉換命令后,DS18B20開始進行A/D轉換,在此期間主機可以釋放總線執行其他任務(通過“讀時隙”查詢轉換完成狀態,或等待固定的轉換時間,如12位分辨率時需750ms)。
- 數據讀寫:所有數據以字節為單位,LSB(最低有效位)在先。每個“時隙”傳輸1位數據。主機通過控制拉低總線的時間長短來區分寫“0”(拉低60-120μs)、寫“1”(拉低1-15μs后釋放)或讀數據(主機拉低總線至少1μs后釋放,然后在15μs內采樣總線電平,低電平為0,高電平為1)。
三、實驗實現步驟(以Arduino為例)
1. 硬件連接
- DS18B20的VDD引腳接Arduino的5V引腳。
- GND引腳接Arduino的GND引腳。
- DQ引腳接Arduino的數字引腳(如Pin 2),并通過一個4.7kΩ電阻上拉到5V。
2. 軟件實現
1. 庫支持:在Arduino IDE中安裝OneWire和DallasTemperature庫,它們封裝了復雜的單總線協議時序。
2. 代碼流程:
`cpp
#include
#include
#define ONEWIREBUS 2 // 數據線連接引腳
OneWire oneWire(ONEWIREBUS); // 初始化OneWire實例
DallasTemperature sensors(&oneWire); // 將OneWire實例傳遞給DallasTemperature
void setup() {
Serial.begin(9600);
sensors.begin(); // 啟動傳感器總線
}
void loop() {
sensors.requestTemperatures(); // 發送轉換命令(廣播,無需地址)
float tempC = sensors.getTempCByIndex(0); // 讀取索引0(第一個)傳感器的攝氏溫度值
Serial.print("Temperature: ");
Serial.print(tempC);
Serial.println(" °C");
delay(1000); // 延時1秒
}
`
- 工作過程:
sensors.requestTemperatures()函數內部完成了初始化、跳過ROM、發送啟動轉換命令(0x44)并等待轉換完成。sensors.getTempCByIndex(0)函數則再次初始化、跳過ROM、發送讀暫存器命令(0xBE),并從總線讀取9字節數據(包含2字節的溫度值),將其轉換為浮點數。
四、與注意事項
基于DS18B20的測溫實驗成功地將高精度測溫與極簡的硬件設計相結合。其實驗的核心在于理解并正確實現單總線通信協議。在實現過程中需注意:
- 上拉電阻必不可少,否則總線無法被正確拉高,通信會失敗。
- 時序要求嚴格,尤其是當不使用現成庫而直接操作GPIO時,必須嚴格按照數據手冊的時序圖編寫代碼,并考慮微控制器指令執行時間的影響。
- 總線長度限制,單總線長度一般不宜超過100米,在干擾較強的環境中應適當縮短,并考慮使用屏蔽線。
- 電源模式選擇,寄生電源模式布線更簡單,但在進行溫度轉換和EEPROM寫入時,總線必須保持強上拉(提供足夠電流),否則可能出錯。外部供電模式更穩定可靠。
通過掌握其通信原理,開發者可以靈活地將DS18B20應用于各種嵌入式測溫場景,從簡單的環境監測到復雜的工業多點測溫系統。