DS18B20 通過 單總線(1-Wire)協議 與微控制器通信,其溫度讀取過程可分為 初始化、發送指令、溫度轉換、數據讀取 等步驟。以下是詳細的工作原理:
一. 硬件工作原理
- 溫度傳感核心
DS18B20 內部包含一個 高精度溫敏振蕩器,通過測量與溫度相關的脈沖頻率來量化溫度值。
- 溫度變化 → 晶體振蕩頻率變化 → 計數器記錄脈沖數 → 轉換為數字信號。
- 內部結構
- 64位ROM:存儲全球唯一地址(用于多設備識別)。
- 溫度傳感器:核心測量單元。
- 配置寄存器:設置分辨率(9~12位)。
- 暫存器(Scratchpad):臨時存儲溫度數據和控制參數。
二. 溫度讀取流程
步驟1:總線初始化(復位脈沖)
- 微控制器發送 480~960μs的低電平脈沖,釋放總線后等待DS18B20的 存在脈沖(60~240μs低電平),確認設備在線。
步驟2:發送ROM指令
- 若總線上有多個DS18B20,需通過ROM指令選擇目標設備:
- `0x55`:匹配特定ROM地址(單設備操作可跳過)。
- `0xCC`:跳過ROM地址檢測(適用于單設備場景)。
步驟3:發送功能指令
- 啟動溫度轉換:發送指令 `0x44`,DS18B20開始測量溫度。
- 轉換時間取決于分辨率(9位約93ms,12位約750ms)。
- 在此期間,微控制器可輪詢總線狀態或延時等待。
步驟4:讀取溫度數據
1. 重新初始化總線,發送 `0xBE` 指令讀取暫存器數據。
2. 連續讀取9字節(包括溫度值、配置參數等,通常只需前2字節)。
3. 溫度數據以 16位二進制補碼 格式存儲,需轉換為實際溫度值。
三. 數據格式與溫度計算
- 示例:若讀取的16位數據為 `0x0191`(二進制 `0000 0001 1001 0001`):
- 高字節 `0000 0001` → 正溫度(最高位為0)。
- 低字節 `1001 0001` → 小數部分。
- 計算:
- 整數部分:`0000 0001` → 1 × 16 = 16(高4位為整數高位)。
- 小數部分:`0001` → 1 × 0.0625 = 0.0625(低4位為小數,12位分辨率時每單位0.0625°C)。
- 實際溫度:16 + 0.0625 = 16.0625°C。
- 負溫度處理:
若高字節最高位為1(如 `0xFF8F`),需取補碼后計算:
```c
temp = (讀取值 & 0xFFF8) * (-1) + (16 - (讀取值 & 0x000F) * 0.0625);
```
四. 關鍵時序與信號
- 單總線協議時序:
- 寫“0”:保持低電平 >60μs。
- 寫“1”:拉低總線1μs后釋放。
- 讀數據:微控制器拉低總線1μs后采樣。
- 寄生供電模式注意事項:
- 溫度轉換期間需通過 強上拉電阻 保持總線高電平供電,否則可能導致轉換失敗。
五. 常見問題與解決
1. 讀取值為85°C
- 原因:未等待溫度轉換完成或初始化失敗。
- 解決:增加延時(如 `delay(750)`)或檢查總線連接。
2. 數據不穩定
- 原因:總線干擾或電源不穩。
- 解決:縮短導線長度,增加濾波電容(0.1μF靠近DS18B20的VDD和GND)。
3. 多設備沖突
- 原因:未正確匹配ROM地址。
- 解決:遍歷總線設備并單獨操作(使用 `search()` 函數獲取ROM地址)。
通過理解上述原理,可更高效地集成DS18B20到項目中,避免常見時序和硬件設計錯誤。