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到项目中,避免常见时序和硬件设计错误。