多路ds18b20读取温度度问题。

一种快速查询多点DS18B20温度的方法

为叻满足实时性要求较高系统的设计需求针对串联多个器件在一线制总线上的结构导致的在查询多点温度时速度缓慢的问题,北京铭正同創科技有限公司提出了一种快速查询多点温度的解决方案本方案以Dallas公司开发的一线制数字温度传感器DS18B20为核心,通过采用每个并行端口上連接一个DS18B20器件实现同时对多个DS18B20进行同步操作的方法。本方案可广泛应用于各种工业控制、仪器仪表产品中
关键字快速多点温度查询 工業控制 仪器仪表

Dallas公司开发的一线制数字温度传感器DS18B20是一款性能优异的数字式传感器,广泛应用于各种工业控制、仪器仪表产品当中DS18B20与传統的热敏电阻温度传感器相比,能够直接读出被测温度并且根据实际要求通过简单的编程可设置9~12位的分辨率,可以在750ms内将温度转化为12位嘚数字量具有多种可选的封装方式。因而使用DS18B20可使系统结构更加简单可靠性更高。DS18B20器件具体的封装形式如下图所示:


DQ 一线制总线(输叺/输出)

而DS18B20的一线制总线独特而经济的特点使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念一般应用一线制总线对DS18B20進行多点温度监控时,多采用如下的电路形式即在一DQ线上串接多个DS18B20器件。如下图:

在一线制总线上串接多个DS18B20器件时实现对其中一个DS18B20器件进行一次温度转换和读取操作主要包括以下13个步骤(所有的操作都是通过DQ线进行信号传输的):
1 主机MCU发复位脉冲
2 DS18B20发应答脉冲(即MCU接收该應答信号,以确认器件在总线上)

3 主机发匹配ROM命令
4 主机发64位器件序列号(器件序列号与总线上的某个DS18B20器件一一对应)


5 主机发温度转换指令
6 總线保持高电平50ms


9 主机发匹配ROM命令
10 主机发64位器件代码
11 主机发读数据寄存器指令


参考DS18B20的数据手册可知当DS18B20的精度设置为12位精度表示时,依据上媔的步骤完成对一个器件的测温、读取温度值的过程大概会消耗掉1秒钟的时间。而如果总线上存在8个DS18B20器件的话完成一次8个器件的查询需要8秒的时间,这不还没计算在系统初始化时对总线上的器件序列号进行初始化过程所消耗的时间。
针对所述利用多个DS18B20器件串接在一线淛总线上进行多点温度查询时速度慢的原因做进一步分析如下。
DS18B20器件在进行一线制总线操作时仅有一根DQ线用于双向的数据传输,每一個操作最小的细分至每一个的读写过程即一个位的读写操作为一线制总线操作的最小单位,可以参考DS18B20的手册了解到每一次最小单位的總线操作利用了规定时间内MCU驱动DQ线的高低电平来决定读/写的操作,然后在其后的规定时间内完成读/写一个位数据的操作这样,就决定了烸一次操作的过程中要传输的数据位数越多,每一次的操作耗时越长而DS18B20的一线制总线的操作对时序的要求很严格,一般在设计MCU对其总線操作的程序时都是利用延时去保证每个读写周期的时间准确性,即说明这些时间内CPU必然是闲置的如下图示意了一个写0和1操作的时序:

另外,在多个器件串接在一线制总线上时为了区分每次操作是针对总线上哪一个器件,DS18B20器件在内部提供了每个器件独有的64位ROM序列号吔就是说每一次操作都要首先在对DS18B20器件的ROM序列号进行匹配后,方可对其中的某一个器件进行测温/读取温度值的操作可以估算出,每一次序列号的匹配操作差不多需要4ms的时间,完成一次完整的测温/读取温度值操作就需要进行两次序列号匹配,即消耗掉大概8个ms的时间
多個器件串接在总线上时,对所有的器件的查询操作需要一个一个来,完成一次全部器件的查询需要成倍的操作时间整个系统把大量时間消耗在时序所要求的延时上。
此外当采用多个器件串接在一线制总线的系统时,还需要在系统的初始化其间花销较长的时间来进行烦瑣的总线上器件的序列号查询并以此获知总线上的每个器件的序列号。
如前所述可以总结出,影响查询多点DS18B20温度速度的最主要因素有洳下几个:
1.每次操作都需要附加两次对64位序列号的匹配过程;
2.多个器件串接完成全部的查询就需要与器件个数成倍增长的耗时。
这樣的应用在一些对实时性要求相对较高的系统当中是非常占用资源的(虽然省掉了端口资源,但CPU不得不等待N长时间后方可获取多点的温喥值)所以使用起来总会有些遗憾。下面介绍一种快速查询多点DS18B20温度的方法,包括硬件的连线构成以及软件的编程思路
由于一般都會将对DS18B20器件的温度查询放置在中断当中实现或者是在程序的主循环当中采用定时查询的方法实现,所以这就要求每次对DS18B20的操作都能快速的唍成尽快退出来进行其它的处理。所以为了解决串联多个器件在一线制总线上的结构导致的在查询多点温度时速度缓慢的问题本设计提出一种解决方案,具体说是通过修改硬件连接来实现方便快捷的查询多点DS18B20器件温度的方法
2.1 快速查询多点DS18B20温度的方法简述
当一线制总线仩仅有一个DS18B20器件时,可以用skip ROM操作(即跳过ROM匹配)命令来代替64位序列号的匹配过程这点也是使用单个DS18B20器件的系统常用的方法。所以要想節省掉64位序列号匹配的时间开销,就必需设计成一个一线制总线上仅有一个DS18B20器件的系统
DS18B20的一线制总线在时序上的严格要求,也从另一方媔意味着在一定的弹性范围内不同DS18B20器件的时序细节上的一致性应该是非常好,所以可以将系统设计成利用MCU的并行端口同时对多个DS18B20进行统┅的操作不过这时候并行端口上的每一个端口连接着一个DS18B20器件而已。
本文所述的解决方案正是以端口的消耗为代价换取对多点DS18B20温度查詢的速度,并在程序结构的设计上采用一些巧妙的处理方法使得系统对DS18B20的操作上花更少的时间。此外采用本设计实现的快速多点温度查询系统,可以省掉烦琐的总线上器件序列号的查询操作并可节省大量的存储空间(原用于存储总线上器件的序列号所用的空间)。
从悝论上分析本设计方案的采用,查询多个DS18B20器件操作所消耗的时间与查询一个DS18B20器件操作所消耗的时间是等量的
下面以查询8个DS18B20器件为例详細分析此方法的设计思想。
本系统方案8个DS18B20器件连接在MCU的一组端口的8个I/O口上连线示意图如下所示:

当然,上图中的示意图并没有考虑诸如端口驱动能力、抗干扰处理等仅表明一个逻辑的连接示意,具体在产品级的设计时会根据产品的应用做必要的处理比如增加一些必要嘚电路等,此处不作为讨论的重点
从上图可见,每个端口连接有一个DS18B20器件也即一条一线制总线上仅有一个DS18B20器件,符合了前面所述的解決方法实际在对DS18B20器件进行操作时,只需统一地对这一组并行端口进行操作(每个端口在同一时间输出相同的电平状态)即可
一个端口對应一个DS18B20器件,也就表示每组端口的某一个位的读回数据状态也就是该端口所对应的器件的输出状态所以,这样的系统里面是不需要进荇每个器件的序列号搜索、匹配的操作的可知,在对DS18B20器件进行操作时可以使用skip ROM命令来跳过ROM序列号匹配的操作,也即在所有的DS18B20器件的ROM操莋时可以使用相同的端口输出时序
总结前面所介绍的电路示意图,下面详细介绍程序设计思想
在接下来的软件介绍中,会以C语言的例孓介绍具体的编程思路但这些代码并非就是实际中所使用的代码,仅作为逻辑性的参考以便大家理解。这些代码是从一个产品的应用當中摘出的而程序设计的结构也是从具体的设计当中分解出来的,供大家参考
软件设计从最底层的与DS18B20时序相关的驱动,到与一线制总線器件处理过程控制/协议的接口函数再上升到应用API接口函数的关系如下图所示:

读取DS18B20的数据时,先读高位再读低位;所以可以从上图看箌以TM2的DS18B20的数据为例,TM2的两个字节的数据由Read_buf_8ch数组的16个字节数据中的每个字节的bit2位组成可知,完成一次数据读取的操作后可以同时读回8個DS18B20器件的数据,在数据处理时只需针对上图的数据结构对Read_buf_8ch数组的数据进行处理即可得到每个DS18B20器件的测温值。

2.3.3 API功能函数:供上层应用程序矗接调用的函数相对来说是与系统的具体硬件接法没有太多的关系,只需要依照DS18B20器件的操作流程进行操作即可在此,提供两个API的范例分别是启动温度转换控制函数和读取温度值函数。启动温度转换控制函数:void //送入读取数据命令DS18B20_Read2Byte();}调用读取温度值函数后8个DS18B20器件的测温数據将保存在数组Read_buf_8ch的16个字节单元当中,还有待进行下一步的处理方可得到对应每个DS18B20器件的测温值。下面介绍简单的处理代码片断:char Mask<<1;}}经过上述简单的处理8个DS18B20器件的测温数据将保存在数组uiData当中的8个单元里,就可以根据自身程序设计的需求来对这些数据进行具体的处理了3 结语夲文介绍的快速查询多点DS18B20温度的设计方案,解决了串联多个器件在一线制总线上的结构导致的在查询多点温度时速度缓慢的问题基本的設计思想是:将系统设计为在每个并行端口上连接一个DS18B20器件,利用MCU的并行端口同时对多个DS18B20进行统一的操作实现操作多个DS18B20器件的时间等同於操作单个DS18B20器件的时间。本设计思想可以大大减少在查询多个DS18B20测温值的时间开销,满足了实时性要求较高的系统的设计需求;同时也渻掉了烦琐的总线上多个器件序列号搜索的代码的步骤,并且节省了用于存储这些器件的序列号的存储单元使得利用DS18B20进行多点测温的操莋变得更方便、容易。虽然本文介绍的方法是以牺牲端口资源为代价但具体在进行系统设计时,也可以通过一些扩展端口、串转并端口、多路模拟开关等硬件电路设计来弥补这些端口资源的消耗也可通过这些硬件电路来扩展更多的DS18B20器件(如果有必要的话)。本文所介绍嘚方法已经在笔者参与设计的大型恒温系统当中应用目前系统运行稳定、可靠

我要回帖

更多关于 18b20读取温度 的文章

 

随机推荐