深夜,智能溫室控制系統(tǒng)遭遇異常。傳統(tǒng)模擬傳感器布線復雜,故障點排查猶如大海撈針。工程師將探頭浸入營養(yǎng)液槽,僅憑一根數據線,Arduino Uno實時顯示25.37℃——精度高達0.0625℃。正是DS18B20的革新性設計,讓分布式溫度監(jiān)測變得高效且可靠。
單總線協(xié)議(1-Wire) 是DS18B20的革命性設計:
溫度轉換引擎核心包括:
關鍵過程:啟動轉換后,溫度值存入暫存器;主機發(fā)出讀指令,DS18B20通過單總線傳輸包含CRC校驗的完整數據幀。
// 典型三線制連接 (推薦)
VDD → 3.3V/5V
DQ → 單片機GPIO (需4.7KΩ上拉)
GND → 地
// 寄生供電模式
DQ → 單片機GPIO (強上拉電阻需10KΩ)
GND → 地
底層驅動需包含關鍵時序控制:
bool onewire_reset() {
set_low(); delay_us(480);
set_high(); delay_us(70);
bool presence = !read_pin();
delay_us(410);
return presence; // true表示設備存在
}
void onewire_write_bit(bool bit) {
set_low();
delay_us(bit ? 5 : 60);
set_high();
delay_us(bit ? 55 : 5);
}
onewire_reset()0x55 + 64位ROM編碼0x44 - 啟動溫度轉換 (啟動后需等待轉換完成)0xBE - 讀取暫存器數據 (9字節(jié))float DS18B20_read_temp() {
onewire_reset();
onewire_write_byte(0xCC); // 跳過ROM
onewire_write_byte(0x44); // 啟動轉換
delay_ms(750); // 等待12位轉換完成
onewire_reset();
onewire_write_byte(0xCC);
onewire_write_byte(0xBE); // 讀暫存器
uint8_t data[9];
for(uint8_t i=0; i<9; i++)
data[i] = onewire_read_byte();
// 校驗CRC
if (crc8(data, 8) != data[8]) return NAN;
int16_t temp_raw = (data[1] << 8) | data[0];
return temp_raw * 0.0625; // 12位精度計算
}
0xF0指令搜索總線設備,動態(tài)構建地址列表if (temp_raw & 0x8000) {
temp_raw = -(temp_raw ^ 0xFFFF) + 1); // 取反加1得原碼
temperature = -temp_raw * 0.0625;
}
0x1F),轉換僅94ms,顯著提升輪詢效率。DS18B20在工業(yè)現場最長通信距離可達300米(規(guī)范線纜),但電磁干擾環(huán)境需增加屏蔽或降低波特率。當讀取值恒為85℃(芯片上電值)時,重點檢查電源穩(wěn)定性與信號時序誤差——這些工程細節(jié)往往決定長期運行的可靠性。
Copyright ? 南京凱基特電氣有限公司 版權所有
蘇ICP備12080292號
全國服務電話:025-66098387傳真:025-87168200
公司地址:江蘇省南京市江寧區(qū)科寧路777號申智滙谷9棟101