1. DS18B20单总线温度传感器概述
DS18B20是Dallas Semiconductor(现Maxim Integrated)推出的数字温度传感器,采用独特的单总线(1-Wire)通信协议。作为嵌入式系统中温度监测的经典解决方案,它仅需一根数据线(加上地线)即可完成双向通信,极大简化了硬件连接复杂度。
在实际工程应用中,DS18B20具有三大核心优势:
- 超低功耗:工作电流仅1mA,待机电流低至750nA,特别适合电池供电场景
- 高精度:±0.5℃精度(-10℃至+85℃范围),12位分辨率可达0.0625℃
- 多节点支持:单总线可挂载多个传感器,每个器件都有全球唯一的64位ROM编码
硬件设计注意:虽然称为"单总线",实际接线仍需连接VDD(3.0V-5.5V)和GND。当采用寄生供电模式时,可省略VDD引脚,但需在数据线增加上拉电阻(通常4.7kΩ)。
2. 单总线通信协议深度解析
2.1 物理层特性
单总线协议采用开漏结构,必须外接上拉电阻(推荐4.7kΩ)。数据传输速率默认15.4kbps,通过特殊的时序实现双向通信:
- 逻辑1:总线保持高电平
- 逻辑0:主机主动拉低总线
- 从机响应:从机通过控制低电平持续时间来传递数据
2.2 关键操作时序
复位脉冲(Reset Pulse)
主机拉低总线480μs以上后释放,DS18B20会在15-60μs内回发存在脉冲(Presence Pulse)。这是每次通信的起始标志。
c复制// 典型复位序列代码示例
void DS18B20_Reset() {
set_as_output(); // 主机设为输出模式
pull_low(); // 拉低总线
delay_us(480); // 保持480μs
set_as_input(); // 释放总线
delay_us(60); // 等待从机响应
if (read_pin() == 0) {
delay_us(420); // 等待存在脉冲结束
}
}
读写时隙(Time Slot)
- 写时隙:主机拉低总线至少1μs,然后根据要写入的bit值决定保持时间(写0保持60μs,写1快速释放)
- 读时隙:主机拉低总线1μs后释放,必须在15μs内采样总线状态
时序精度要求:DS18B20对时序极其敏感,μs级误差可能导致通信失败。建议使用硬件定时器或精确的延时函数。
3. DS18B20核心指令集详解
3.1 ROM操作指令
| 指令代码 | 指令名称 | 功能描述 |
|---|---|---|
| 0x33 | READ ROM | 读取64位ROM编码(单设备时使用) |
| 0x55 | MATCH ROM | 匹配特定ROM编码(多设备时使用) |
| 0xCC | SKIP ROM | 跳过ROM识别(单设备/广播命令) |
| 0xF0 | SEARCH ROM | 总线设备搜索 |
3.2 功能指令
| 指令代码 | 指令名称 | 功能描述 |
|---|---|---|
| 0x44 | CONVERT T | 启动温度转换(最大耗时750ms) |
| 0xBE | READ SCRATCH | 读取暂存器(包含温度值) |
| 0x4E | WRITE SCRATCH | 写入TH/TL配置寄存器 |
4. 温度采集实战流程
4.1 单传感器操作流程
- 初始化序列:发送复位脉冲→检测存在脉冲
- 跳过ROM:发送0xCC指令(单设备时可省略设备寻址)
- 启动转换:发送0x44指令→等待转换完成(可查询或固定延时)
- 读取温度:
- 再次初始化总线
- 发送0xBE指令
- 连续读取9字节(温度值+TH/TL+配置寄存器+CRC)
python复制# Python示例代码(适用于Raspberry Pi)
def read_temperature():
# 初始化
reset()
write_byte(0xCC) # Skip ROM
write_byte(0x44) # Convert T
time.sleep(0.75) # 等待转换完成
reset()
write_byte(0xCC)
write_byte(0xBE) # Read Scratchpad
data = [read_byte() for _ in range(9)]
# 处理温度数据
temp_raw = (data[1] << 8) | data[0]
temp_c = temp_raw / 16.0
return temp_c
4.2 多传感器系统设计
当总线上挂载多个DS18B20时,必须采用ROM匹配流程:
- 设备枚举:使用SEARCH ROM算法获取所有设备的64位ROM编码
- 轮流采集:
- 发送MATCH ROM(0x55) + 目标ROM编码
- 发送CONVERT T(0x44)
- 延时后读取该设备温度
- CRC校验:对每次通信的ROM编码和数据都进行CRC8验证
工程经验:建议为每个物理传感器位置记录其ROM编码,建立映射表。实际部署时可先单独调试每个节点,再组网测试。
5. 常见问题与解决方案
5.1 通信失败排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无存在脉冲 | 接线错误/传感器损坏 | 检查VDD/GND/DQ连接,更换传感器 |
| CRC校验失败 | 时序不准确/电磁干扰 | 调整延时参数,缩短线缆长度 |
| 温度值固定85℃ | 电源功率不足 | 增加电源电容或改用独立供电 |
| 多设备无法识别 | ROM搜索算法错误 | 参考官方搜索ROM流程图重现实现 |
5.2 精度优化技巧
-
抗干扰设计:
- 总线长度不超过50米(推荐<20米)
- 双绞线布线,必要时增加磁珠滤波
- 在靠近传感器端并联100nF去耦电容
-
软件校准:
c复制// 温度校准公式示例 float calibrated_temp = raw_temp * 0.95 + 0.3; // 需通过实际对比测试确定系数
6. 进阶应用:低功耗温度监测系统
结合4G模组(如EC20)与DS18B20构建远程监测节点:
-
硬件架构:
- 主控:STM32L4系列低功耗MCU
- 传感器:DS18B20(寄生供电模式)
- 通信:EC20 4G模组(TCP/IP透传)
-
工作流程:
- MCU周期性唤醒(每10分钟)
- 采集温度并通过CRC验证
- 通过MQTT协议上报云平台
- 进入STOP模式(电流<1μA)
-
关键代码:
c复制void enter_low_power() {
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后时钟需重新配置
SystemClock_Config();
}
实测数据:采用1800mAh锂电池可连续工作约2年(10分钟间隔)。
