原创 困扰我几天的,差一点点,PROTUES仿真居然用不了

2008-3-14 15:48 7132 6 6 分类: MCU/ 嵌入式

 






b.gif
困扰我几天的,差一点点,PROTUES仿真居然用不了
b.gif
DS1820及其高精度 温度测量的实现

摘 要: 结合数字温度传感器DS1820在水轮发电机组轴瓦温度测量中的应用经验,提出了用DS1820实现轴瓦温度高精度、高可靠性测量的可行性方案。
    关键词: 数字温度传感器 DS1820 高精度 温度测量
    在传统的模拟信号远距离温度测量系统中,需要很好的解决引线误差补偿问题、多点测量切换误差问题和放大电路零点漂移误差问题等技术问题,才能够达到较高的测量精度。我们在为某水电站开发水轮发电机组轴瓦温度实时监测系统时,为了克服上面提到的三个问题,采用了新型数字温度传感器DS1820,在对其测温原理进行详细分析的基础上,提出了提高DS1820测量精度的方法,使DS1820的测量精度由0.5℃提高到0.1℃以上,取得了良好的测温效果。
    1 DS1820简介
    DS1820是美国DALLAS半导体公司生产的可组网数字式温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。与其它温度传感器相比,DS1820具有以下特性:
    (1)独特的单线接口方式,DS1820在与微处理器连接时仅需要一条口线即可实现微处理器与DS1820的双向通讯。
2)DS1820支持多点组网功能,多个DS1820可以并联在唯一的三线上,实现多点测温。
    (3)DS1820在使用中不需要任何外围元件。
    (4)温范围-55℃~+125℃,固有测温分辨率0.5℃。
    (5)测量结果以9位数字量方式串行传送。
    DS1820内部结构框图如图1所示。

DS1820测温原理如图2所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1 ,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
在正常测温情况下,DS1820的测温分辩率为0.5℃以9位数据格式表示,其中最低有效位(LSB)由比较器进行0.25℃比较,当计数器1中的余值转化成温度后低于0.25℃时,清除温度寄存器的最低位(LSB),当计数器1中的余值转化成温度后高于0.25℃,置位温度寄存器的最低位(LSB),如-25.5℃对应的9位数据格式如下:
    2 提高DS1820测温精度的途径
    2.1 DS1820高精度测温的理论依据
    DS1820正常使用时的测温分辨率为0.5℃,这对于水轮发电机组轴瓦温度监测来讲略显不足,在对DS1820测温原理详细分析的基础上,我们采取直接读取DS1820内部暂存寄存器的方法,将DS1820的测温分辨率提高到0.1℃~0.01℃.
    DS1820内部暂存寄存器的分布如表1所示,其中第7字节存放的是当温度寄存器停止增值时计数器1的计数剩余值,第8字节存放的是每度所对应的计数值,这样,我们就可以通过下面的方法获得高分辨率的温度测量结果。首先用DS1820提供的读暂存寄存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度整数部分T整数,然后再用BEH指令读取计数器1的计数剩余值M剩余和每度计数值M每度,考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度T实际可用下式计算得到:


T实际=(T整数-0.25℃)+(M每度-M剩余)/M每度
    2.2 测量数据比较
    表2为采用直接读取测温结果方法和采用计算方法得到的测温数据比较,通过比较可以看出,计算方法在DS1820测温中不仅是可行的,也可以大大的提高DS1820的测温分辨率。


3 DS1820使用中注意事项
    DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:
    (1)较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。
    (2)在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题,容易使人误认为可以挂任意多个DS1820,在实际应用中并非如此。当单总线上所挂DS1820超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。
    (3)连接DS1820的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此,在用DS1820进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。
    (4)在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。
    参考文献
    1 何立民.单片机应用技术选编(1~6).北京:北京航空航天大学出版社,1997
    2 D.斯托尔.工业抗干扰的理论与实践.北京:国防工业出版社,1985
    3 Dallas  Semiconductor data books.Dallas Semiconductor   Corporation 1995

附录:利用AT89C2051单片机与DS18B20和两个数码管显示温度(51汇编)
;这是关于DS18B20的读写程序,数据脚P3.4,晶振12MHZ

;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒
;可以将检测到的温度直接显示到连接到AT89C2051的两个数码管上
;显示温度00到99度,很准确哦~~无需校正!
  ORG  0000H
;单片机内存分配申明!

TEMPER_L  EQU  29H  ;用于保存读出温度的低8位
TEMPER_H  EQU  28H  ;用于保存读出温度的高8位
FLAG1   EQU  38H  ;是否检测到DS18B20标志位
A_BIT   EQU  20H   ;数码管个位数存放内存位置
B_BIT   EQU  21H   ;数码管十位数存放内存位置
MAIN:   LCALL  GET_TEMPER ;调用读温度子程序
;显示范围00到99度,显示精度为1度

;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
;这个转化温度的方法非常简洁,无需乘于0.0625系数
  MOV  A,29H

  MOV  C,40  ;将28H中的最低位移入C
  RRC  A
  MOV  C,41H
  RRC  A
  MOV  C,42H
  RRC  A
  MOV  C,43H
  RRC  A
  MOV  29H,A
  LCALL  DISPLAY  ;调用数码管显示子程序
  AJMP  MAIN
;这是DS18B20复位初始化子程序

INIT_1820: SETB  P3.4
  NOP
  CLR  P3.4
;主机发出延时537微秒的复位低脉冲
  MOV  R1,#3
TSR1:  MOV  R0,#107
  DJNZ  R0,$
  DJNZ  R1,TSR1
  SETB  P3.4  ;然后拉高数据线
  NOP
  NOP
  NOP
  MOV  R0,#25H
TSR2:  JNB  P3.4,TSR3 ;等待DS18B20回应
  DJNZ  R0,TSR2  ;延时
  LJMP  TSR4  
TSR3:  SETB  FLAG1   ;置标志位,表示DS1820存在
  LJMP  TSR5
TSR4:  CLR  FLAG1   ;清标志位,表示DS1820不存在
  LJMP  TSR7
TSR5:  MOV  R0,#117

TSR6:  DJNZ  R0,TSR6  ;时序要求延时一段时间
TSR7:  SETB  P3.4
  RET
;读出转换后的温度值
GET_TEMPER: SETB  P3.4

  LCALL  INIT_1820 ;先复位DS18B20
  JB  FLAG1,TSS2
  RET    ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2:  MOV  A,#0CCH  ;跳过ROM匹配
  LCALL  WRITE_1820
  MOV  A,#44H   ;发出温度转换命令
  LCALL  WRITE_1820
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
  LCALL  DISPLAY
  LCALL  INIT_1820 ;准备读温度前先复位
  MOV  A,#0CCH  ;跳过ROM匹配

  LCALL  WRITE_1820
  MOV  A,#0BEH  ;发出读温度命令

  LCALL  WRITE_1820
  LCALL  READ_18200 ;将读出的温度数据保存到35H/36H
  RET
;写DS18B20的子程序(有具体的时序要求)

WRITE_1820: MOV  R2,#8  ;一共8位数据
  CLR  C
WR1:  CLR  P3.4
  MOV  R3,#6
  DJNZ  R3,$
  RRC  A
  MOV  P3.4,C
  MOV  R3,#23
  DJNZ  R3,$
  SETB  P3.4
  NOP
  DJNZ  R2,WR1
  SETB  P3.4
  RET
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据

READ_18200: MOV  R4,#2   ;将温度高位和低位从DS18B20中读出
  MOV  R1,#29H  ;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:  MOV  R2,#8  ;数据一共有8位
RE01:  CLR  C
  SETB  P3.4
  NOP
  NOP
  CLR  P3.4
  NOP
  NOP
  NOP
  SETB  P3.4
  MOV  R3,#9

RE10:   DJNZ  R3,RE10
  MOV  C,P3.4
  MOV  R3,#23

RE20:   DJNZ  R3,RE20
  RRC  A

  DJNZ  R2,RE01
  MOV  @R1,A
  DEC  R1
  DJNZ  R4,RE00
  RET
;显示子程序
DISPLAY:  MOV  A,29H  ;将29H中的十六进制数转换成10进制

  MOV  B,#10   ;10进制/10=10进制
  DIV  AB
  MOV  B_BIT,A  ;十位在a
  MOV  A_BIT,B  ;个位在b
  MOV  DPTR,#NUMTAB  ;指定查表启始地址
  MOV  R0,#4
DPL1:   MOV  R1,#250  ;显示1000次
DPLOP:   MOV  A,A_BIT  ;取个位数
  MOVC  A,@A+DPTR  ;查个位数的7段代码
  MOV  P1,A   ;送出个位的7段代码
  CLR  P3.7   ;开个位显示
  ACALL  D1MS   ;显示1ms
  SETB  P3.7
  MOV  A,B_BIT  ;取十位数
  MOVC  A,@A+DPTR  ;查十位数的7段代码
  MOV  P1,A   ;送出十位的7段代码
  CLR  P3.5   ;开十位显示
  ACALL  D1MS   ;显示1ms
  SETB  P3.5
  DJNZ  R1,DPLOP  ;250次没完循环
  DJNZ  R0,DPL1  ;4个250次没完循环
  RET
;1MS延时(按12MHZ算)
D1MS:   MOV  R7,#80

  DJNZ  R7,$
  RET
;7段数码管0~9数字的共阳显示代码
NUMTAB:  DB 081H,0CFH,092H,086H,0CCH,0A4H,0A0H,08FH,080H,084H
  END
b.gif
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条