STM32F1XX驱动温度检测模块DS18B20


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。

64-Bit Lasered ROM Code

高速暂存器

配置寄存器及与分辨率的关系

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


文章作者: Mahoo Huang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mahoo Huang !
评论
 上一篇
Dart 编程语言不详细学习指北 Dart 编程语言不详细学习指北
本文章是博主在此网站学习 Dart 语言时所摘录的一些重要内容,用于快速掌握 Dart 语言,详细完整内容请点击原网页。 重要的概念 Dart 万物皆对象,并且所有的对象都是对应一个 类 的实例。 尽管 Dart 是强类型的,但是 Dar
2020-10-30
下一篇 
超乎你想象的Stm32中的 TIM 定时器(提高篇) 超乎你想象的Stm32中的 TIM 定时器(提高篇)
注:本文属博主学习时所作笔记,内容源大参考于野火的《零死角玩转STM32F103》以及部分网络资料,笔记内容仅作为自己参考,免去频繁查询参考手册的麻烦,如有错误,还请指出! 高级定时器(STM32F1 系列中为 TIM1 和 TIM8)和通
2020-09-23
  目录