您当前的位置:五五电子网电子知识单片机-工控设备DSP/FPGA技术用MAXQ3210构建1-Wire温度记录仪 正文
用MAXQ3210构建1-Wire温度记录仪

用MAXQ3210构建1-Wire温度记录仪

点击数:7407 次   录入时间:03-04 11:36:20   整理:http://www.55dianzi.com   DSP/FPGA技术

  概述

   环境监测 通常需要小巧灵活的微控制器。如果在这类应用中使用个人电脑,对其计算能力和存储容量而言都是一种浪费,可采用一个专用微控制器与温、湿度传感器或其它环境监测传感器 通信 ,读取并存储监测数据。为实现更高的灵活性,这些微控制器可连成网络,各自将监测数据上传到功能更强大的系统中,对整体环境参数进行分析记录。

  本篇应用笔记介绍如何使用低功耗微控制器MAXQ3210实现环境监测应用。增加一个通过一根 1-Wire 总线实现供电和通信的数字温度传感器DS1822,我们可用最少的元器件构建一个电池供电的非易失温度记录系统。

  可以下载相关演示代码。代码采用MAXQ汇编语言编写,在MAX-IDE开发环境自带的标准宏汇编预处理器和汇编器中编译。该代码是为MAXQ3210评估板编写,因此还需要以下器件(图1)。

  温度传感器:DS1822经济型1-Wire数字温度传感器(TO-92封装)
RS-232电平转换器:MAX233ACWP

  MAXQ3210 1-Wire温度记录仪演示电路所需的元器件

  图1. MAXQ3210 1-Wire温度记录仪演示电路所需的元器件

  
       设计目标

  演示代码要完成以下任务(图2):
 
  通过1-Wire网络(位模拟方式)与温度传感器DS1822通信。

  每分钟唤醒一次测量温度。

  将温度数据存储在MAXQ3210内部的非易失EEPROM中。

  上电后以9600bps的速率通过位模拟串口发送温度记录数据。

  在发送前将温度数据转换成容易识别的ASCII格式(十进制华氏度)。

  根据主机要求清空存储器(擦除在EEPROM中存储的温度数据)。

  温度记录应用的程序流程图

  图2. 温度记录应用的程序流程图

  
       为何使用MAXQ3210

  几乎所有的低功耗MAXQ微控制器都可以实现这一应用,但MAXQ3210更适合用于温度记录。

  集成稳压器。MAXQ3210内部集成5V稳压器,可以直接由标准9V电池供电。MAXQ3210的5V稳压输出还可为其它设备供电(最大电流50mA)。这一特性非常重要,这意味着如果其它器件也可采用5V供电,则不再需要另加单独的电源芯片。

  低功耗。MAXQ3210仅需消耗很小的电流,即使以3.58MHz全速运行,典型值也仅为6mA。当降低频率或处理器停止工作进入休眠状态时,电池电流还可更低。MAXQ3210内部集成的8kHz环形振荡器驱动一个长周期的唤醒时钟,可在长达2分钟的可编程间隔后将处理器从休眠状态唤醒。

  内部数据EEPROM。在掉电时需要保存温度记录数据,这些数据可能要采集几小时,几天,甚至是几周时间。MAXQ3210数据存储空间有64个字的EEPROM,可非常容易的实现这一要求。EEPROM中的每个16位字都可调用Utility ROM中的一个函数单独修改;EEPROM技术意味着在写数据之前从来都不需要擦除操作。如果需要更多EEPROM空间,可将数据写入任何未用的程序EEPROM空间,该写入过程调用Utility ROM中的另一个函数以类似方式逐字修改,无需重载整个应用程序。

  5V端口引脚。与所有MAXQ微控制器一样,MAXQ3210的端口引脚可灵活的设为输入、输出、弱上拉和三态。MAXQ3210还可提供多种接口选择。由于微控制器的端口为5V电平,可以直连5V器件或通过上拉电阻连接低功耗器件(工作在三态/开漏模式)。由于这一应用所需端口很少,使用大的微控制器会浪费许多功能。

  压电扬声器驱动器。尽管压电扬声器功能在这一应用中没有使用,但在许多类型的环境监测应用中都需要产生可听见的告警声。例如烟雾监测和一氧化碳监测。MAXQ3210可直接驱动压电扬声器,可用非常简单的软件实现这一功能。仅需1位控制位来打开或关闭压电扬声器。根据所选的扬声器不同,MAXQ3210输出的幅度可以达到100dB。
小封装:MAXQ3210提供小型的24引脚TSSOP封装。

  驱动1-Wire网络

  Dallas SEMIconductor/Maxim提供一系列使用1-Wire网络接口的传感器和其它器件。该接口的数据通信和供电仅需通过一根数据线再加一根地线,这意味着微控制器仅需一个端口即可与1-Wire传感器通信。
1-Wire网络工作于一主多从模式(多点网络)。时序非常灵活,允许从机以高达16kbps的速率与主机通信。每个1-Wire器件都有一个全球唯一的64位ROM ID,允许1-Wire主机精确选择位于网络任何位置的一个从机进行通信。

  1-Wire总线采用漏极开路模式工作,主机(或需要输出数据的从机)将数据线拉低

www.55dianzi.com 到地表示数据0,将数据线释放为高表示数据1。这通常通过在数据线和VCC之间连一个分立电阻实现,但MAXQ3210的端口引脚支持弱上拉模式,只需将引脚切换到弱上拉模式,数据线即可浮高。因此MAXQ3210不需外接电阻。由于主机和从机仅需将数据线拉低,而从不将数据线主动拉高,因此数据线可以实现“线-或”功能,这可防止多个从机试图同时通过 1-Wire 总线发送数据时出现冲突。

  为驱动1-Wire网络,MAXQ3210利用软件在一个引脚上实现以下类型的时隙。由于1-Wire所有时隙由主机启动,因此当MAXQ3210不与从机 通信 时不需要监测1-Wire线路。有关1-Wire时序的更多详细信息请参考DS1822的数据资料。

  Reset时隙宽度大约为1ms。在时隙的前半部分,主机(MAXQ3210)将1-Wire总线拉低,然后主机将总线释放,使其浮高。总线上的所有1-Wire从机复位,并在该时隙的后半段将总线拉低。这一步产生一个presence pulse (在线脉冲),向主机表明有一个或多个1-Wire从机在线,并且准备好开始通信。
Write时隙大约长120μs,主机利用这一时隙向1-Wire从机发送0或1。两种写时隙都是以主机将总线拉低至少1微秒开始。如果发送1,主机随即释放1-Wire总线(使其浮高)。如果发送0,主机在该时隙剩余的时间内一直将总线拉低。
Read时隙大约长60μs,主机利用这一时隙读取从机发送的0或1。该时隙是以主机将总线拉低至少1微秒开始的。随后主机将总线释放,允许从机将总线拉低(表示0),或将总线释放使其浮空为高(表示1)。主机在时隙中部采样总线读取从机发送来的数据。
由于MAXQ3210每微秒约等于三个半指令周期(3.58MHz时钟频率下),软件可利用一个端口引脚(P1.6)方便的实现1-Wire协议。

  #define OWIN M0[09h].6 ; PI1.6
#define OWOUT M0[01h].6 ; PO1.6
#define OWDIR M0[11h].6 ; PD1.6

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Function : Reset1Wire
;; Description : Sends a standard speed 1-Wire reset pulse on P1.6
;; and checks for a presence pulse reply.
;; Inputs : None
;; Outputs : C - Cleared on success; set on error (no presence
;; pulse detected)
;; Destroys : PSF, LC[0]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  Reset1Wire:
move OWDIR, #1 ; Output mode
move OWOUT, #0 ; Drive low
move LC[0], #RESET_LOW
djnz LC[0], $

  move OWOUT, #1 ; Snap high
move LC[0], #SNAP
djnz LC[0], $

  move OWDIR, #0 ; Change to weak pullup input
move LC[0], #RESET_PRESAMPLE
djnz LC[0], $

  move C, OWIN ; Check for presence detect

  move LC[0], #RESET_POSTSAMPLE
djnz LC[0], $

  ret

  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Function : Write1Wire
;; Description : Writes a standard speed 1-Wire output byte on P1.6.
;; Inputs : GRL - Byte to write to 1-Wire.
;; Outputs : None.
;; Destroys : PSF, AP, APC, A[0], LC[0], LC[1]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  Write1Wire:
move APC, #080h ;

www.55dianzi.com Standard mode, select A[0] as ACC
move Acc, GRL
move OWDIR, #1 ; Output drive mode
move LC[1], #8 ; 8 bits to write

  Write1Wire_slot:
move OWOUT, #0 ; Drive low for start of write slot

  move LC[0], #WRITE_PREBIT
djnz LC[0], $

  rrc ; Get the next bit
jump C, Write1Wire_one
Write1Wire_zero:
move OWOUT, #0 ; Keep the line low (zero bit)
jump Write1Wire_next
Write1Wire_one:
move OWOUT, #1
Write1Wire_next:
move LC[0], #WRITE_POSTBIT
djnz LC[0], $ ; Finish the time slot

  move OWOUT, #1 ; Drive back high (end of slot)
move LC[0], #WRITE_RECOVERY
djnz LC[0], $ ; Recovery time period

  djnz LC[1], Write1Wire_slot

  ret

  实现读时隙的功能与之类似。注意,在 1-Wire 总线上所有数据均为低有效位(LSB)先发。

  利用MAXQ3210实现1-Wire时序时,另一点需要注意的是:尽管1-Wire总线上拉电阻的阻值与总线上的设备数有关,但通常在4k到5k之间。可是MAXQ3210端口引脚上的弱上拉电阻为50k到100k。为了防止1-Wire总线从低电平到高电平转换的时间过长,演示代码先将P1.6输出设为短暂的高电平,将总线强制拉高,然后变为正常的弱上拉模式。只要该过程不是在从机试图将总线拉低的时候进行,就不会出现问题。另外,还可以在总线上再加一个分立的上拉电阻,这样就可以正常的方式使端口输出低代表0,输出三态代表1。

[1] [2] [3]  下一页


本文关键字:记录仪  DSP/FPGA技术单片机-工控设备 - DSP/FPGA技术