引言
DS18B20是一款由美国DALLAS公司生产的单总线数字温度传感器,以其高精度、微型封装和独特的单总线通信协议而著称。它无需外部元件,可直接将温度值转换为数字信号,通过一条通信线路与微控制器(如Arduino、STM32等)进行数据交换,极大地简化了测温系统的硬件设计与布线。本文旨在详细阐述基于DS18B20的测温实验工作原理、具体实现步骤,并深入剖析其核心的通信线路机制。
一、实验原理
1. 核心特性
DS18B20的核心是一个经过激光修正的硅温度传感器和数字转换模块。其关键特性包括:
- 高精度:典型精度为±0.5°C(在-10°C至+85°C范围内)。
- 数字输出:直接输出9至12位的二进制温度数据,无需A/D转换。
- 单总线接口:仅需一条数据线(DQ)即可完成电源供给和数据通信,支持“寄生电源”模式(从数据线“窃取”电源)和外部供电模式。
- 多点组网能力:每个DS18B20都有唯一的64位激光ROM序列号,允许在同一条总线上挂载多个传感器,实现多点测温。
2. 测温与转换原理
传感器内部的核心是一个对温度高度敏感的振荡器,其频率随温度变化。通过一个低温系数振荡器产生的固定频率脉冲作为基准,对温度敏感振荡器的脉冲进行计数,从而将温度信息转换为数字值,并存储在内部的温度寄存器中。转换分辨率可通过配置寄存器设定(9、10、11或12位),分辨率越高,转换时间越长。
二、通信线路详解
通信线路是DS18B20实验实现的关键,特指连接微控制器与DS18B20的单总线(1-Wire Bus)。
1. 物理连接
- 基本电路:DS18B20的DQ引脚(数据输入/输出)通过一个4.7kΩ的上拉电阻连接到微控制器的某个I/O引脚(如GPIO)和电源VCC(通常为3.3V或5V)。VDD引脚在外部供电模式下接VCC,在寄生电源模式下接地。GND引脚接地。
- 上拉电阻的作用:单总线协议是开漏输出,需要上拉电阻将总线在空闲时保持在高电平状态,并为总线提供驱动能力。
- 多点组网连接:所有DS18B20的DQ引脚并联接至同一条总线上,VCC和GND并联。微控制器通过识别每个器件的唯一ROM序列号来分别访问。
2. 单总线通信协议
单总线协议通过精确的时序来完成数据读写,所有操作均以微控制器作为主机(Master),DS18B20作为从机(Slave)。一次完整的温度数据获取流程通常包括以下序列:
- 初始化(复位脉冲 + 存在脉冲):主机拉低总线至少480µs,然后释放(进入接收模式)。DS18B20在检测到上升沿后,等待15-60µs,然后拉低总线60-240µs作为“存在脉冲”,向主机表明其在线。
- ROM命令(如搜索ROM、匹配ROM):主机发送命令,用于在多点系统中寻址特定的DS18B20。对于单点系统,通常使用“跳过ROM”命令(0xCC)来忽略地址匹配,直接与总线上的唯一器件通信。
- 功能命令:最重要的功能命令是启动温度转换(0x44)和读取暂存器(0xBE)。发送启动转换命令后,DS18B20开始进行A/D转换,在此期间主机可以释放总线执行其他任务(通过“读时隙”查询转换完成状态,或等待固定的转换时间,如12位分辨率时需750ms)。
- 数据读写:所有数据以字节为单位,LSB(最低有效位)在先。每个“时隙”传输1位数据。主机通过控制拉低总线的时间长短来区分写“0”(拉低60-120µs)、写“1”(拉低1-15µs后释放)或读数据(主机拉低总线至少1µs后释放,然后在15µs内采样总线电平,低电平为0,高电平为1)。
三、实验实现步骤(以Arduino为例)
1. 硬件连接
- DS18B20的VDD引脚接Arduino的5V引脚。
- GND引脚接Arduino的GND引脚。
- DQ引脚接Arduino的数字引脚(如Pin 2),并通过一个4.7kΩ电阻上拉到5V。
2. 软件实现
1. 库支持:在Arduino IDE中安装OneWire和DallasTemperature库,它们封装了复杂的单总线协议时序。
2. 代码流程:
`cpp
#include
#include
#define ONEWIREBUS 2 // 数据线连接引脚
OneWire oneWire(ONEWIREBUS); // 初始化OneWire实例
DallasTemperature sensors(&oneWire); // 将OneWire实例传递给DallasTemperature
void setup() {
Serial.begin(9600);
sensors.begin(); // 启动传感器总线
}
void loop() {
sensors.requestTemperatures(); // 发送转换命令(广播,无需地址)
float tempC = sensors.getTempCByIndex(0); // 读取索引0(第一个)传感器的摄氏温度值
Serial.print("Temperature: ");
Serial.print(tempC);
Serial.println(" °C");
delay(1000); // 延时1秒
}
`
- 工作过程:
sensors.requestTemperatures()函数内部完成了初始化、跳过ROM、发送启动转换命令(0x44)并等待转换完成。sensors.getTempCByIndex(0)函数则再次初始化、跳过ROM、发送读暂存器命令(0xBE),并从总线读取9字节数据(包含2字节的温度值),将其转换为浮点数。
四、与注意事项
基于DS18B20的测温实验成功地将高精度测温与极简的硬件设计相结合。其实验的核心在于理解并正确实现单总线通信协议。在实现过程中需注意:
- 上拉电阻必不可少,否则总线无法被正确拉高,通信会失败。
- 时序要求严格,尤其是当不使用现成库而直接操作GPIO时,必须严格按照数据手册的时序图编写代码,并考虑微控制器指令执行时间的影响。
- 总线长度限制,单总线长度一般不宜超过100米,在干扰较强的环境中应适当缩短,并考虑使用屏蔽线。
- 电源模式选择,寄生电源模式布线更简单,但在进行温度转换和EEPROM写入时,总线必须保持强上拉(提供足够电流),否则可能出错。外部供电模式更稳定可靠。
通过掌握其通信原理,开发者可以灵活地将DS18B20应用于各种嵌入式测温场景,从简单的环境监测到复杂的工业多点测温系统。