阮海蓉
(襄樊学院 物理与电子工程学院,襄阳 441053)
DS18B20是美国DALLAS推出的一种内部集成了A/D转换的单总线数字温度传感器,测量范围为-55℃~120℃,具有0.0625℃的分辨率,在-10℃~85℃内可获得±0.5℃的精度。DS18B20使用时无须做任何标定,在一根信号线上实现了数据的双向传送,与单片机接口时几乎不需要任何外围元件。但是,DS18B20转换时间较长(最大750ms),单总线传送时序要求严格,限制了其在实时控制系统中的应用,一些设计者不得不仍然使用传统的热电阻、热电偶和AD590等传感元件,而这些方案都需要信号调理、A/D转换电路,复杂性和使用成本都远高于DS18B20方案。
DS18B20有3种典型操作时序:初始化、读和写。
初始化:控制器向DS18B20发出480μs低电平,然后释放总线,15~60μS后DS18B20应答60~240μs低电平后释放总线。全过程需时555~780μs。
写:控制器向DS18B20发出一个>1μs的低电平,然后输出欲写数据(1或0),15μs后DS18B20进入采样,采样过程最长达45μs,全过程需时60μs。
读:控制器向DS18B20发出一个>1μs的低电平,然后释放总线,由DS18B20输出数据(1或0),15μs内控制器完成采样,45μs释放总线,全过程需时60μs。
使用DS18B20进行一次温度转换,其标准过程和所需要的时间如下:
1)初始化:需时780μs。
2)匹配或忽略ROM指令:控制器向DS18B20写8位匹配ROM指令55H或忽略ROM指令CCH,需时480μs。
3)匹配ROM:控制器向DS18B20写64位ROM编码,需时3840μs。若选择忽略ROM,则无此项。
4)启动温度转换:控制器向DS18B20写8位启动命令44H,需时480μs。
5)等待转换完成:12位精度需时750ms,11位精度需时375ms,10位精度需时187.5ms,9位精度需时93.75ms。
6)初始化:需时780μs。
7)取转换结果:控制器向DS18B20读16位温度数据,需时960μs。
这样,使用12位精度时一次温度转换所需要的时间为750~760 ms,且在读、写过程中要严格遵循其时序规则,不能被中断[1]。
实时系统对温度采集的要求主要有两个:1)有固定采样周期,以方便进行运算和处理;2)不影响系统对其他任务的处理,即温度的采样过程很短或在过程中能够允许中断。至于温度采集周期的长短,由于大多数实际环境中温度的变化是比较缓慢的,每一秒甚至数秒采集一次是完全可以接受的,DS18B20的750~760ms可以满足大多数环境的要求。
实时系统程序结构,通常是有一个主程序和多个中断服务程序,对周期性要求不高任务的可在主程序中进行处理,对周期性有严格要求的任务及随机发生的事件则放在各中断中服务程序中。为了保持对对象的有效控制,一般每几毫秒~几十毫秒须进行采样和处理,也就是几毫秒~几十毫秒要中断一次。
在实时系统中使用DS18B20,常用的方法有以下两种:
方法一:将温度采集放在一个定时中断服务程序中,采集开始后禁止其他任务中断,直到本次采集结束。这种方法可以实现采样周期固定,但该处理将独占CPU达750~760ms,些期间内不能处理其他任务,这对于一个实时控制系统是很难接受的。
方法二:将温度采样放在主程序中,定时启动采样,在两次读、写周期中间开放中断,以开放系统中的其他任务的处理。这种处理方法的问题是:1)不能充分利用DS18B20的最小转换周期,在控制任务比较繁重的实时系统中,由于温度转换过程不断被各种其他任务所中断,以致完成采集的时间大大超过750~760ms,最终确定的温度采样周期会比DS18B20的转换周期延长很多;2)这种处理方法只能保证启动温度采样的周期一定,但是从启动采样到转换结果更新中间会被实时系统中的其他任务打断,而其他任务所占用的时间不定,最后温度数据更新的周期并不恒定。
以上两种是效果较好的方法,其他方法的效果比以上两种更差,不再赘述。而这些方法的不足,为实时控制系统中使用DS18B20带来了一定的困难。
为了说明DS18B20在实时系统中的应用方法,构建了一个典型的应用方案,如图1所示。
在这个应用方案中,主要组成部分为STC5608AD单片机、被控对象(如电机速度、运动位置)、2个温度测量点和LED数码管显示。这个方案是基于多用软件、少用硬件的理念设计的,LED数码管使用了动态驱动,硬件很少,成本很低,CPU负担很重。在工作过程中,CPU除了要完成对被控对象的处理外,还要操作2个温度测量点的DS18B20进行温度监测,而LED数码管又必须每2ms进行一次刷新以得到稳定的显示效果。
图1 一个典型的实时控制方案
在软件设计中,主要有3个任务:LED数码管动态驱动、DS18B20温度采集和被控对象的处理。每个任务都不能占用CPU过长时间,如DS18B20温度采集和被控对象的处理时间片最大不能超过2ms,否则显示就会出现闪烁。
为了满足这些要求,一些设计者采用的方法是将动态驱动改为静态驱动、多CPU分别完成不同的任务、将DS18B20更换为热电偶或热电阻等,这些都会使系统硬件复杂化,既增加了成本,又降低了系统的可靠性[2]。
这个方案是一个对CPU极限运用的例子,如果在这个方案中能够有效使用DS18B20,那么多数常见的实时控制方案中都可以解决。
方案在设计硬件时,为两只DS18B20的DQ单独分配了接口,这样可以省去匹配ROM的时间。
在图1所示实时控制系统中应用DS18B20的困难,在于LED数码管动态驱动、被控对象的处理和DS18B20的操作都有严格的时序要求,不允许某一任务长时间占用CPU,这与DS18B20的使用特点发生了冲突。
分析DS18B20的操作时序,发现其操作实质上就是通过读、写来实现的,如果将读、写8位作为一个基本单位,则连续占用CPU约480μs,这个时间占用程度系统是可以接受的。由此,程序设计中可以将DS18B20的操作拆开,以一个8位的读、写为基本单位,使得CPU可以兼顾各个任务。
使用C51编写这个系统的程序[3],其与DS18B20相关的部分如下:
在这段程序中,因LED数码管动态驱动的要求,每2ms由定时器0产生一次中断,在中断服务程序中对LED显示进行扫描处理,扫描仅占用很少的时间,对其他任务的影响基本可忽略不计。
DS18B20的操作被拆分成十二步:1)输出低电平并保持2ms以使DS12B80复位;2)输出高电平并保持2ms结束复位;3)写0xcc以忽略ROM匹配;4)写0x44启动温度转换;5)延时750ms等待转换结束;6)再次输出2ms复位低电平;7)再次输出2ms高电平结束复位;8)再写0xcc以忽略ROM匹配;9)写0xbe以启动读暂存器;10)读温度低字节;11)读温度高字节;12)本次温度测量值更新。这12步处理位于77~100行,69~76行是对各计数器做减1运算和赋初值。这些处理放在时间间隔为2ms的定时中断服务程序中,温度测量周期为772ms,如果不需要12位的精度,测量周期可进一步缩短,使用9位精度时可压缩至120ms以内。如果希望将测量周期设定为一个整数(如800 ms),可以修改74行中的750。
在这12步处理中,耗时最多的是读、写,每次占用480μs(其间同时处理2个DS18B20)。由于定时器0的中断周期是2ms,还有不少于1.5ms可以用来对被控对象进行处理,也即3/4的处理时间分配给了被控对象,系统有足够的时间为被控对象服务。
经过如此设计的程序,可以无冲突地完成LED数码管动态驱动、被控对象的控制和DS18B20温度采集。
以上给出的对DS18B20操作的程序(以下称典型程序),可以方便地移植到某一实时控制软件中使用。
一般来说,实时控制软件中总会有定时中断的,只要把典型程序中定时中断中的部分放到具体的实时控制软件中的定时中断中就可以了。典型程序对定时中断周期有宽泛的适应性,1~20 ms都可以正常使用,但周期短会使留给被控对象的处理时间减少,周期长则会使温度采集的周期延长。当然,如果有富裕的定时器,专门为温度采集分配一个定时中断是最好了。
第3行是为25~31行中的精确延时函数设定DJNZ Rn指令的时钟周期数,经典的51系列单片机中该指令需24个时钟周期,本方案中使用的STC12C5608AD需4个时钟周期,用于其他方案中应依据CPU特性进行设置[4]。
第7~14行用联合设置了两个温度保存区,该处理使采集到的温度数据既可以作为一个完整的有符号整数(TW)使用,也可以作为两个独立的无符号字节(TB[1]和TB[0])使用,但要注意TB[1]是低字节而TB[0]是高字节。
第24~62行的3个函数可以直接拷贝到控制软件中使用,不需要做任何修改。第24行是为了禁止在这3个函数中以绝对地址方式使用寄存器的优化项,以便使用不同寄存器组的中断服务程序可以调用,第62行恢复这个优化项。
分后在定时中断服务程序中分时处理。使用此方法可以有效地解决DS18B20在实时控制系统中占用CPU处理时间过多的问题。给出的典型应用程序,具有很好的可移植性,将其嵌入实时控制软件中的定时中断服务程序中即可。对DS18B20的读、写函数做适当修改,可以实现对更多数量的DS18B20处理,并且占用的时间基本不变。
[1] 金伟正.单线数字温度感器的使用[J].电子技术应用,2000,26(6):66-68.
[2] 刘鸣,车立新,陈新梧,等.温度传感器DS18B20的特性及程序设计方法[J].电测与仪表,2001,38(10):47-51.
[3] 顾振宇,刘鲁源,杜振辉.DS18B20接口的C语言程序设计[J].单片机与嵌入式系统应用,2002(7):346-348.
[4] 方飞,薛世华.单片机C延时精度研究[J].单片机与嵌入式系统应用,2008(1):74-75.