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