环境监测通常需要小巧灵活的微控制器。如果在这类应用中使用PC机,那么对其计算能力和存储容量来说都是一种浪费。可采用一个专用微控制器与温、湿度传感器或其他环境监测传感器通信,读取并存储监测数据。为实现更高的灵活性,这些微控制器可连成网络,各自将监测数据上传到功能更强大的系统中,对整体环境参数进行分析记录。本文介绍如何使用低功耗微控制器MAXQ3210实现环境监测应用。增加一个通过一根1-Wire总线实现供电和通信的数字温度传感器DS1822,即可用最少的元器件构建一个电池供电的非易失温度记录系统。
图1 MAXQ3210 1-Wire温度记录仪演示电路所需的元器件
1 设计目标
代码采用MAXQ汇编语言编写,在MAXIDE开发环境自带的标准宏汇编预处理器和汇编器中编译。该代码是为MAXQ3210评估板编写的,因此还需要以下器件(如图1所示)。
◆ 温度传感器: DS1822 经济型1-Wire 数字温度传感器(TO92 封装)。
◆ RS-232 电平装换: MAX233ACWP。演示代码要完成以下任务(如图2所示):
◆通过1-Wire网络(BitBang)与温度传感器DS1822 通信。
◆ 每秒唤醒一次测量温度。
◆ 将温度数据存储在MAXQ3210内部的EEPROM中。
◆ 上电后,以9 600 bps的速率通过串口以Bit-Bang方式发送温度记录数据。
◆ 在发送前将温度数据转换成容易识别的ASCII格式(十进制华氏度)。
◆ 根据主机要求清空存储器(擦除在EEPROM中存储的温度数据)。
图2 温度记录应用的程序流程图
几乎所有低功耗MAXQ 微控制器都可实现这一应用,但MAXQ3210更适用于温度记录。(MAXQ3210的内部构成及特点略——编者注)
2 驱动1-Wire网络
Dallas/Maxim提供一系列使用1-Wire网络接口的传感器和其他器件。该接口数据通信和供电仅需一根数据线和一根地线。1-Wire网络工作在“一主多从”模式(多点网络),时序非常灵活,允许从机以高达16 kbps的速率与主机通信。每个1-Wire器件都有一个全球唯一的64位ROM ID,允许主机精确选择位于网络任何位置的一个从机通信。
1-Wire总线采用漏极开路模式工作,主机(或需要输出数据的从机)将数据线拉低到地表示数据“0”,将数据线释放为高表示数据“1”。这通常通过在数据线和Vcc之间连一个分立电阻实现,但MAXQ3210端口引脚支持弱上拉模式,只需将引脚切换到弱上拉模式,数据线即可浮高。因此MAXQ3210无须外接电阻。由于主机和从机仅需将数据线拉低,而从不将数据线主动拉高,因此数据线可以实现“线或”功能,这可防止多个从机试图同时通过1-Wire总线发送数据时出现冲突。
为驱动1-Wire网络,MAXQ3210利用软件在一个引脚上实现以下类型的时隙。由于1-Wire所有时隙由主机启动,因此当MAXQ3210 不与从机通信时不需要监测1-Wire线路,有关1-Wire 时序的更多详细信息请参考DS1822的数据资料。
由于MAXQ3210 每毫秒约等于3个半指令周期(约3.58 MHz),软件可利用一个端口引脚(P1.6)方便地实现1-Wire协议。实现读时隙的功能与之类似。注意,在1-Wire总线上所有数据均为低有效位(LSB)先发。
3 用DS1822测量温度
3.1 DS1822简介
尽管MAXQ3210可以使用上面的代码与多数1-Wire 从机器件通信,但在本应用中将主要考虑与DS1822通信。DS1822 是一个1-Wire从机器件,可实现9~12位的摄氏温度测量,测量结果可被1-Wire主机读取。与多数1-Wire从机一样,DS1822可以完全由1-Wire总线供电,称为“寄生供电”。DS1822的测量范围可达-55~+125 ℃,适用于多数的室内外温度测量应用;温度分辨率在9位 下为0.5 ℃,12位下0.062 5 ℃。进行一次温度转换所需时间在低分辨率下约为94 ms,在最高分辨率下约为750 ms。由于这是一个简单应用,因此选择9位分辨率,并忽略最小位(0.5 ℃)。这样就可使整个8位带符号温度数据与MAXQ3210的8位累加器匹配。
所有的1-Wire从机器件都支持一个通用指令集,从而使得主机可以判断总线上的从机数目,读取ROM ID;并且可以与某一个从机或一组从机进行通信,一旦某个1-Wire从机被激活,主机可以针对该从机类型向其发送特殊指令。其他所有未被激活的从机均处于等待状态,直到下一个复位脉冲出现,才开始再次监测1-Wire总线。
由于本应用中总线上仅有一个器件,因此可使用最简单的指令集访问从机器件,而无须读取从机的ROM ID。当总线上有多个从机器件时,ROM ID被用来区分不同的从机器件。我们的程序中也读取了一次DS1822的ROM ID,但仅为了演示。(1Wire指令集部分略——编者注)
3.2 将测量结果存储在数据EEPROM中
为防止1-Wire总线偶然出现数据错误,演示代码每次测量都执行3次温度转换(A,B和C) ,并从中选择一个结果存储。选择的依据为:
◆ 如果所有数据相同,则存储该数据。
◆ 如果3个中有两个数据相同(A = B,B = C或A = C),则选择该数据存储。
◆ 如果没有数据相同,则取中间值存储。例如,如果A>B>C,则存储B。
被选中的值被写入数据EEPROM的一个字中。由于采样结果为一个字节,每个字的高字节被用来指示该记录(如字)是否为空。如果高字节为0,则该记录/字为空;如果高字节非0,则低字节为有效温度数据。这样就能区分空记录和存储数据为0 ℃的有效数据。(具体程序略 ——编者注)
记录采用循环方式,从数据EEPROM地址020h开始到05Fh结束,然后再回到开始处。 之后每写入一个新记录,将擦除一个最旧的记录。当通过串行接口向外发送数据时,应用程序通过查找前面是否又有空记录的方式定位最旧的记录数据。(节省功耗部分略——编者注)
3.3 温度记录数据
每次上电复位后,应用程序向主机系统发送温度记录数据,数据通过10位异步串行接口以9 600 bps的速率发送(1位开始位,8位数据位,1位停止位)。MAXQ3210不带硬件UART串口,需要使用一个端口引脚模拟。由于本应用只须发送,无须接收,所以实现起来比较简单。相关程序可从Maxim网站获得。