DS18B20 单线总线的工作方式
1. DS18B20 简介
DS18B20单线数字温度传感器,即“一线器件”,其具有如下独特的优点。
采用单线总线的接口方式。与微处理器连接时,仅需要1条口线即可实现微处理器与 DS18B20 的双向通信。
测量温度范围宽,测量精度高。DS18B20 的测量范围为-55°C~ + 125C;在-10°C ~ +85°C范围内,精度为 ± 0.5 °C。
支持多点组网功能。多个DS18B20可以并联在单线上,实现多点测温。
供电方式灵活。DS18B20可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。
测量参数可配置。DS18B20的测量分辨率可通过程序设定9- 12位。
掉电保护功能 。DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。
单线总线只有一根数据线,引脚说明如下:
引脚 | NC | DQ | V |
---|---|---|---|
说明 | 空引脚 | 数字输入输出 | 可选的 V |
博主使用的开发模块原理图:
2. DS18B20 内部结构
DS18B20 的一线工作协议流程:初始化 → ROM 操作指令 → 存储器操作指令 → 数据传输。
DS18B20 内部结构包括 64 位光刻 ROM,温度传感器,高速暂存器,温度报警触发器 TH 和 TL 及配置寄存器。
光刻 ROM 的 64 位序列号是出厂时光刻好的,可看作 DS18B20 的地址序列码。前 8 位是产品类型标号(地址 28H);其后的 48 位是 DS18B20 的自身的序列号,每一块产品都不同;最后 8 位是前 56 位的循环冗余校验码(CRC=X^8^ + X^5^+ X^4^ + 1)。正因如此,控制器才能通过单线总线对多个 DS18B20 进行寻址,实现单线总线上挂载多个 DS18B20。
DS18B20 经转换所得的温度值,以2字节补码形式存放在高速暂存存储器的第 0 和第 1 个字节。所以当只想简单的读取温度值的时候,只用读取暂存器中的第 0 和第 1 个字节就可以了。
符号位 S 表示温度是正的还是负的:对于正数,S = 0,对于负数,S = 1。
3. DS18B20 的使用
3.1 使用步骤
简单的读取温度值的步骤如下:
跳过ROM操作。
发送温度转换命令。
跳过ROM操作。
发送读取温度命令。
读取温度值。
正数的补码是正数本身;负数的补码是原码取反,然后再加 1。
DS18B20存储的温度值是以补码的形式存储的,所以读出来的温度值是实际温度值的补码,要把补码转换为原码。
正温度的原码就是补码本身,所以在 12 位分辨率下,温度的计算公式是为
$$
温度值 = 读取值 \times 0.0625
$$
负温度的原码是补码减1,再取反,所以在12位分辨率下,计算公式为
$$
温度值=- (读取值减1再取反) \times 0.0625
$$
3.2 复位时序
- 控制器首先发出 480μs ~ 960μs 的低电平脉冲,然后释放总线变为高电平,并在随后的 480μs 内对总线做检测,若有低电平出现,说明器件已作应答;否则无应答;
- DS18B20 从接电开始就在等待 480μs ~ 960μs 的低电平脉冲,若有会在总线电平变高后,等待 15μs ~ 60μs 后,将总线电平拉低 60μs ~ 240μs 作为应答响应脉冲若没有检测到,则一直等待。
3.3 写时序
写周期的时间为 60μs ~ 120μs,控制器首先把总线电平拉低 1μs ~15μs,表示写时序开始:
- 写 “0”,在写周期开始后,控制器写 “0”,即将总线置为低电平,直接拉低总线电平 60μs ~ 120μs 即可;
- 写 “0” 后,至少需要释放总线高电平 1μs,使总线恢复;
- 写 “1”,在写周期开始后,控制器写 “1”,即释放总线电平为高电平;
- DS18B20 在总线电平拉低后的 15μs ~ 60μs 内,进行数据采样。
3.4 读时序
读周期的时间至少需要 60 μs,控制器首先把总线电平拉低 1μs ~15μs,表示读时序开始。在总线电平被拉低后的 15μs 内,控制器需要对总线进行采样,数据有效。采样为低电平,则为“0”;高电平为“1”。读周期的读写恢复时间至少需要 1μs。
3.5 指令合集
指令名称 | 指令代码 | 指令功能 |
---|---|---|
温度变换 | 44H | 进行一次温度转换,将转换的温度值放入暂存器的第1、2字节 |
读暂存器 | 0BEH | 读取内部暂存器的数据,从字节 0 读到 字节 9(CRC校验位) |
写暂存器 | 4EH | 允许控制器写 3 个字节到暂存器的第 3,4,5 个字节处 |
复制暂存器 | 48H | 将暂存器的第 3,4,5 个字节内容复制到 EEPROM 中 |
重调 EEPROM | 0B8H | 将EEPROM内容复制到暂存器的第 3,4,5 个字节中 |
读供电模式 | 0B4H | 读取供电模式。寄生供电发送“0”,外接电源发送“1” |
搜索 ROM | 0F0H | 总线控制器通过此指令多次循环搜索 ROM 编码,以确认所有从机 |
读取 ROM | 33H | 直接读取从机 64 位序列码,总线上只有一片 DS18B20 才使用 |
匹配 ROM | 55H | 发出此命令后,接着发出 64 位 ROM 编码,匹配对应的 DS18B20 |
警报搜索 | 0ECH | 当总线上存在满足报警条件的 DS18B20,该从机会响应该指令 |
跳过 ROM | 0CCH | 忽略 64 位 ROM 序列码,直接发出温度转换指令,适用于单片DS18B20 |
4. 测试代码
代码在博主 STM32F103ZET6 上测试通过,部分代码参考野火 DS18B20 例程。由于代码过多,已托管至 Github 平台:F103-DS18B20。