1. DS18B20温度传感器基础解析
DS18B20是Dallas半导体公司推出的单总线数字温度传感器,凭借其独特的单线接口设计和出色的性能指标,在工业控制、智能家居等领域广泛应用。我第一次接触这个传感器是在2015年的一个温室监控项目上,当时就被它仅需一根数据线就能实现通信的特性所震撼。
核心特性方面,DS18B20有三个突出优势:首先是测量范围覆盖-55℃到+125℃,在-10℃至+85℃范围内精度可达±0.5℃;其次是支持9-12位可编程分辨率,用户可以根据需求在测量速度和精度之间做权衡;最重要的是采用单总线协议,只需要一根数据线(加上电源和地线)就能实现双向通信。
硬件连接上,DS18B20提供TO-92、SOIC和µSOP三种封装。以最常见的TO-92封装为例,三个引脚分别是:
- 引脚1(GND):电源地
- 引脚2(DQ):数据输入/输出
- 引脚3(VDD):可选电源(寄生供电时可接地)
实际项目中我推荐给VDD引脚增加一个0.1μF的退耦电容,这能显著提高传感器在长距离布线时的稳定性。
2. 单总线通信协议深度剖析
单总线协议是DS18B20的核心技术,理解其时序要求是成功使用的关键。根据我的项目经验,90%的通信故障都源于时序控制不当。
初始化时序包含三个关键阶段:
- 主机拉低总线480-960μs(我通常用500μs)
- 主机释放总线(改为输入模式)
- 等待60-240μs接收DS18B20的存在脉冲
用STM32的HAL库实现初始化函数如下:
uint8_t DS18B20_Reset(void) { uint8_t ack = 0; HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET); delay_us(500); // 保持500μs低电平 HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET); delay_us(60); // 等待60μs ack = HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN); while(HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN) == 0); // 等待应答结束 return ack; }数据读写时序更为严格:
- 写0时序:拉低总线至少60μs(建议65μs)
- 写1时序:拉低总线1-15μs后立即释放
- 读时序:主机拉低总线1μs后,在15μs内采样数据
我在调试中发现,当使用72MHz主频的STM32F103时,必须禁用中断才能保证时序精度。后来改用硬件定时器产生精确延时,才解决了这个问题。
3. ROM寻址与多点组网技术
DS18B20内置64位光刻ROM编码,结构如下:
- 字节0:产品类型码(28h)
- 字节1-6:唯一序列号
- 字节7:CRC校验码
多点组网需要用到这些ROM命令:
- Search ROM(F0h):识别总线上的所有器件
- Match ROM(55h):选择特定器件通信
- Skip ROM(CCh):单器件时跳过寻址
实现多点测温的关键是ROM搜索算法,这里分享一个经过验证的实现步骤:
- 发出复位脉冲并接收应答
- 发送Search ROM命令(F0h)
- 按位读取所有器件的ROM编码
- 记录存在分歧的位位置
- 选择一条路径继续深入搜索
我曾在一个农业大棚项目中成功实现了单总线上挂接32个DS18B20,关键是在每个测量周期后增加10ms的恢复时间,避免总线电容效应导致通信失败。
4. 供电方案选择与优化
DS18B20支持两种供电模式:
外部供电:VDD接3.0-5.5V电源
- 优点:稳定性高,支持更长的总线距离
- 缺点:需要额外电源线
寄生供电:VDD接地,通过DQ线"窃电"
- 优点:两线制布线简单
- 缺点:强上拉电阻(4.7kΩ)必需,转换期间电流可能不足
实测数据对比:
| 参数 | 外部供电 | 寄生供电 |
|---|---|---|
| 最大线长 | 30米 | 15米 |
| 温度转换时间 | 750ms(12位) | 900ms(12位) |
| 系统可靠性 | 高 | 中 |
对于需要长距离布线的工业场景,我强烈建议使用外部供电方案。曾经有个水产养殖项目,采用寄生供电时传感器经常掉线,改用外部供电后故障率降为零。