引言
在多点温度测量系统中,单总线数字温度传感器(例如DS18X20)因其体积小、构成的系统结构简单等优点,应用越来越广泛。每一个数字温度传感器内均有唯一的64位序列号(最低8位是产品代码,其后48位是器件序列号,最后8位是前56位循环冗余校验码),只有获得该序列号后才可能对其进行操作,也才能在多传感器系统中将它们一一识别。实际应用时的一般做法是:将每一个传感器的序列号测出,以表格的形式和程序存放在一起,并且给每个测温点编上号,做成标签粘贴在对应的传感器上。当系统中有传感器故障时,必须由专业人员测出备用的传感器序列号,贴上相应的标签,并在程序中修改表格,再将程序固化到程序存储器中。显然,这样做非常不利于系统维护。
现有的单总线数字温度传感器的文献很少涉及自动识别序列号和排序(即与测量点对应)的问题,文献1给出了一种方法:通过特制的编码器,将一个传感器的序列号读出,并将其中48位器件序列号转换成BCD码,再通过手动拨盘将测温点编号拨入编码器,与器件序列号一起写入到传感器内的上下限温度报警寄存器TH/TL中(两个字节的EEPROM)。使用该方法,系统可以由运行人员来维护,并减少维护工作量,但仍有缺点:需要专门的编码器,维护工作量减少得仍不够;必须是在TH/TL不使用的前提下。本文给出一种方法,只需在系统中增加一片EEPROM芯片,通过编程,可实现多个传感器的出错指示、自动识别。
硬件设计
图1为系统电路原理图,主要由PIC单片机PIC16C63、四位LED显示器、锁存器74LS373、二-四译码器74LS139、2KB的EEPROM存储器DCM0016C、拨位开关K以及数字温度传感器DS18B20等组成。PIC系列单片机是一种采用精简指令集(RISC)、哈佛(Harvard)双总线和两级指令流水线结构的高性价比的8位嵌入式控制器,I/O口线直接驱动LED,片内有4KB的程序存储器和256B的数据存储器。可电改写的DCM0016C主要用于存储DS18B20的序列号。LED显示器用于显示各测量点的编号、温度以及传感器故障时的指示。拨位开关K在系统正常运行时处于打开状态,需要更换传感器时将其拨至闭合位置,单片机调用相应的子程序进行传感器自动识别。图中数字温度传感器DS18B20的接线拓扑结构考虑了两种结构:总线结构和星型结构。总线结构是指在一根I/O口线上挂接若干只温度传感器,星型结构则在若干根I/O口线上分别挂接若干只温度传感器(图中虚线表示)。实际应用时考虑单总线的驱动能力、布线问题,更多地是采用星型结构,同时这种结构更容易对多个温度传感器进行出错指示、自动识别其序列号和排序。
总线结构的传感器识别
获取序列号的ROM操作命令 操作单总线数字温度传感器必须严格按规定的协议操作,即应按以下顺序操作:初始化、ROM操作命令、暂存存储器操作命令。在ROM操作命令中,有两条命令专门用于获取传感器序列号:读ROM命令(33H)和搜索ROM命令(F0H)。读ROM命令只能在总线上仅有一个传感器的情况下使用。搜索ROM命令则允许总线主机使用一种“消去”处理方法来识别总线上所有的传感器序列号。搜索过程为三个步骤:读一位,读该位的补码,写所需位的值。总线主机在ROM的每一位上完成这三个步骤,在全部过程完成后,总线主机便获得一个传感器ROM的内容,其他传感器的序列号则由相应的另外一个过程来识别。具体的搜索过程为:(1)总线主机发出复位脉冲进行初始化,总线上的传感器则发出存在脉冲做出响应;(2)总线主机在单总线上发出搜索ROM命令;(3)总线主机从单总线上读一位。每一个传感器首先把它们各自ROM中的第一位放到总线上,产生“线与”,总线主机读得“线与”的结果。接着每一个传感器把它们各自ROM中的第一位的补码放到总线上,总线主机再次读得“线与”的结果。总线主机根据以上读得的结果,可进行如下判断:结果为00表明总线上有传感器连着,且在此数据位上它们的值发生冲突;为01表明此数据位上它们的值均为0;为10表明此数据位上它们的值均为1;11表明总线上没有传感器连着;(4)总线主机将一个数值位(0或1)写到总线上,则该位与之相符的传感器仍连到总线上;(5)其它位重复以上步骤,直至获得其中一个传感器的64位序列号。
根据以上分析,搜索ROM命令可以将总线上所有传感器的序列号识别出来,但不能将各传感器与测温点对应起来,即不能实现真正意义上的自动识别。
关系表的建立
以总线上连着8个传感器为例。系统中使用相同型号的传感器,因此产品代码都是一样的,比如DS18B20为28H,可以只用一个单元存储该代码。用DCM0016C的第一个单元0000H存储。剩下的56位序列号用7个字节单元来存储。对每个测温点进行编号,与存储序列号的单元地址建立如表1所示的关系。
工程调试时,要设法将每个测温点的传感器序列号写入对应地址的单元中,即用编程方式自动建立表1,则可实现传感器的自动寻址和排序。程序流程图如图2所示。
图2 建立关系表的程序流程图
按图2编制的程序工作,需要按一定的要求操作:按位置编号由小到大顺序插入传感器。具体工作流程为:
(1)首先检测总线上是否挂接了传感器。若没有,则四位LED显示器显示“0000”;有则识别传感器的序列号。
(2)识别传感器序列号。从0位到63位共64位二进制数分别识别出来,若该序列号与EEPROM单元的内容不同,说明获得了一个新的序列号,将其存到相应的单元中,并显示位置编号和“PPPP”。例如,在1号位置插入一个传感器,单总线上只挂接一个传感器,很容易将其序列号识别出来,并存入到0001H~0007H 单元中;接着在2号位置插入另一个传感器,单总线上挂接了两个传感器,系统首先识别出一个序列号来,若与存储在0001H~0007H单元的内容相同,说明这次识别出的仍是1号传感器的序列号,不存储并接着进行另一个过程,得到不同的序列号(即2号传感器的序列号),将其存储在0008H~000EH单元中。获得序列号的同时也就获得了总线上挂接传感器的个数。
由上述知,总线上挂接多个传感器时,若编制的程序不当,可能同一个传感器要被识别多次,识别时间增长。为了减少识别时间,编程时要注意“需要的位值”取值。传感器序列号的最低8位为产品代号,“需要的位值”可按对应的值给出,关键是其后的48位器件序列号的识别。这里采用了“完全二叉树”的排序思想,如图3所示。具体思路:设在K位首次发生数据位冲突,这时所有的传感器分成两类,即该位为1的传感器和为0的传感器。“需要的位值”给1,K位为1的传感器仍挂接在总线上。若接下来K+M、K+N位发生数据位冲突,“需要的位值”仍分别给1,获得一个序列号。下一个过程在K、K+M位“需要的位值”仍给1,但在K+N位则给0,获得另一个传感器的序列号。第三个过程在K位仍给1,而在K+M位给0,在这条支路上继续识别。K位为1的传感器的序列号识别完后,回到K位时,“需要的位值”给0,按同样的方法识别该支路的传感器序列号。按此思路,多个传感器的序列号只需要分别识别一次。
出错指示
建立关系表后,编制好程序,系统可投入运行。读取每个测温点的温度时,需要用到“符合”ROM命令,该命令要求将关系表中的序列号取出送到总线上,只有序列号与之相符的传感器才挂接在总线上,可读取其温度。若相应的传感器出错,显然不会有序列号与之相符的传感器,这时显示器显示位置编号和“FFFF”,表明该测温点的传感器出错。
更换传感器后的自动识别
给8个传感器建立临时关系表,占用EEPROM存储单元地址范围为:0039H~0070H,将更换后传感器的序列号存入这些单元中。当只有一个传感器出错时,临时关系表中的序列号与关系表的序列号比较,只有一个号不同,用该号取代前文所述的关系表中序列号,即存入对应的存储单元中,便完成了更换传感器后的自动识别。有两个及以上传感器出错时,若同时将这些传感器更换掉,则它们的序列号同时进入临时关系表,将无法进行排序,因此更换传感器时也要按一定的顺序进行:只能一个一个更换,且位置编号小的先更换;更换一个传感器,显示器显示位置编号和“PPPP”后,再更换下一个传感器。实现该功能的子程序主要流程:(1)建立临时关系表;(2)临时关系表的内容与关系表比较。建立临时关系表子程序与建立关系表的程序基本一样,主要是存储单元地址不同。建立该表的同时也就获得了总线上挂接的传感器数,该数据决定两个表的比较次数。
星型结构的传感器识别
拓扑结构采用星型结构,如图1所示,RA0、RA1、RA2、RA3、RA4、RA5、RC0为七根单总线,分别挂接若干个传感器,以挂接8个为例,建立表2所示的关系表。
因为各单总线分别操作,它们的编程及操作和上述单总线差不多,此处不再详述。采用星型结构有一个主要优点:当七根总线上分别只有一个传感器出错,按上述编程思想,可以同时更换七个传感器,有利于系统维护,工作量相应减少。
结语
综上所述,用简单的硬件以及编程方法自动建立关系表,在单总线多点温度测量系统中实现了数字温度传感器的出错指示、自动识别,大大有利于系统的调试、维护,减少维护工作量,并解决了过去维护工作必须由专业人员来完成,而不是由运行人员来完成的不便。