STM32F1XX驱动温度检测模块DS18B20
2019-07-13 22:12:43

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 VDD
说明 空引脚 数字输入输出 可选的 VDD

DS18B20 原理图

博主使用的开发模块原理图:

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 使用步骤

简单的读取温度值的步骤如下:

  1. 跳过ROM操作。

  2. 发送温度转换命令。

  3. 跳过ROM操作。

  4. 发送读取温度命令。

  5. 读取温度值。

正数的补码是正数本身;负数的补码是原码取反,然后再加 1。

DS18B20存储的温度值是以补码的形式存储的,所以读出来的温度值是实际温度值的补码,要把补码转换为原码。

正温度的原码就是补码本身,所以在 12 位分辨率下,温度的计算公式是为
$$
温度值 = 读取值 \times 0.0625
$$
负温度的原码是补码减1,再取反,所以在12位分辨率下,计算公式为
$$
温度值=- (读取值减1再取反) \times 0.0625
$$

3.2 复位时序

  1. 控制器首先发出 480μs ~ 960μs 的低电平脉冲,然后释放总线变为高电平,并在随后的 480μs 内对总线做检测,若有低电平出现,说明器件已作应答;否则无应答;
  2. DS18B20 从接电开始就在等待 480μs ~ 960μs 的低电平脉冲,若有会在总线电平变高后,等待 15μs ~ 60μs 后,将总线电平拉低 60μs ~ 240μs 作为应答响应脉冲若没有检测到,则一直等待。

3.3 写时序

写周期的时间为 60μs ~ 120μs,控制器首先把总线电平拉低 1μs ~15μs,表示写时序开始:

  1. 写 “0”,在写周期开始后,控制器写 “0”,即将总线置为低电平,直接拉低总线电平 60μs ~ 120μs 即可;
  2. 写 “0” 后,至少需要释放总线高电平 1μs,使总线恢复;
  3. 写 “1”,在写周期开始后,控制器写 “1”,即释放总线电平为高电平;
  4. 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