《MiniPRO H750开发指南》第三十九章 DS18B20数字温度传感器实验 1)实验平台:正点原子MiniPro STM32H750开发板 2) 章节摘自【正点原子】MiniPro STM32H750 开发指南_V1.1 3)购买链接:https://detail.tmall.com/item.htm?id=677017430560 4)全套实验源码+手册+视频下载地址:MiniPro STM32H750开发板 5)正点原子官方B站:正点原子官方的个人空间_哔哩哔哩_Bilibili 6)MiniPro STM32H750技术交流sigusoft群:756580169 第三十九章 DS18B20数字温度传感器实验 本章,我们将介绍STM32如何读取外部温度传感器的温度,来得到较为准确的环境温度。我们将学习单总线技术,通过它来实现STM32和外部温度传感器DS18B20的通信,并把从温度传感器得到的温度显示在LCD上。 本章分为如下几个小节: 39.1 DS18B20及其时序简介 39.2 硬件设计 39.3 程序设计 39.4 下载验证 39.1 DS18B20及其时序简介 39.1.1 DS18B20简介 DS18B20是由DALLAS半导体公司推出的一种“单总线”接口的温度传感器。与传统的热敏电阻等测温件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。单总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新的概念,测试温度范围为-55~+125℃,精度为±0.5℃。现场温度直接以单总线的数字方式传输,大大提高了系统的抗干扰性。它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。它工作在3~5.5V的电压范围,采用多种封装形式,从而使系统设置灵活、方便,设定分辨率以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。其内部结构如图39.1.1所示:
图39.1.1.1 DS18B20内部结构图 ROM中的64位序列号是出厂前被标记好的,它可以看作使该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排列是:前8位是产品家族码,接着48位是DS18B20的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。ROM作用是使每一个DS18B20都各不相同,这样设计可以允许一根总线上挂载多个DS18B20模块同时工作且不会引起冲突。 39.1.2 DS18B20时序简介 所有单总线器件要求采用严格的信号时序,以保证数据的完整性。DS18B20共有6种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。所有这些信号,除了应答脉冲以外,都是由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。这里我们简单介绍这几个信号的时序。复位脉冲和应答脉冲
图39.1.2.1 复位脉冲和应答脉冲时序图 单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少要在480us,以产生复位脉冲。接着主机释放总线,4.7K的上拉电阻将单总线拉高,延时时间要在15~60us,并进入接收模式(Rx)。接着DS18B20拉低总线60~240us,以产生低电平应答脉冲。写时序
图39.1.2.2 写时序图 写时序包括写0时序和写1时序。所有写时序至少需要60us,且在两次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。写1时序:主机输出低电平,延时2us,然后释放总线,延时60us。写0时序:主机输出低电平,延时60us,然后释放总线延时2us。读时序
图39.1.2.3 读时序图 单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。 在了解单总线时序之后,我们来看一下DS18B20的典型温度读取过程,DS18B20的典型温度读取过程为:复位→发SKIP ROM(0xCC)→发开始转换命令(0x44)→延时→复位→发送SKIP ROM命令(0xCC)→发送存储器命令(0xBE)→连续读取两个字节数据(即温度)→结束。 39.2 硬件设计 1. 例程功能 本实验开机的时候先检测是否有DS18B20存在,如果没有,则提示错误。只有在检测到DS18B20之后才开始读取温度并显示在LCD上,如果发现了DS18B20,则程序每隔100ms左右读取一次数据,并把温度显示在LCD上。 LED0闪烁用于提示程序正在运行。 2. 硬件资源 1)LED灯 LED0 – PB4 2)串口1(PA9/PA10连接在板载USB转串口芯片CH340上面) 3)正点原子2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动) 4)DS18B20温度传感器(接在PC13上) 3. 原理图 DS18B20接口与STM32的连接关系,如下图所示:
图39.2.1 DS18B20接口与STM32的连接电路图 从上图可以看出,我们使用的是STM32的PC13来连接U4的DQ引脚,图中U4为DHT11(数字温湿度传感器)和DS18B20共用的一个接口,DHT11我们将在下一章介绍。 DS18B20只用到U4的3个引脚(U4的1、2和3脚),将DS18B20传感器插入到这个上面就可以通过STM32来读取DS18B20的温度了。连接示意图如图39.2.2所示:
图39.2.2 DS18B20连接示意图 从上图可以看出,DS18B20的平面部分(有字的那面)应该朝内,而曲面部分朝外。然后插入如图所示的三个孔内。 39.3 程序设计 DS18B20实验中使用的是单总线协议,用到的是HAL中GPIO相关函数,前面也有介绍到,这里就不做展开了。下面介绍一下如何驱动DS18B20。 DS18B20配置步骤 1)使能DS18B20数据线对应的GPIO时钟。 本实验中DS18B20的数据线引脚是PC13,因此需要先使能GPIOC的时钟,代码如下: 2)设置对应GPIO工作模式(开漏输出) 本实验GPIO使用开漏输出模式,通过函数HAL_GPIO_Init设置实现。 3)参考单总线协议,编写信号函数(复位脉冲、应答脉冲、写0/1、读0/1) 复位脉冲:主机发出低电平,保持低电平时间至少480us。 应答脉冲:DS18B20拉低总线60~240us,以产生低电平应答信号。 写1信号:主机输出低电平,延时2us,然后释放总线,延时60us。 写0信号:主机输出低电平,延时60us,然后释放总线,延时2us。 读0/1信号:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。 4)编写DS18B20的读和写函数 基于写1bit数据和读1bit数据的基础上,编写DS18B20写1字节和读1字节函数。 5)编写DS18B20温度函数 参考DS18B20典型温度读取过程,编写温度函数。 39.3.1 程序流程图
图39.3.1.1 DS18B20实验程序流程图 39.3.2 程序解析 1.DS18B20驱动代码 这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。DS18B20驱动源码包括两个文件:ds18b20.c和ds18b20.h。 首先我们先看一下ds18b20.h头文件里面的内容,其定义如下: 在ds18b20的初始化函数中,主要对用到的GPIO口进行初始化,同时在函数最后调用复位函数和自检函数,这两个函数在后面会解释到。 下面介绍的是复位DS18B20函数和等待DS18B20的回应函数,它们的定义如下: 以上两个函数分别代表着前面所说的复位脉冲与应答信号,大家可以对比前面的时序图进行理解。由于复位脉冲比较简单,所以这里不做展开。现在看一下应答信号函数,函数主要是对于DS18B20传感器的回应信号进行检测,对此判断其是否存在。函数的实现也是依据时序图进行逻辑判断,例如当主机发送了复位信号之后,按照时序,DS18B20会拉低数据线60~240us,同时主机接收最小时间为480us,我们就依据这两个硬性条件进行判断,首先需要设置一个时限等待DS18B20响应,后面也设置一个时限等待DS18B20释放数据线拉高,满足这两个条件即DS18B20成功响应。 下面介绍的是写函数,其定义如下: 在这里ds18b20_read_bit函数从DS18B20处读取1位数据,在前面已经对读时序也进行了详细的分析,所以这里也不展开解释了。 下面介绍读取温度函数,其定义如下: 在这里简单介绍一下上面用到的RAM指令: 跳过ROM(0xCC),该指令只适合总线只有一个节点,它通过允许总线上的主机不提供64位ROM序列号而直接访问RAM,节省了操作时间。 温度转换(0x44),启动DS18B20进行温度转换,结果存入内部RAM。 读暂存器(0xBE),读暂存器9个字节内容,该指令从RAM的第一个字节(字节0)开始读取,直到九个字节(字节8,CRC值)被读出为止。如果不需要读出所有字节的内容,那么主机可以在任何时候发出复位信号以中止读操作。 2. main.c代码 在main.c里面编写如下代码: 主函数代码比较简单,一系列硬件初始化后,在循环中调用ds18b20_get_temperature函数温度值,然后显示在LCD上。 39.4 下载验证 假定DS18B20传感器已经接上去正确的位置,将程序下载到开发板后,可以看到LED0不停的闪烁,提示程序已经在运行了。LCD显示当前的温度值的内容如图39.4.1所示:
图39.4.1 程序运行效果图 该程序还可以读取并显示负温度值,具备零下温度条件可以测试一下。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/37882.html