8、STM32_DS18B20_分析及实验

目录

1、DS18B20介绍

2、DS18B20的内部结构

3、DS18B20的内部存储器

4、DS18B20控制流程

5、程序中我们对温度测量的处理

PS:  ROM操作命令  和  RAM指令

1、DS18B20介绍

DS18B20是美国DALLAS公司推出的一款单线数字温度传感器。它具有:体积小,功耗低,精度高,可靠性好,易于单片机接口等优点,每片DS18B20都有唯一的一个可读出的序列号,同时DS18B20还采用了寄生电源技术,可以不用外接电源。综合以上特点,DS18B20特别适合于多点测温系统。

DS18B20主要有以下特点:

●单线接口:DS18B20与单片机连接时仅需一根I/O口线即可实现单片机与DS18B20之间的双向通信。

●实际使用中不需要任何外围元件。

●可用数据线供电,电压范围3.0-5.5V。测温范围-55-+125oC。

●可编程实现9-12位的数字读数方式。

●用户可设定的非易失性(掉电不丢失)的温度上下线报警值。

●支持多点组网功能,多个DS18B20可并联在唯一的三总线上,实现多点温度测量。

●负压特性:电源极性接反时不会烧坏DS18B20,但是也不能正常工作

 

TO-92封装的DS18B20的引脚排列见上图。

DS18B20引脚定义: 

(1)DQ为数字信号输入/输出端;

开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。 

(2)GND为电源地; 

(3)VDD为外接供电电源输入端,当工作于寄生电源时,此引脚必须接地。

电路和连接:

 

串口电路前面已经介绍,本例中不再重复。本例中DS18B20与单片机的连接如图所示,由于DS18B20的数据线要求空闲状态为高电平,所以我在DS18B20的数据线与电源线VCC之间加了一个4.7K的上拉电阻,如果不想接上拉电阻的话,可以使能PA2口的内部上拉功能。从图中可以看出,本例使用的是给DS18B20外接电源的方式。

 

 

2、DS18B20的内部结构

DS18B20的内部结构如图7.1.2。DS18B20的内部结构主要有64位ROM、温度灵敏元件、内部存储器和配置寄存器四部分组成。

 

     图7.1.2  DS18B20的内部结构

● 64位ROM:64位ROM的内容是64位序列号,是出厂前用激光刻好的。它可以用作该DS18B20的地址序列码。每一个DS18B20的64位ROM都不同,这样就可以实现一根总线上挂多个DS18B20的目的。这64位 ROM的排列是:开始8位是产品类型号,接着的48位是该DS18B20的自身的序列号,最后8位是前面56位的循环冗余(CRC,CRC=X8+X5+X4+1)校验码。

● 温度灵敏元件:温度灵敏元件完成对温度的测量,测量后的结果存储在两个8位的寄存器中,这两个寄存器定义如图7.1.3。温度寄存器高字节的高5位是符号位,温度为负时这5位为1;温度为正时,这5位为0。高字节寄存器的低3位与低字节寄存器的高4位组成温度的整数部分,低字节寄存器的低4位是温度的小数部分。当温度大于0时,温度值以原码存放。而当温度小于0时,以二进制补码形式存放。

   当转换位数为12位时,温度的精度为1/16(4位小数位,所以为16)=0.0625度。同理,当转换位数为11位时,精度为1/8=0.125度。

   对于温度的计算,以12位转换位数为例:对于正的温度,只要将测到的数值的整数部分取出,转换为10进制,再将小数部分乘以0.0625就可以得到10进制的小数位的温度值了。而对于负的温度,则需要将采集到的数值取反加1,即可得到实际温度的16进制表示。再按照正温度的计算方法就可以得出10进制的负的温度了。

  

              图7.1.3 DS18B20温度寄存器格式

   图7.1.4所示是在12位转换位数情况下的温度转换值和温度对照表

 

               图7.1.4  12位转换位数的温度转换值和温度对照表

 

两种供电方式:

 

 

使用寄生电源方式时,VDD 引脚必须接地。

VDD 引脚接入一个外部电源

接电源有点:

1、这样做的好处是 I/O线上不需要加强上拉,而且总线控制器不用在温度转换期间总保持高电平。这样在转换期间可以允许在单线总线上进行其他数据往来。

2、另外,在单线总线上可以挂任意多片 DS18B20,而且如果它们都使用外部电源的话,就可以先发一个Skip ROM 命令,再接一个 Convert T命令,让它们同时进行温度转换。

注意:

1、在外部供电的方式下,DS18B20的GND引脚不能悬空,否则不能转换温度,读取的温度总是85℃。

2、温度高于 100℃时, 不推荐使用寄生电源, 因为DS18B20 在这种温度下表现出的漏电流比较大,通讯可能无法进行。

在类似这种温度的情况下,强烈推荐使用 DS18B20 的 VDD 引脚。

 

 

 

 

 

 

 

 3、DS18B20的内部存储器

DS18B20的内部存储器包括一个告诉暂存RAM和一个非易失性的可电擦除的EEPROM,后者存放温度的上下限报警值和配置寄存器。

高速暂存RAM以及EEPROM的构成如图7.1.5所示。高速暂存RAM由9个字节组成,当温度转换命令发出后,经转换获得的温度值以二进制补码形式存放在第0(LSB)和第一(MSB)个字节内。单片机通过单线接口DQ读出该数据,读取时低位在前,高位在后。

 

第二和第三个字节是温度的上(TH)下限(TL)报警值,他们没有小数位,第四个字节是配置寄存器,主要用以设置工作模式和转换位数。

第五、第六和第七字节是保留位,没有实际意义,第八个字节是前面所有8个字节的CRC校验码。

 

EEPROM由3个字节构成,用来存放温度的上下限报警值以及配置寄存器的内容。

 

图7.1.5    高速暂存RAM以及EEPROM的构成

 

   配置寄存器的各位意义如图7.1.6所示。低五位的读出值总是为1,第7位是测试模式位,用于设置DS18B20是工作在测试模式还是工作模式,出厂时默认设置为0,用户不用改动。R1和R0用来设置温度转换位数。具体设置如图7.1.7所示。

 

                  图7.1.6  配置寄存器结构

 

                    图7.1.7  温度值转换位数设置表

 

4、  DS18B20控制流程

在由DS18B20构成的单总线系统中,DS18B20只能作为从机,单片机或者其它部件作为主机。

       根据DS18B20的通信协议,主机控制DS18B20完成一次温度转换必须经过3个步骤:

       一)、每次读写之前都要对DS18B20进行复位操作

       二)、复位成功后发送一条ROM指令 (器件寻址)

       三)、最后发送RAM指令,这样才能够对DS18B20进行正确的操作。

● 复位:复位要求主机将数据线拉低最少480us,然后释放,当DS18B20受到信号后,等待15-60us,然后把总线拉低60-240us,主机接收到此信号表示复位成功。

● ROM指令:ROM指令表明了主机寻址一个或多个DS18B20中的某个或某几个,或者是读取某个DS18B20的64位序列号。

● RAM指令:RAM指令用于主机对DS18B20内部RAM的操作(如启动温度转换、读取温度等)。

 

直入正题:

DS18B20的操作时序(本人查看数据手册和网上的例程,然后结合实际测试结果)

  1、DS18B20的初始化

  (1) 先将数据线置高电平“1”。

  (2) 延时(该时间要求的不是很严格,但是尽可能的短一点)。

  (3) 数据线拉到低电平“0”。

  (4) 延时490微秒(该时间的时间范围可以从480到960微秒)。

  (5) 数据线拉到高电平“1”。

  (6) 延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。

  (7) 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。

  (8) 将数据线再次拉高到高电平“1”后结束。  

  2、DS18B20的写操作

  (1) 数据线先置低电平“0”。

  (2) 延时确定的时间为2(小于15)微秒。

  (3) 按从低位到高位的顺序发送字节(一次只发送一位)。

  (4) 延时时间为62(大于60)微秒。

  (5) 将数据线拉到高电平,延时2(小于15)微秒。

  (6) 重复上(1)到(6)的操作直到所有的字节全部发送完为止。

  (7) 最后将数据线拉高。  

  3、 DS18B20的读操作

  (1)将数据线拉高“1”。

  (2)延时2微秒。

  (3)将数据线拉低“0”。

  (4)延时2(小于15)微秒。

  (5)将数据线拉高“1”,同时端口应为输入状态。

  (6)延时4(小于15)微秒。

  (7)读数据线的状态得到1个状态位,并进行数据处理。

  (8)延时62(大于60)微秒。

  

畅学STM32串口显示程序:

复位:

 

温度传感器检测:

 

 

写操作:

 

读操作:

读一个位:

 

 

读一个字节:

 

 

 

1、DS18B20的初始化

2、DS18B20的写操作

3、DS18B20的读操作

 

1、过程1、2是初始化过程,每次读取都要初始化,否则18b20处于待机状态,无法成功读取。

过程1:拉低信号线480-700us,使它复位,然后释放总线15-60us,

18b20会拉低总线60-240us,然后它释放总线。所以初始化成功的一个标志就是能否读到18b20这个先低后高的操作时序。

注意:黑色部分表示主机操作,蓝色部分表示18b20操作,每次主机操作完成之后等待18b20状态时,必须要释放总线,比如将IO设置为高阻态什么的。否则18B20没法把状态写到线上

2、过程3、4是写1bit数据过程。过程3是写0 ,过程4是写1。

过程3:拉低总线60us,然后抬高总线5us,完成。

过程4:拉低总线5us,然后抬高总线60us,完成

3、过程5、6是读1bit过程。过程5是读0,过程6是读1。

过程5、6:拉低总线5us,然后释放总线,读取总线,如果为0,则读入0,如果为1,则读入1。

 

 

5、程序中我们对温度测量的处理是:

1)复位(假定复位成功,不检测复位是否成功),

2)发送跳过ROM指令(我们系统只连接了一个DS18B20,所以可以使用这条指令),

3)发送温度转换命令(我们采用DS18B20默认的12位温度转换,所以不用对DS18B20进行任何配置,直接指示DS18B20开始采集温度),

4)延时1S,等待DS18B20完成温度采集(默认12位温度转换时,采集一次温度的时间为750ms,所以至少要延时750ms以上),

5)复位(每次对DS18B20进行操作都要进行复位、ROM操作、RAM操作这三个步骤),

6)发送跳过ROM指令

7)发送读内部RAM命令(这个指令读取DS18B20中RAM的全部9个字节,而我们只需要得到温度值就可以了,温度值存储在RAM的前两个字节里面,所以我们读取完前两个字节的内容后可以不必理会后面的内容),

8)将采集到的温度值进行处理(判断温度的正负,分离温度的整数位和小数位),然后将处理后的数据发送到串口。

9)延时4S,然后跳到步骤1),重复步骤1)-8),完成下一次温度测量

 

温度转换

 

读取RAM

 

 

畅学STM32对应程序:

温度转换:

 

 

读暂存器:

 

从ds18b20得到温度值:

 

这里注意的字节问题,tem 返回的是双字节的数据,得到返回值之后,对数据再做处理。

 

其中对负数也做了一个判断与处理,至于取反之后没有加1,这是一个问题。

因为加1,就设计到一个低字节到高字节的仅为问题,可以好好思考一下:

给一个AVR的进位涉及的程序:

 

主函数中还有的字节处理:

其中注释的部分为没有小数点的部分

 

这里用了我用了 强制转换, 变成了单字节,因为OLED显示函数的参数,之前写的时候就是一个字节的函数,所以不进行强制转换的话,返回造成错误。。。

应该有其他的解决方案,暂时用的这个!

 

PS:还有一个问题,这里没有对温度为负数,做出什么反应,只是一个判断问题,不做过多介绍。

 

 问题注意地方:

字节对齐问题

器件识别

温度为负数情况

时序问题 (特别是延时时间)

 

基本配置程序:

 

 

 

       1、ROM操作命令:DS18B20采用一线通信接口。因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。一旦总线检测到从属器件的存在,它便可以发出器件ROM操作指令,所有ROM操作指令均为8位长度,主要提供以下功能命令: 

1 )读ROM(指令码0X33H):当总线上只有一个节点(器件)时,读此节点的64位序列号。如果总线上存在多于一个的节点,则此指令不能使用。

 2 )ROM匹配(指令码0X55H):此命令后跟64位的ROM序列号,总线上只有与此序列号相同的DS18B20才会做出反应;该指令用于选中某个DS18B20,然后对该DS18B20进行读写操作。

3 )搜索ROM(指令码0XF0H): 用于确定接在总线上DS18B20的个数和识别所有的64位ROM序列号。当系统开始工作,总线主机可能不知道总线上的器件个数或者不知道其64位ROM序列号,搜索命令用于识别所有连接于总线上的64位ROM序列号。

4 )跳过ROM(指令码0XCCH): 此指令只适合于总线上只有一个节点;该命令通过允许总线主机不提供64位ROM序列号而直接访问RAM,以节省操作时间。

5 )报警检查(指令码0XECH):此指令与搜索ROM指令基本相同,差别在于只有温度超过设定的上限或者下限值的DS18B20才会作出响应。只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值,或者改变TH或TL的设置使得测量值再一次位于允许的范围之内。储存在EEPROM内的触发器用于告警。

这些指令操作作用在每一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。

  2、RAM指令

    DS18B20有六条RAM命令: 

  1)温度转换(指令码0X44H):启动DS18B20进行温度转换,结果存入内部RAM。 

  2)读暂存器(指令码0XBEH):读暂存器9个字节内容,此指令从RAM的第1个字节(字节0)开始读取,直到九个字节(字节8,CRC值)被读出为止。如果不需要读出所有字节的内容,那么主机可以在任何时候发出复位信号以中止读操作。

  3)写暂存器(指令码0X4EH): 将上下限温度报警值和配置数据写入到RAM的2、3、4字节,此命令后跟需要些入到这三个字节的数据。 

  4)复制暂存器(指令码0X48H):把暂存器的2、3、4字节复制到EEPROM中,用以掉电保存。 

  5)重新调E2RAM(指令码0XB8H):把EEROM中的温度上下限及配置字节恢复到RAM的2、3、4字节,用以上电后恢复以前保存的报警值及配置字节。

6)读电源供电方式(指令码0XB4H):启动DS18B20发送电源供电方式的信号给主CPU。对于在此命令送至DS18B20后所发出的第一次读出数据的时间片,器件都会给出其电源方式的信号。“0”表示寄生电源供电。“1”表示外部电源供电。

 

 

州仔 发表于08-21 13:51 浏览9172次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

州仔
州仔(总统)
金币:3352个|学分:91545个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号