完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
DS18B20单线数字温度计详解
声明:文章内容为原始创作,转载请注明转自微信公众号:AutoCodes。 今天向大家详细介绍一款比较简单的测温芯片——DS18B20,我们尽量做到“讲解精细化”,让初学者能够在最短时间操作这款芯片。 文章针对单只芯片的VDD供电模式(外部供电模式)进行讲解,对寄生电源模式以及多只芯片不做太多说明。 文中对每部分的侧重点(也就是新手想快速使用芯片须知道的东西)进行了标注,以方便快速对芯片进行上手使用,但从学习的角度,能够更加清晰全面的了解芯片的相关知识更重要! 网上众多资料用DS1820的资料混淆DS18B20资料,两者仅有略微差别! 第一部分:芯片特征(可直接跳过) △ 独特的单线接口仅需一个端口引脚进行通讯 △ 每个器件有唯一的 64 位的序列号存储在内部存储器中 △ 简单的多点分布式测温应用 △ 无需外部器件 △ 可通过数据线供电。供电范围为3.0V到5.5V。 △ 测温范围为-55~+125℃(-67~+257℉) △ 在-10~+85℃范围内精确度为±0.5 ℃ △ 温度计分辨率可以被使用者选择为9~12位 △ 最多在 750ms 内将温度转换为 12 位数字 △ 用户可定义的非易失性温度报警设置 △ 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件 △ 与DS1822兼容的软件 △ 应用包括温度控制、工业系统、消费品、温度计或任何热感测系统 第二部分:DS18B20的封装和引脚定义(只需要知道TO-92封装的三个引脚) DS18B20芯片的常见封装为TO-92,同时还有的封装是SO(DS18B20Z)和μSOP(DS18B20U)形式,图1为DS18B20三种封装的图示及引脚图。 图1 寄生电源概念: DS18B20可以工作在没有外部电源供电的情况下。当总线处于高电平状态,DQ与上拉电阻连接通过单总线“窃取能量”,并将偷来的能量储存到寄生电源储能电容中,当总线为低电平时释放能量,对器件供电。这种提供能量的形式被称为“寄生电源”,当DS18B20工作在寄生电源模式时,VDD必须接地。作为替代选择,DS18B20同样可以通过VDD引脚连接外部电源供电。 第三部分:DS18B20的电路连接方式(可直接跳过,只需要知道外部电源模式怎样接线) (1)寄生电源模式下的单只DS18B20芯片连接图 图2 (以下四段落内容不懂可以直接跳过,进行大概学习后再回来阅读) 寄生电源模式下,单总线和Cpp在大部分操作中能提供充分的满足规定时序和电压的电流给DS18B20。然而,当DS18B20正在执行温度转换或从高速暂存器向EPPROM传送数据时,工作电流可能高达1.5mA。这个电流可能会引起连接单总线的弱上拉电阻的不可接受的压降,这需要更大的电流,而此时Cpp无法提供。为了保证DS18B20有充足的供电,当进行温度转换或拷贝数据到EEPROM操作时,必须给单总线提供一个强上拉。用漏极开路把I/O直接拉到电源上就可以实现,见图2。在发出温度转换指令[44h]或拷贝暂存器指令[48h]之后,必须在至多10us之内把单总线转换到强上拉,并且在温度转换时序或拷贝数据时序必须一直保持为强上拉状态。当强上拉状态保持时,不允许有其它的动作。 单总线通常要求外接一个约4.7KΩ的上拉电阻,,这样当总线闲置时,其为高电平。 (2)外部电源模式下的单只DS18B20连接图 图3 对DS18B20供电的另一种传统办法是从VDD引脚接入一个外部电源,见图3。这样做的好处是单总线上不需要强上拉。而且总线不用在温度转换期间总保持高电平。 温度高于100℃时,不推荐使用寄生电源,因为DS18B20在这种温度下表现出的漏电流比较大,通讯可能无法进行。在类似这种温度的情况下,强烈推荐使用DS18B20的VDD引脚。 对于总线控制器不知道总线上的DS18B20是用寄生电源还是用外部电源的情况, DS18B20 预备了一种信号指示电源的使用意图。总线控制器发出一个 Skip ROM指令[CCh],然后发出读电源指令[B4h],这条指令发出后,控制器发出读时序,寄生电源会将总线拉低,而外部电源会将总线保持为高。如果总线被拉低,总线控制器就会知道需要在温度转换期间对单总线提供强上拉。 第四部分:DS18B20内部寄存器解析及工作原理(本部分有个大致了解) 通过以上我们知道了DS18B20的引脚及其接线方式就够了。现在我们来看一下DS18B20的内部寄存器。 1、DS18B20内部寄存器框图 从框图可知,DS18B20主要数据部件: (1)64位只读激光ROM (2)高速暂存器RAM (3)EEPROM (4)存储器控制逻辑 (此处网上很多资料翻译为“存储器与控制逻辑”,这个“控制逻辑”我可以理解为译码什么的,这点有糊涂,但“存储器”这个困扰了我好久,直到去查找了英文版的数据手册为“MEMORY CONTROL LOGIC”,这个翻译是不是“存储器控制逻辑”呢!!!!这样理解会稍微顺一些吧,网上翻译为“存储器与控制逻辑的”都没对这个展开说,进行了回避,这样做学问不谨慎吧!!!! 我认为此处应该译为“存储器控制逻辑”,但我也不清楚“存储器与控制逻辑”是什么意思,暂理解为译码之类的,本着严谨治学的态度,不对此多说,不能误导读者!!!!希望有了解的不吝赐教!!我们的微信公众号:AutoCodes万分感谢!!!) (5)8位循环冗余校验码发生器 (6)配置寄存器 第一:64位激光ROM及ROM操作指令 每一DS18B20包括一个唯一的64位长的ROM编码,开绐的8位是单线产品系列编码(就是这个家族的编号),接着的48位是唯一的系列号,最后的8位是开始56位的CRC码(循环冗余校验码)。 我们之前说过可以实现多只芯片的测温,每只芯片的48位序列号是唯一的,所以单片机可以通过此序列号知道该去操作哪只芯片。本文不涉及多只芯片内容。 与 DS1820 的通信经过一个单线接口,在单线接口情况下,在 ROM 操作未稳定建立之前不能使用存贮器和控制操作,主机必须首先提供五种 ROM 操作命令之一: 1 Read ROM(读 ROM) 33H 此命令允许总线主机读DS18B20的8位产品系列编码,唯一的48位序列号,以及8位的CRC。此命令只能在总线上仅有一个DS18B20的情况下可以使用。如果总线上存在多于一个的从属器件,那么当所有从片企图同时发送时将发生数据冲突的现象(漏极开路会产生线与的结果)。 2 Match ROM(符合 ROM) 55H 此命令后继以64位的ROM数据序列,允许总线主机对多点总线上特定的DS18B20寻址。只有与64位ROM序列严格相符的DS18B20才能对后继的存贮器操作命令作出响应。所有与64位ROM序列不符的从片将等待复位脉冲。此命令在总线上有单个或多个器件的情况下均可使用。 3 Search ROM(搜索 ROM) F0H 当系统开始工作时,总线主机可能不知道单线总线上的器件个数或者不知道其64位ROM编码。搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。 4Skip ROM(跳过 ROM) CCH 在单点总线系统中,此命令通过允许总线主机不提供64位ROM编码而访问存储器操作来节省时间。如果在总线上存在多于一个的从属器件而且在Skip ROM命令之后发出读命令,那么由于多个从片同时发送数据,会在总线上发生数据冲突(漏极开路下拉会产生线与的效果)。 5 AlarmSearch(告警搜索) ECH 此命令的流程与搜索ROM命令相同。但是,仅在最近一次温度测量出现告警的情况下,DS18B20才对此命令作出响应。告警的条件定义为温度高于TH 或低于TL。只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值或者改变TH或TL的设置,使得测量值再一次位于允许的范围之内。贮存在EEPROM内的触发器值用于告警。 这些命令对每一器件的 64 位激光 ROM 部分进行操作,如果在单线上有许多器件,那么可以挑选出一个特定的器件,并给总线上的主机指示存在多少器件及其类型。 上面的ROM操作命令我们多用 Skip ROM(跳过 ROM)。 第二:高速暂存RAM及RAM操作指令 1、高速暂存RAM 在执行完ROM操作命令后,我们需要进行的就是RAM操作命令,我们先来认识一下高速暂存RAM。 暂存器由9个字节组成。 第1第2两个字节包含测得温度信息,温度传感器(温度灵敏元件)测得的温度值被存储到高速暂存器的这两个字节(温度寄存器)。 以12位精度存储温度,最高位为符号位,负温度S=1,正温度S=0。将存储器中的二进制数求补再转换成十进制数乘以精度(0.5、0.25、0.0625)就得到被测温度值。如0550H为+85℃,0191H为+25.0625℃,FC90H为-55℃,上电初始为+85℃。 第3和第4个字节是 TH 和 TL 的易失性拷贝(从EEPROM拷贝到高速暂存器这两个字节),在每一次上电复位时被刷新; 第5个字节是配置寄存器,如图,用户可按照“温度计精确度配置”表,来修改R1R2的值,来设定DS18B20的精度,上电默认设置R1R0=11(12位精度),配置寄存器的其他为均保留,禁止写入; 第6、7、8字节被保留,禁止写入; 第9个字节是只读的,包含以上八个字节的CRC码; 2、RAM操作指令 再看一下RAM操作指令(功能指令) 在发送ROM操作指令后,下一步需要进行RAM操作指令。这些指令允许总线控制器读写DS18B20的暂存器,发起温度转换和识别电源模式。DS18B20的功能指令详见下文。 CONVERTT [44h] (温度转换指令) 这条命令用以启动一次温度转换。温度转换指令被执行,产生的温度转换结果数据以2个字节的形式被存储在高速暂存器中,而后DS18B20保持等待状态。如果寄生电源模式下发出该命令后,在温度转换期间(tconv),必须在10us(最多)内给单总线一个强上拉。如果DS18B20以外部电源供电,总线控制器在发出该命令后跟着发出读时序,DS18B20如处于转换中,将在总线上返回 0,若温度转换完成,则返回 1。寄生电源模式下,总线被强上拉拉高前这样的通讯技术不会被使用。 WRITESCRATCHPAD [4Eh] (写暂存器指令) 这条命令向 DS18B20 的暂存器写入数据,开始位置在 TH 寄存器(暂存器的第 2个字节),接下来写入 TL 寄存器(暂存器的第 3 个字节),最后写入配置寄存器(暂存器的第 4 个字节)。数据以最低有效位开始传送。上述三个字节的写入必须发生在总线控制器发出复位命令前,否则会中止写入。 READSCRATCHPAD [BEh] (读暂存器指令) 这条命令读取暂存器的内容。读取将从字节0 开始,一只进行下去,知道第9字节(字节 8,CRC)读完,如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。 COPYSCRATCHPAD [48h] (拷贝暂存器指令) 这条命令把 TH,TL 和配置寄存器(第 2、3、4 字节)的内容拷贝到 EEPROM中。如果使用寄生电源总线控制器必须在发出这条命令的 10us 内启动强上拉并最少保持10ms。 RECALL E2[B8H] (召回 EEPROM 指令) 这条命令把报警触发器的值(TH和TL)以及配置数据从EEPROM拷回暂存器。总线控制器在发出该命令后读时序,DS18B20会输出拷回标识:0标识正在拷回,1标识拷回结束。这种拷回操作在DS18B20上电时自动执行,这样器件一上电暂存器里马上就存在有效的数据了。 READ POWERSUPPLY [B4h] (读电源模式指令) 总线控制器在这条命令发给DS18B20后发出读时序,若是寄生电源模式,DS18B20将拉低总线,若是外部电源模式,DS18B20将会把总线拉高。 说明: 1. 对于寄生电源模式下的DS18B20,在温度转换和拷贝数据到EEPROM期间,必须给单总线一个强上拉。总线上在这段时间内不能有其它活动。 2. 总线控制器在任何时刻都可以通过发出复位信号中止数据传输。 第三:EEPROM 这一部分网上很多资源存在一个小的错误,一些资料中,在前面介绍时用“EEPROM”,但是到了下图的标注时,却用了“EEPRAM”,前后矛盾!我们在使用数据手册时要注意查找官方原版,更正版等,确保信息的准确,我们在查找了原版后确认此处应该是“EEPROM”,在此给大家推荐一个网址用于查找数据手册,查找时要多看几份,因为即使是原版也存在错误,会有更正。 http://www.alldatasheet.com EEPROM中的数据在器件掉电时仍然保存,上电时,数据被载入暂存器,数据也可以通过召回EEPROM命令从暂存器载入EEPROM。 DS18B20完成一次温度转换后,就拿温度值和存储在TH和TL中的值进行比较,因为这些寄存器都是8位的,所以0.5℃位被忽略不计。如果测得的温度高于TH或低于TL,器件内部就会置位一个报警标识。每进行一次测温就对这个标识进行一次更新。当报警标识置位时,DS1820 会对报警搜索命令有反应。这样就允许许多 DS1820 并联在一起同时测温,如果某个地方的温度超过了限定值,报警的器件就会被立即识别出来并读取,而不用读未报警的器件。 第四:CRC 发生器 DS1820 中有 8 位 CRC 存储在 64 位 ROM 的最高有效字节中。总线控制器可以用 64 位 ROM 中的前 56 位计算出一个 CRC 值,再用这个和存储在 DS1820 中的值进行比较,以确定 ROM 数据是否被总线控制器接收无误。CRC 计算等式如下: CRC=X^8+X^5+X^4+1 DS1820 同样用上面的公式产生一个 8 位 CRC 值,把这个值提供给总线控制器用来校验传输的数据。在任何使用 CRC 进行数据传输校验的情况下,总线控制器必须用上面的公式计算出一个 CRC 值,和存储在 DS1820 的64 位 ROM 中的值或 DS1820 内部计算出的 8 位 CRC 值(当读暂存器时,做为第 9 个字节读出来)进行比较。CRC 值的比较以及是否进行下一步操作完全由总线控制器决定。当在DS1820中存储的或由其计算的 CRC值和总线控制器计算的值不相符时, DS1820 内部并没有一个能阻止命令序列进行的电路。 第五部分:DS18B20处理顺序·经过单线接口访问DS18B20的协议(protocol)如下: ·初始化 ·ROM操作命令 ·存储器操作命令 ·处理数据 1. 初始化 DS1820 需要严格的协议以确保数据的完整性。协议包括几种单线信号类型:复位脉冲、存在脉冲、写 0、写 1、读 0 和读 1。所有这些信号,除存在脉冲外,都是由总线控制器发出的。 和 DS1820 间的任何通讯都需要以初始化序列开始。 初始化序列包括一个由总线控制器发出的复位脉冲和其后由从机发出的存在脉冲。 总线控制器发出(TX)一个复位脉冲(一个最少保持 480μs 的低电平信号),然后释放总线,进入接收状态(RX)。单线总线由 5K 上拉电阻拉到高电平。探测到 I/O 引脚上的上升沿后, DS1820 等待 15~60μs,然后发出存在脉冲(一个 60~240μs 的低电平信号)。存在脉冲让总线控制器知道DS18B20在总线上且已经做好准备。 初始化过程“复位和存在脉冲” 大家注意看图,实粗线是我们的单片机 IO 口拉低这个引脚,虚粗线是 DS18B20 拉低这个引脚,细线是单片机和 DS18B20 释放总线后,依靠上拉电阻的作用把 IO 口引脚拉上去。51 单片机释放总线就是给高电平。 主机总线t0时刻发送一复位脉冲(最短480us低电平信号),接着在t1时刻主机释放总线并进入接受状态,DS18B20在检测到总线的上升沿后,等待15~60us,接着DS18B20在t2时刻发出存在脉冲(持续60~240us的低电平),而后DS18B20主动释放总线,I/O口会被上拉电阻自动拉高。 详细解释程序: 首先,由于 DS18B20 时序要求非常严格,所以在操作时序的时候,为了防止中断干扰总线时序,先关闭总中断(此处可忽略,未使用中断)。然后第一步,拉低 DS18B20 这个引脚,持续 500us;第二步,延时 60us;第三步,读取存在脉冲,并且等待存在脉冲结束。 /************************************************************ * 函数名称 : Init_DS18B20 * 函数功能 : DS18B20初始化函数 * 输入参数 : 无 * 返回参数 : 检测到DS18B20返回1,未检测到模块返回0 *************************************************************/ bit Init_DS18B20() { bit DS18B20_flag= 1; //初始化成功与否标志 DQ = 1; //复位前准备 delay_10nus(1); //延时10us DQ = 0; //发送复位脉冲(DQ拉低) delay_10nus(50); //并延时480~960us(500us) DQ = 1; //拉高,释放总线,同时IO口产生的上升沿能被DS18B20所检测到,控制器进入接收状态 delay_10nus(6); //等待15~60us,接收到低电平存在脉冲 if(DQ) //没接收到,初始化失败 DS18B20_flag =0; else DS18B20_flag =1; //接收到存在脉冲,初始化成功 delay_10nus(24); //延时达240us,让DS18B20释放总线 DQ = 1; return DS18B20_flag; } 2、ROM操作命令 在说ROM操作命令之前,先说“写时间隙”和“读时间隙”。 读/写时序 DS18B20的数据读写是通过时序处理位来确认信息交换的。 写时序 由两种写时序:写 1 时序和写 0 时序。总线控制器通过写 1 时序写逻辑 1 到DS18B20,写 0 时序写逻辑 0 到 DS18B20。所有写时序必须最少持续 60us,包括两个写周期之间至少1us的恢复时间。当总线控制器把数据线从逻辑高电平拉到低电平的时候,写时序开始。 写时序 总线控制器要生产一个写时序,必须把数据线拉到低电平然后释放,在写时序开始后的15us内释放总线。当总线被释放的时候,5K的上拉电阻将拉高总线。总控制器要生成一个写0时序,必须把数据线拉到低电平并持续保持(至少60us)。 总线控制器初始化写时序后,DS18B20在一个15us到60us的窗口内对I/O线采样。如果线上是高电平,就是写1。如果线上是低电平,就是写0。 通俗点程序解释: 当要给 DS18B20 写入 0 的时候,单片机直接将引脚拉低,持续时间大于 60us 小于 120us就可以了。图上显示的意思是,单片机先拉低 15us 之后,DS18B20 会在从15us 到 60us 之间的时间来读取这一位,DS18B20最早会在 15us 的时刻读取,典型值是在 30us 的时刻读取,最多不会超过 60us,DS18B20 必然读取完毕,所以持续时间超过 60us 即可。 当要给 DS18B20 写入 1 的时候,单片机先将这个引脚拉低,拉低时间大于 1us,然后马上释放总线,即拉高引脚,并且持续时间也要大于 60us。和写 0 类似的是,DS18B20 会在15us到 60us 之间来读取这个 1。 /************************************************************ * 函数名称 : DS18B20_Write * 函数功能 : 写时隙 * 输入参数 : 一字节数据write_data * 返回参数 : 无 *************************************************************/ void DS18B20_Write(uchar write_data) { uchar i=0; for (i=8; i>0;i--) { DQ = 0; //总线拉低,产生写时间隙 DQ =write_data & 0x01; //最低位放入总线 delay_10nus(10); //100us DQ = 1; //释放总线 write_data>>=1; } } 读时序 总线控制器发起读时序时,DS18B20仅被用来传输数据给控制器。因此,总线控制器在发出读暂存器指令[BEh]或读电源模式指令[B4H]后必须立刻开始读时序,DS18B20可以提供请求信息。除此之外,总线控制器在发出发送温度转换指令[44h]或召回EEPROM指令[B8h]之后读时序,详见DS18B20 RAM操作指令。 所有读时序必须最少60us,包括两个读周期间至少1us的恢复时间。当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持 1us,然后总线被释放。在总线控制器发出读时序后,DS18B20 通过拉高或拉低总线上来传输1或0。当传输逻辑0结束后,总线将被释放,通过上拉电阻回到上升沿状态。从DS18B20输出的数据在读时序的下降沿出现后15us内有效。 因此,总线控制器在读时序开始后必须停止把 I/O脚驱动为低电平15us,以读取I/O脚状态。 当要读取 DS18B20 的数据的时候,我们的单片机首先要拉低这个引脚,并且至少保持1us 的时间,然后释放引脚,释放完毕后要尽快读取。从拉低这个引脚到读取引脚状态,不能超过 15us。大家从图可以看出来,主机采样时间,也就是 MASTER SAMPLES,是在 15us 之内必须完成的,读取一个字节数据的程序如下。 /************************************************************ * 函数名称 : DS18B20_Read * 函数功能 : 读时隙 * 输入参数 : 无 * 返回参数 : 一字节数据read_data *************************************************************/ uchar DS18B20_Read() { uchar i=0; uchar read_data = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 read_data>>=1; DQ = 1; //结束低电平脉冲,等待DS18B20输出数据 if(DQ) //如果输出1,则更新read_data;如果输出0,则保持read_data不变,直接移位 read_data|=0x80; delay_10nus(10); } return(read_data); } 3、RAM操作命令 参见“高速暂存RAM及RAM操作指令”一节,对读写0时隙有清楚理解后这部分没有问题! 4、数据处理 参见“基于51单片机的DS18B20数字温度计16管脚LCD12864液晶显示程序”,程序公布于微信公众号:AutoCodes 第六部分:小结我们来总结一下上面的内容 第一步:接线 第二步:初始化 第三步:ROM操作命令 ROM操作命令总共5个,实际上是干嘛的呢?就是对64位激光ROM进行操作,通过唯一的序列号可以去查总线上有多少个测温芯片、可以通过筛选对其中一个进行操作、可以在有报警时查找哪只芯片报警、可以读出序列号,当然也可以直接跳过ROM操作(跳过ROM命令),我们对一个DS18B20进行操作,多数使用跳过ROM指令; 第三步:RAM操作(功能操作)命令 6个,可以发出温度转换指令,发出后芯片就可以转换温度了,温度值就保存在0、1两个字节中;也可以写RAM的2、3、4字节,就是写TH、TL、配置寄存器三个;写入的2、3、4字节可以再拷贝到EEPROM中;也可以从EEPROM拷贝到暂存RAM中;还可以读电源模式(外部供电和寄生电源供电);当然还可以从1字节读到9字节;一条控制操作命令指示 DS1820 完成一次温度测量。测量结果放在DS1820 的暂存器里,用一条读暂存器内容的存储器操作命令可以把暂存器中数据读出。 第四步:数据处理 读出16位二进制数据后,需要结合有关数据特性判断温度正负,输出数据等操作。详细资料请关注微信公众号:AutoCodes -------------------------------------------------------------------------- 本人知识掌握水平一般,理解能力一般,表达水平一般,以上内容如有错误还烦请大佬指点!不胜感激!补充内容 (2018-8-11 12:15): 欢迎关注微信公众号:依法编程 获取更多资料! |
|
相关推荐
|
|
欢迎关注微信公众号:依法编程
获取更多资料! |
|
|
|
|
|
《DNESP32S3使用指南-IDF版_V1.6》 第十六章 WATCH_DOG实验
460 浏览 0 评论
【敏矽微ME32G070开发板免费体验】+ADC测试与LED点亮
418 浏览 0 评论
飞凌嵌入式-ELFBOARD ELF 2的硬件知识分享--核心板
352 浏览 0 评论
【敏矽微ME32G070开发板免费体验】\\+Lora通信终端产品开发项目
514 浏览 0 评论
1576 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11970 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 21:48 , Processed in 0.814412 second(s), Total 65, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号