您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 使用DS18B20多点测温(64点)
DS18B20数据总线驱动的研究DS18B20温度传感器驱动形式有很多种,本文研究应用实现使用单片机的一个I/O口作为数据总线驱动64个DS18B20温度传感器。硬件部分DS18B20温度传感器采用电线总线进行数据传输,总线有读时隙,写时隙和还原时隙,每片DS182B20温度传感器有独有的64为(8字节)片内固化ROM用来确定通讯目标。理论上说在同一根总线上只要DS18B20温度传感器片内ROM的内容不重复,数据传输就不会出现错误。但是实际上,驱动DS18B20的芯片(如单片机)的负载能力有限,所以目前常见的使用DS18B20多点测温的电路中一根数据总线上最多存在8个DS18B20芯片。换句话说,要实现一根总线上驱动更多的DS18B20芯片,最主要的问题就是I/O口的负载能力。下面对DS18B20工作的电路进行分析,以便找到驱动能力不足的原因,并加以增强。首先就是单片机的负载能力到底是多少,图1是从AT89C52RC的数据手册中截取的内容。图1由此可见,单片机(AT89C52RC)每个引脚的限制电流3.2mA。一般情况下单线总线电路的结构及芯片输入部分结构如图2:图2总线上的电压、电流情况可分为以下四种情况讨论:单片机写1、单片机写0、单片机读1、单片机读0。1.单片机写1:由图2每片芯片上电时有5uA的固定电流消耗,64片并联一共是320uA。由图1可知,当单片机AT89C52RCP0口输出高电平时输出电压最低0.75Vcc时,最大输出电流300uA。所以如果不加上拉电阻挂载64片DS18B20时,当单片机(AT89C52RC)输出高电平时总线上的电压将小于0.75Vcc。所以至少多出来的20uA要由上拉电阻提供才能保证电路输出高电平时电压达到0.75Vcc。此时求得上拉电阻阻值应小于250KΩ。当单片机AT89C52RCP0口输出高电平时输出电压最低0.9Vcc时,最大输出电流80uA。此时挂载64片DS18B20时上拉电阻提供的电流最小为240uA。此时求得上拉电阻的最大阻值20.83KΩ2.单片机写0:有图1可知当P0口输出低电平且其灌入电流最大为3.2mA时,总线上的电压为0.45V。所以当单片机写0时,由上拉电阻提供的电流(上拉电阻提供电流-64片DS18B20消耗电流)要小于3.2mA。所以上拉电阻要大于1.5625KΩ。3.单片机读1:因为单片机读取数据时I/O口要先写1,因此总线的状态与单片机写1相类似。此处便不再讨论。4.单片机读0:由图2可知,DS18B20输出的低电平是通过使数据总线与与地相连的场效应管导通产生的。场效应管导通时的电阻为100Ω。所以如果想使场效应管导通时数据总线上的电压小于0.45V,必须使场效应管上的分压小于0.45V。也就是说总线灌入DS18B20的电流要小于4.5mA。由单片机写0的讨论可知,当满足单片机写0条件时灌入电流小于3.2mA,所以此处一定满足条件。综上,当同一根数据总线上挂载64片DS18B20温度传感器芯片,上拉电阻取值在1.5625KΩ到20.83KΩ之间时,电路可以正常的进行数据传输。但是目前的多点测温电路实验证明,当同一根数据总线上的DS18B20芯片个数大于8个时便无法正常工作。这是因为DS18B20在工作时执行温度转换指令和仅数据传输所消耗的功率不同。上面讨论的均为DS18B20仅传输数据时的功耗,所以只是加一个上拉电阻就可以正常工作。而当DS18B20执行转换指令时,其输入电流要达到1mA到2mA,这是仅仅依靠上拉电阻提供的电流,DS18B20便无法正常工作。所以在本次设计中,额外增加一个场效应管(电路如图3所示),用来提供在执行温度转换时电流供应不足的问题。图中场效应管的栅极连接一个I/O口,用来控制场效应管的导通和截止。当主控芯片(单片机)对DS18B20下达转换指令后,使场效应管导通,对数据线进行强上拉,使其保持充足的电流供应,以确保DS18B20正常进行温度转换。图3(图中内容仅供参考)软件部分控制器对18B20操作流程:1.复位:首先必须对DS18B20芯片进行复位,复位就是由控制器(单片机)给DS18B20单总线至少480uS的低电平信号。当18B20接到此复位信号后则会在15~60uS后回发一个芯片的存在脉冲。复位时序图2.存在脉冲:在复位电平结束之后,控制器应该将数据单总线拉高,以便于在15~60uS后接收存在脉冲,存在脉冲为一个60~240uS的低电平信号。至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20间的数据通信。如果复位低电平的时间不足或是单总线的电路断路都不会接到存在脉冲,在设计时要注意意外情况的处理。3.控制器发送ROM指令:双方打完了招呼之后最要将进行交流了,ROM指令共有5条,每一个工作周期只能发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。ROM指令为8位长度,功能是对片内的64位光刻ROM进行操作。其主要目的是为了分辨一条总线上挂接的多个器件并作处理。诚然,单总线上可以同时挂接多个器件,并通过每个器件上所独有的ID号来区别。4.控制器发送存储器操作指令:在ROM指令发送给18B20之后,紧接着(不间断)就是发送存储器操作指令了。操作指令同样为8位,共6条,存储器操作指令分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。存储器操作指令的功能是命令18B20作什么样的工作,是芯片控制的关键。5.执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定。如执行温度转换指令则控制器(单片机)必须等待18B20执行其指令,一般转换时间为500uS。如执行数据读写指令则需要严格遵循18B20的读写时序来操作。若要读出当前的温度数据我们需要执行两次工作周期,第一个周期为复位、跳过ROM指令、执行温度转换存储器操作指令、等待500uS温度转换时间。紧接着执行第二个周期为复位、指定匹配芯片指令、写64位ROM、执行读RAM的存储器操作指令、读数据(最多为9个字节,中途可停止,只读简单温度值则读前2个字节即可)。DS28B20芯片ROM指令表:ReadROM(读ROM)[33H]获取芯片序列号MatchROM(指定匹配芯片)[55H]后接64位序列号SkipROM(跳跃ROM指令)[CCH]跳过指定匹配芯片SearchROM(搜索芯片)[F0H]AlarmSearch(报警芯片搜索)[ECH]WriteScratchpad(向RAM中写数据)[4EH]ReadScratchpad(从RAM中读数据)[BEH]CopyScratchpad(将RAM数据复制到EEPROM中)[48H]需要加强上拉至少10mSConvertT(温度转换)[44H]需要加强上拉至少500mSRecallEEPROM(将EEPROM中的报警值复制到RAM)[B8H]ReadPowerSupply(工作方式切换)[B4H]DS18B20读写时间隙:DS18B20的数据读写是通过时间隙处理位和命令字来确认信息交换的。写时间隙分为写“0”和写“1”,在写数据时间隙的前15uS总线需要是被控制器拉置低电平,而后则将是芯片对总线数据的采样时间,采样时间在15~60uS,采样时间内如果控制器将总线拉高则表示写“1”,如果控制器将总线拉低则表示写“0”。每一位的发送都应该有一个至少15uS的低电平起始位,随后的数据“0”或“1”应该在45uS内完成。整个位的发送时间应该保持在60~120uS,否则不能保证通信的正常。写一字节约700us写时隙读时间隙:读时间隙时控制时的采样时间应该更加的精确才行,读时间隙时也是必须先由主机产生至少1uS的低电平,表示读时间的起始。随后在总线被释放后的15uS中DS18B20会发送内部数据位,这时控制如果发现总线为高电平表示读出“1”,如果总线为低电平则表示读出数据“0”。每一位的读取之前都由控制器加一个起始信号。读一字节约650us注意:必须在读间隙开始的15uS内读取数据位才可以保证通信的正确。读时隙关于时间的讨论程序执行顺序:1.复位(800uS)、跳过ROM(700uS)、温度转换(700uS)、等待温度转换(强上拉)(500mS),(共约502mS)2.复位(800uS)、指定匹配芯片(700uS)、8字节序列号(700uS*8)、读RAM指令(700uS)、读取RAM*2(650us*2)、数据处理、数据传输至电脑;(约10mS)3.复位并开始下一个芯片的转换温度读取,直到所有芯片的数据读取完成。综上:如果有x片DS18B20挂载在电路中,每次完整的获取一批数据并传输至电脑耗时T可表示为mSxmST10502挂载64片DS18B20时,总耗时时间是1.142S。关于内存的讨论因为获取的温度数值不保存在单片机内,所以在电路中增加DS18B20温度传感器芯片不会增加程序的大小,只是增加循环次数。增加DS18B20芯片的个数仅增加用来保存芯片序列号带来的单片机片内部ROM的占用,每片增加8byte的数据量。程序大小因编写者而异,我的程序占用内存约1KB,对于AT89C52RC单片机的内存总大小是8KB,所以理论上最多尅保存800余个DS18B20的序列号。
本文标题:使用DS18B20多点测温(64点)
链接地址:https://www.777doc.com/doc-4744035 .html