打印
[其他ST产品]

STM32F4_DS18B20红外温度传感器

[复制链接]
2070|61
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言
        STM32F4内部集成了温度传感器。在之前的学习中,我们已经学习了使用AD进行温度采集,但是因为芯片温升较大,与实际的温度差别较大。所以本次我们学习使用STM32来读取开发板外部的温度传感器的温度。开发板外部的温度传感器是DS18B20,该传感器和MCU实现通讯使用的是单总线协议。

1. 单总线时序结构
初始化:

        主机将总线拉低至少480us,然后释放总线,4.7K的上拉电阻将单总线拉高,等待15~60us后,存在的从机会拉低总线60~240us产生低电平以响应主机,之后从机将释放总线。
—————————

使用特权

评论回复
沙发
大鹏2365|  楼主 | 2023-6-29 19:10 | 只看该作者
发送一位:

        主机将总线拉低60~120us,然后释放总线,表示发送0;主机将总线拉低1~15us,然后释放总线,表示发送1。

        从机将在总线拉低30us后(典型值)读取电平,整个时间片应大于60us。  

使用特权

评论回复
板凳
大鹏2365|  楼主 | 2023-6-29 19:10 | 只看该作者
发送一个字节:

        连续调用8次发送一位的时序,依次发送一个字节的8位(低位在前)

使用特权

评论回复
地板
大鹏2365|  楼主 | 2023-6-29 19:10 | 只看该作者
接收一位:

        主机将总线拉低1~15us,然后释放总线,并且在拉低后15us内读取总线电平(尽量贴近15us的末尾),读取为低电平则为接收0,读取为高电平则为接收1,整个时间片应大于60us。

使用特权

评论回复
5
大鹏2365|  楼主 | 2023-6-29 19:10 | 只看该作者
接收一个字节:

        连续调用8次接收一位的时序,依次接收一个字节的8位(低位在前)

使用特权

评论回复
6
大鹏2365|  楼主 | 2023-6-29 19:10 | 只看该作者
正点原子官方提供的单总线时序:

1. 复位脉冲和应答脉冲

        单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少 480 us,以产生复位脉冲。接着主机释放总线,4.7K 的上拉电阻将单总线拉高,延时 15~60 us, 并进入接收模式(Rx)。接着 DS18B20 拉低总线 60~240 us,以产生低电平应答脉冲。

若为低电平,再延时 480 us。

使用特权

评论回复
7
大鹏2365|  楼主 | 2023-6-29 19:11 | 只看该作者
2. 写时序

        写时序包括写 0 时序和写 1 时序。所有写时序至少需要 60us,且在 2 次独立的写时序之间 至少需要 1us 的恢复时间,两种写时序均起始于主机拉低总线。写 1 时序:主机输出低电平, 延时 2us,然后释放总线,延时 60us。写 0 时序:主机输出低电平,延时 60us,然后释放总线, 延时 2us。

使用特权

评论回复
8
大鹏2365|  楼主 | 2023-6-29 19:11 | 只看该作者
3. 读时序

        单总线器件仅在主机发出读时序时,才向主机传输数据,所以 ,在主机发出读数据命令后, 必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要 60us,且在 2 次独立的读 时序之间至少需要 1us 的恢复时间。每个读时序都由主机发起,至少拉低总线 1us。主机在读时序期间必须释放总线,并且在时序起始后的 15us 之内采样总线状态。  

典型的读时序过程为: 主机输出低电平延时 2us,然后主机转入输入模式延时 12us,然后读取单总线当前的电平,然后延时50us。

注:所有的这些信号,除了应答脉冲以外,都是由主机发出的同步信号。并且发送的所有命令和数据都是低位在前。在写程序时,需要注意设置谁输入,谁输出,根据信号是由谁发   

使用特权

评论回复
9
大鹏2365|  楼主 | 2023-6-29 19:12 | 只看该作者
DS18B20结构
        DS18B20是由DALLAS半导体公司推出的一种 “一线总线” 接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。它工作在 3~5.5V 的电压范围。

使用特权

评论回复
10
大鹏2365|  楼主 | 2023-6-29 19:12 | 只看该作者
ROM中的64位序列号是出厂前被定义好的,它可以看做是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。

64位ROM的排列是:

        前8位是产品家族码,接着48位是DS18B20的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。

ROM的作用是:

        使每一个DS18B20都各不相同,以实现一根总线上挂接多个DS18B20。

使用特权

评论回复
11
大鹏2365|  楼主 | 2023-6-29 19:12 | 只看该作者
2.1 DS18B20操作流程
初始化:从机复位,主机判断从机是否响应

ROM操作:ROM指令+本指令需要的读写操作

功能操作:功能指令+本指令需要的读写操作

使用特权

评论回复
12
大鹏2365|  楼主 | 2023-6-29 19:12 | 只看该作者
DS18B20数据帧
温度变换:

        初始化--->跳过ROM--->开始温度变换

使用特权

评论回复
13
大鹏2365|  楼主 | 2023-6-29 19:12 | 只看该作者
温度读取:

        初始化--->跳过ROM--->读暂存器--->连续的读操作

使用特权

评论回复
14
大鹏2365|  楼主 | 2023-6-29 19:13 | 只看该作者
DS18B20典型的温度读取过程:

        复位→发 SKIP ROM 命令(0XCC)→发开始转换命令(0X44)→延时→复 位→发送 SKIP ROM 命令(0XCC)→发读存储器命令(0XBE)→连续读出两个字节数据(即 温度)→结束。

使用特权

评论回复
15
大鹏2365|  楼主 | 2023-6-29 19:13 | 只看该作者
温度存储格式
温度存储的寄存器是16位寄存器,LSB为寄存器的低8位,MSB为寄存器的高8位;

位15~位11:温度的状态位,因为温度是有正有负的。高5位为0时,表示温度是正的;高5位是1时,表示温度是负的;

位3~位0:用来存储温度的小数部分。因为温度不一定都是整数,可能会有小数。例如:位3表示0.5,位2表示0.25,位1表示0.125,位0表示0.0625

使用特权

评论回复
16
大鹏2365|  楼主 | 2023-6-29 19:13 | 只看该作者
注:DS18B20可以检测的温度范围是-55℃~+125℃;精度为±0.5℃。

使用特权

评论回复
17
大鹏2365|  楼主 | 2023-6-29 19:13 | 只看该作者
有关程序中温度的相关问题:

        1. 为什么温度寄存器中的高8位的二进制数大于7,就认为温度是负的?

        因为温度存储的寄存器是16位,高5位是温度状态位,高5位为0时,表示温度是正的;高5位为1时,表示温度是负的;
7的八位二进制是:0000 0111 ,对应的高5位正好是0,如果大于7,那么对应的二进制就是1111 1111 因为高5位是状态位,要么全为0,要么全为1

使用特权

评论回复
18
大鹏2365|  楼主 | 2023-6-29 19:16 | 只看该作者
      2. 温度从二进制数转换成十进制数,为什么乘以0.625?

        DS18B20的转换精度是9~12位,为了提高精度通常采用的都是12位,12位的最低位权是1/16=0.0625,所以说温度寄存器中的值都是以0.0625为步进的
        换言之就是:温度每波动一次都是要么+0.0625,要么-0.0625,而不会出现温度上升0.01,或者下降0.01的情况。
        所以温度寄存器中的值就是温度值的二进制乘以0.0625,得到的就是实际的十进制数;
        程序中之所以乘0.625是因为返回值返回的温度是-550~+1250,返回温度相对于实际的温度范围放大了十倍,所以转换的步进值也要放大10倍,即0.625

使用特权

评论回复
19
大鹏2365|  楼主 | 2023-6-29 19:17 | 只看该作者
硬件分析
温度传感器属于外部器件,所以做该实验时,需要购买DS18B20温度传感器模块接在开发板对应的位置。

使用特权

评论回复
20
大鹏2365|  楼主 | 2023-6-29 19:17 | 只看该作者
GND/NC:接地

DQ:单总线输入/输出引脚,DQ引脚连接在STM32的PG9引脚上

VCC:供电电源,3V~5.5V

注:1WIRE_DQ 和 DCMI_PWDN 是共用 PG9 的,所以他们不能同时使用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

656

帖子

0

粉丝