ds18b20温度检测控制
第一篇:ds18b20温度检测控制
数字温度传感器DS18B20控制接口设计
摘 要: DS18B20是一款经典的单总线数字温度传感器芯片,较传统的温度传感器具有结构简单、体积小、功耗小、抗干扰能力强、使用简单、可组网实现多点温度测量等优点。本设计简要介绍了数字温度传感器DS18B20 的特性及工作原理,着重论述了用FPGA实现对此传感器的控制,并将测到的温度在LED数码管上显示出来。
关键词:DS18B20;温度传感器;FPGA;LED数码管
Abstract: DS18B20 is a classic single-bus digital temperature sensor chip, the more traditional temperature sensor has a simple structure, small size, low power consumption, and anti-interference ability, easy to use networking to achieve multi-point temperature measurement. The design brief describes the features and working principle of the digital temperature sensor DS18B20, focuses on the control of this sensor using FPGA, and the measured temperature is displayed on the LED digital tube. Keywords: DS18B20; temperature sensor; FPGA; LED digital tube
1 引言
传统的温度传感器系统大都采用放大、调理、A/ D 转换, 转换后的数字信号送入计算机处理, 处理电路复杂、可靠性相对较差, 占用计算机的资源较多。DS18B20 是一线制数字温度传感器, 它可将温度信号直接转换成串行数字信号送给微处理器, 电路简单, 成本低, 每一只DS18B20 内部的ROM 存储器都有唯一的64位系列号, 在1 根地址/ 信号线上可以挂接多个DS18B20, 易于扩展, 便于 组网和多点测量。
随着科技的发展 ,温度的实时显示系统应用越来越广泛 ,比如空调遥控器上当前室温的显示、热水器温度的显示等等。实现温度的实时采集与显示系统有很多种解决方案 ,本文使用全数字温度传感器DS18B20来实现温度的实时采集FPGA作为控制中心与数据桥梁;LED数码管作为温度实时显示器件。其中DS18B20作为FPGA的外部信号源,把所采集到的温度转换为数字信号,通过接口 (113脚)传给FPGA,FPGA启动ROM内的控制程序驱动LED数码管,通过IO口和数据线把数据传送给LED数码管,将采集到的温度实时显示出来。该设计结构简单、测温准确,成本低,工作稳定可靠,具有一定的实际应用价值。
2 DS18B20数字温度传感器介绍
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下:
2.1 DS18B20的性能特点
1独特的单线接口仅需要一个端口引脚进行通信; ○2多个DS18B20可以并联在惟一的三线上,实现多点组网功能; ○3无须外部器件; ○4可通过数据线供电,电压范围为3.0~5.5V; ○5零待机功耗; ○6温度以9或12位数字; ○7用户可定义报警设置; ○8报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件; ○9负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;○ 2.2 DS18B20的内部结构图
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2-1所示。
图2-1 DS18B20内部结构框图 图2-2 DS18B20字节定义
64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入户报警上下限。DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图2-2所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3-4所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分率。 2.3 DS18B20测温原理
DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一个频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。 初始时,计数器1预置的是与-55℃相对应的一个预置值。以后计数器1每一个循环的预置数都由斜率累加器提供。为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。
DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25℃进行比较,若低于0.25℃,温度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃时,温度寄存器的最低位就进位然后置0。这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表0.5℃,四舍五入最大量化误差为±1/2LSB,即0.25℃。
温度寄存器中的温度值以9位数据格式表示,最高位为符号位,其余8位以二进制补码形式表示温度值。测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占据第二字节。
DS18B20测量温度时使用特有的温度测量技术。DS18B20内部的低温度系数振荡器能产生稳定的频率信号;同样的,高温度系数振荡器则将被测温度转换成频率信号。当计数门打开时,DS18B20进行计数,计数门开通时间由高温度系数振荡器决定。芯片内部还有斜率累加器,可对频率的非线性度加以补偿。测量结果存入温度寄存器中。一般情况下的温度值应该为9位,但因符号位扩展成高8位,所以最后以16位补码形式读出。 2.4 DS18B20供电方式
DS18B20有两种供电方式,一种是寄生电源强上拉供电方式,一种是外部供电方式,如下图:
图2-3 寄生电源强上拉供电方式电路图
在寄生电源供电方式下,DS18B20 从单线信号线上汲取能量:在信号线 DQ 处于高电平期间把能量储存在内部电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。为了使 DS18B20 在动态转换周期中获得足够的电流供应,当进行温度转换或拷贝到 E2 存储器操作时,用 MOSFET 把 I/O 线直接拉到 VCC 就可提供足够的电流,在发出任何涉及到拷贝到 E2 存储器或启动温度转换的指令后,必须在最多 10μS 内把 I/O 线转换到强上拉状态。在强上拉方式下可以解决电流供应不走的问题,因此也适合于多点测温应用,缺点就是要多占用一根 I/O 口线进行强上拉切换。
图2-4 外部电源供电方式电路图
在外部电源供电方式下,DS18B20 工作电源由 VDD 引脚接入,此时 I/O 线不需要强上拉,不存在电源电流不足的问题,可以保证转换精度,同时在总线上理论可以挂接任意多个 DS18B20 传感器,组成多点测温系统。在外部供电的方式下,DS18B20的GND引脚不能悬空,否则不能转换温度,读取的温度总是 85℃。 3 设计需求
1温度测量范围:-55℃~+125℃ ○2可编程为9位~12位A/D转换精度 ○3测温分辨率可达0.0625℃ ○4 LED数码管直读显示 ○4 设计方案
4.1 硬件设计
将[DF2C8]FPGA 核心板和[EB-F2]基础实验板连接在一起,同时使能DS18B20 模块和数码管模块:数码管使能:用“短路帽”将实验板上的JP4和JP5全部短接。DS18B20 温度传感器使能跳线JP10 全部短接,元件安装示意如下图4-1和4-2(注意方向,半圆形的一边朝板子内部,平面朝外,和板上的图示一致)。
图 4-1:数码管使能图示 图 4-2:温度传感器安装和使能图示
4.1.1 温度传感器 DS18B20 电路
基础实验板上提供了一个由DS18B20构成的温度测量模块,其原理如图4-3所示。该电路选择外部供电方式。外部电源供电方式工作稳定可靠, 抗干扰能力强。
图4-3 单线制温度传感器 DS18B20 电路图
DS18B20与[DF2C8]FPGA核心板的连接关系如表4-1所示
表 4-1:DS18B20与[DF2C8]FPGA核心板连接时的管脚对应关系
4.1.2 数码管显示电路
基础实验板上具有2个共阳极的位七段数码管,构成8位构,其电路如图4-4 所示。
图 4-4:七段数码管显示电路图
数码管的控制引脚由两个跳线JP4和JP5使能(如图4-1所示) R10~R17是段码上的限流电阻,位码由于电流较大,采用了PNP三极管驱动。当位码驱动信号为低电平(0)时,对应的数码管才能操作;当段码驱动信号为低电平(0)时,对应的段码点亮。数码管不核心板连接时的管脚对应如表4-2所示:
表 4-2:数码管与[DF2C8]FPGA核心板连接时的管脚对应关系
4.2 HDL编码 4.2.1 时序
(1)复位: 使用DS18B20 时, 首先需将其复位, 然后才能执行其它命令。复位时, 主机将数据线拉为低电平并保持480Ls~ 960Ls, 然后释放数据线, 再由上拉电阻将数据线拉高15~ 60Ls, 等待DS18B20 发出存在脉冲, 存在脉冲有效时间为60~ 240Ls, 这样, 就完成了复位操作。其复位时序如图4-5所示。
图4-5:初始化时序
图4-6:写时序
(2)写时隙: 在主机对DS18B20 写数据时, 先将数据线置为高电平, 再变为低电平, 该低电平应大于1us。在数据线变为低电平后15us 内, 根据写“1”或写“0” 使数据线变高或继续为低。DS18B20 将在数据线变成低电平后15us~ 60us 内对数据线进行采样。要求写入DS18B20 的数据持续时间应大于60us 而小于120us, 两次写数据之间的时间间隔应大于1us。写时隙的时序如图4-6 所示
(3)读时隙 :当主机从DS18B20 读数据时, 主机先将数据线置为高电平, 再变为低电平, 该低电平应大于1us, 然后释放数据线, 使其变为高电平。DS18B20 在数据线从高电平变为低电平的15us 内将数据送到数据线上。主机可在15us 后读取数据线。读时隙的时序如图4-7 所示。
图4-7 :读时隙
4.2.2 DS18B20 的操作命令
主机可通过一线端口对DS18B20 进行操作, 其步骤为: 复位( 初始化命令) -> ROM 功能命令-> 存储器功能命令-> 执行/ 数据, DS18B20 的ROM 命令有5个( 见表1) , 存储器命令有6个( 见表2) 。命令的执行都是由复位、多个读时隙和写时隙基本时序单元组成。因此, 只要将复位、读时隙、写时隙的时序了解清楚, 使用DS18B20 就比较容易了, 时序如上文所述。
表4-3: 存储器命令操作表 表4-4:ROM命令功能操作表
4.2.3 Verilog HDL编码
详细Verilog HDL代码参见工程文件:DF2C8_13_DS18B20 工程文件中含有三个v 文件,LED_CTL.v 是数码管显示功能模块,DS18B20_CTL.v 是温度传感器的控制模块,TEMP.v 为顶层模块,实例化了前面两个模块,并将采集的温度值送至数码管中进行显示。其中最主要的温度传感器的控制模块,DS18B20_CTL.v。该程序对DS18B20 进行控制, 不仅可以简化程序, 还可以缩短1 次温度转换所需的时间. 这样的话, 1 次温度转换和数字温度值输出循环所涉及到的控制命令、数据交换和所需时隙如图4-8所示。
.
图4-8:1次温度转换的控制命令和时隙
5 仿真测试结果
5.1 仿真波形
温度测量模块仿真结果如图6-1所示:
图5-1:仿真波形
5.2 结果显示
下载配置文件后,可在数码管上观察到带一位小数的温度数值。如果用手捏住传感器,会发现显示的温度在升高。如下图:
图5-2 测温效果图示
参考文献:
[1] 沙占友 集成传感器的应用[M]. 中国电力出版社. [2] 罗钧,童景琳. 智能传感器数据采集与信号处理[M]. 化学工业出版社
[3] 周月霞,孙传友. DS18B20硬件连接及软件编程[J]. 传感器世界,2001,12. [4] 王晓娟,张海燕,梁延兴.基于DS18B20的温度实时采集与显示系统的设计与实现[J]. , 2007:38-41. [5] 党 峰, 王敬农, 高国旺. 基于DS18B20 的数字式温度计的实现[ J] . 山西电子技术, 2007( 3) [6] 金伟正. 单线数字温度传感器的原理与应用[ J] . 仪表技术与传感器, 2000( 7) : 42- 43. [7]DS18B20 Datasheet [ EB/ OL] . Dalla s: Dallas Semico nductor Cor po r atio n, 2005.
第二篇:DS18B20学习总结
及其高精度温度测量的实现
1.1 DS18B20简介
DS18B20是美国DALLAS半导体公司生产的可组网数字式温度传感器. 主要由三个数据部件组成:64的激光ROM,温度灵敏原件,非易失性温度告警触发器TH和TL。 封装如图一:
图一 1.
2DS18B20的特点:
1. 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
2. DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现多点测温。 3. DS18B20在使用中不需要任何外围元件。
4. 测温范围-55℃~+125℃,固有测温分辨率0.5℃。 5. 测量结果以9位数字量方式串行传送。
内部结构框图如图二所示。
图二
2.1 访问温度计的协议:
(一)初始化
(二)ROM操作命令
(三)存贮器操作命令
(四)处理/数据
由热敏原件中晶振特性计算出所测的温度。 注意:复位操作如下图三
图三 必需要给DS18B20输入脉冲激活其复位功能。
DS18B20的驱动程序:
/*************************此部分为18B20的驱动程序*************************************/
#include #include sbit D18B20=P3^7; sbit error=P3^4; #define NOP() _nop_() /* 定义空指令 */ #define _Nop() _nop_() /*定义空指令*/ void TempDelay (unsigned char idata us); void Init18b20 (void); void WriteByte (unsigned char idata wr); //单字节写入 void read_bytes (unsigned char idata j); unsigned char CRC (unsigned char j); void GemTemp (void); void Config18b20 (void); void ReadID (void); void TemperatuerResult(void); bit flag; unsigned int idata Temperature; unsigned char idata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节 unsigned char idata id_buff[8];
unsigned char idata crc_data; unsigned char code CrcTable [256]={ 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
void GetTemp() {
if(TIM==100)
{ TIM=0;
TemperatuerResult();
每隔 1000ms 读取温度。
void TemperatuerResult(void) {
p = id_buff;
ReadID();
//先确定是第几个DS18B20
Config18b20(); //配置DS18B20的报警温度和分辨度
Init18b20 ();
//复位)
WriteByte(0xcc);
//skip rom
WriteByte(0x44);
//Temperature convert
Init18b20 ();
//复位)
WriteByte(0xcc);
//skip rom
WriteByte(0xbe);
//read Temperature
p = temp_buff;
GemTemp(); //读取温度
}
void GemTemp (void) {
read_bytes (9);
if (CRC(9)==0) //校验正确
{
Temperature = temp_buff[1]*0x100 + temp_buff[0]; //
Temperature *= 0.0625;
Temperature /= 16;
TempDelay(1);
} } *Function:CRC校验 *parameter: *Return: *Modify: *************************************************************/ unsigned char CRC (unsigned char j) {
unsigned char idata i,crc_data=0;
for(i=0;i
crc_data = CrcTable[crc_data^temp_buff[i]];
return (crc_data); }
/************************************************************ *Function:向18B20写入一个字节 *parameter: *Return: *Modify:
void WriteByte (unsigned char idata wr) //单字节写入 {
unsigned char idata i;
for (i=0;i<8;i++)
{
D18B20 = 0;
_nop_();
D18B20=wr&0x01;
TempDelay(3);
//delay 45 uS //
5 _nop_();
_nop_();
D18B20=1;
wr >>= 1;
} }
/************************************************************ *Function:读18B20的一个字节 *parameter: *Return: *Modify: *************************************************************/ unsigned char ReadByte (void)
//读取单字节
unsigned char idata i,u=0;
for(i=0;i<8;i++)
{
D18B20 = 0;
u >>= 1;
D18B20 = 1;
if(D18B20==1)
u |= 0x80;
TempDelay (2);
_nop_();
}
return(u); } /************************************************************ *Function:读18B20 *parameter: *Return: *Modify: *************************************************************/ void read_bytes (unsigned char idata j) {
unsigned char idata i;
for(i=0;i
{
*p = ReadByte();
p++;
} } /************************************************************ *Function:延时处理 *parameter: *Return: *Modify: *************************************************************/ void TempDelay (unsigned char idata us) {
while(us--); } /************************************************************ *Function:18B20初始化 *parameter: *Return: *Modify: *************************************************************/ void Init18b20 (void) {
D18B20=1;
_nop_();
D18B20=0;
TempDelay(80);
//delay 530 uS//80
_nop_();
D18B20=1;
TempDelay(14);
//delay 100 uS//14
_nop_();
_nop_();
_nop_();
if(D18B20==0)
{flag = 1; error=0; }
//detect 1820 success!
else
{flag = 0; error=1; }
//detect 1820 fail!
TempDelay(20);
//20
_nop_();
_nop_();
D18B20 = 1; }
/************************************************************
向18B20写入一个字节 *parameter: *Return: *Modify: *************************************************************/ void WriteByte (unsigned char idata wr) //单字节写入 {
unsigned char idata i;
for (i=0;i<8;i++)
{
D18B20 = 0;
_nop_();
D18B20=wr&0x01;
TempDelay(3);
//delay 45 uS //5
_nop_();
_nop_();
D18B20=1;
wr >>= 1;
} }
/************************************************************
读18B20的一个字节
*/ unsigned char ReadByte (void)
//读取单字节 {
unsigned char idata i,u=0;
for(i=0;i<8;i++)
{
D18B20 = 0;
u >>= 1;
D18B20 = 1;
if(D18B20==1)
u |= 0x80;
TempDelay (2);
_nop_();
}
return(u); }
/************************************************************ 3.1.2
SPI数据线配置。
/*************************此部分为74HC595的驱动程序使用SPI总线连接*************************************/
#include #include
#define NOP()
_nop_()
/* 定义空指令 */ #define _Nop() _nop_()
/*?定义空指令*/ void HC595SendData(unsigned int SendVal);
//SPI IO sbit
MOSIO =P1^5; sbit
R_CLK =P1^6; sbit
S_CLK =P1^7; sbit
IN_PL =P3^4;
//74HC165 shift load
把数据加载到锁存器中 sbit
IN_Dat=P3^5;
//74HC165 output
数据移出 sbit
OE
=P3^6;
/********************************************************************************************************* ** 函数名称: HC595SendData ** 功能描述: 向SPI总线发送数据
*********************************************************************************************************/ void HC595SendData(unsigned int SendVal) {
unsigned char i;
for(i=0;i<16;i++)
{
if((SendVal<
else MOSIO=0;
S_CLK=0;
NOP();
NOP();
S_CLK=1;
}
R_CLK=0; //set dataline low
NOP();
NOP();
R_CLK=1; //片选
OE=0; }
3.1.
3试验数码管上显示温度
#include extern GetTemp();
//声明引用外部函数 extern unsigned int idata Temperature;
// 声明引用外部变量 void delay(unsigned int i);
sbit
LS138A=P2^2;
//管脚定义 sbit
LS138B=P2^3; sbit
LS138C=P2^4;
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned long LedOut[5],LedNumVal; void system_Ini() {
TMOD|= 0x11;
TH1 = 0xD8;
//10
TL1 = 0xF0;
IE = 0x8A;
TR1 = 1 main() { unsigned char i;
system_Ini();
while(1)
{
GetTemp();
/********以下将读18b20的数据送到LED数码管显示*************/
LedNumVal=Temperature;
//把实际温度送到LedNumVal变量中
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100];
LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[3]=Disp_Tab[LedNumVal%10];
//个位
for(i=0; i<4; i++)
{
P0 = LedOut[i] ;
switch(i)
{
//138译码
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
}
delay(100);
}
P0 = 0;
} }
//延时程序
void delay(unsigned int i) {
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--); } 4.1 讨论DS18B20的自动报警功能实现。
DS18B20只是一个测温元件,所谓的报警功能要通过程序由单片机来实现。
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,头2个字节包含测得的温度信息,第3和第4字节TH(报警温度上限)和TL(报警温度下限)的拷贝。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。第
6、
7、8字节保留未用。要实现报警,完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较(当然要自己编程序)。若T>TH或T
第三篇:DS18B20的各个ROM命令
1、 Read ROM[33H]
2、 Match ROM[55H]
这个是匹配ROM命令,后跟64位ROM序列,让总线控制器在多点总线上定位一只特定的DS18B20。只有和64位ROM序列完全匹配的DS18B20才能响应随后的存储器操作。所有和64位ROM序列不匹配的从机都将等待复位脉冲。这条命令在总线上有单个或多个器件时都可以使用。
3、Skip ROM[0CCH]
这条命令允许总线控制器不用提供64位ROM编码就使用存储器操作命令,在单点总线情况下,可以节省时间。如果总线上不止一个从机,在Skip ROM命令之后跟着发一条读命令,由于多个从机同时传送信号,总线上就会发生数据冲突(漏极开路下拉效果相当于相“与”)
4、Search ROM[0F0H]
当一个系统初次启动时,总线控制器可能并不知道单线总线上有多个器件或它们的64位编码,搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。
5、Alarm Search[0ECH]
这条命令的流程和Search ROM相同。然而,只有在最近一次测温后遇到符合报警条件的情况,DS18B20才会响应这条命令。报警条件定义为温度高于TH或低于TL。只要DS18B20不掉电,报警状态将一直保持,知道再一次测得的温度值达不到报警条件。
6、Write Scratchpad[4EH]
这个命令向DS18B20的暂存器TH和TL中写入数据。可以在任何时刻发出复位命令来中止写入。
7、Read Scratchpad[0BEH]
这个命令读取暂存器的内容。读取将从第1个字节开始,一直进行下去,直到第9(CRC)字节读完。如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。
8、Copy Scratchpad[48H]
这个命令把暂存器的内容拷贝到DS18B20的E2ROM存储器里,即把温度报警触发字节存入非易失性存储器里。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于把暂存器拷贝到E2存储器,DS18B20就会输出一个0,如果拷贝结束的话,DS18B20则输出1。如果使用寄生电源,总线控制器必须在这条命令发出后立即启动强上拉并保持10ms。
9、Convert T[44H]
这条命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后DS18B20保持等待状态。如果总线控制器在这条命令之后跟着发出时间隙,而DS18B20又忙于做时间转换的话,DS18B20将在总线上输出0,若温度转换完成,则输出1,。如果使用寄生电源,总线控制必须在发出这条命令后立即启动强上拉,并保持500ms以上时间。
10、Recall E2
这条命令把报警触发器里的值拷贝回暂存器。这种拷贝操作在DS18B20上电时自动执行,这样器件一上电,暂存器里马上就存在有效的数据了。若在这条命令发出之后发出读数据隙,器件会输出温度转换忙的标识:0为忙,1为完成。
11、Read Power Supply[0B4H]
若把这条命令发给DS18B20后发出读时间隙,器件会返回它的电源模式:0为寄生电源,1为外部电源。
第四篇:电炉温度的模糊控制
电阻炉温度控制系统设计
引言电加热炉是典型工业过程控制对象,其温度控制具有升温单向性,大惯性,纯滞后,时变性等特点,很难用数学方法建立精确的模型和确定参数。而PID控制因其成熟,容易实现,并具有可消除稳态误差的优点,在大多数情况下可以满足系统性能要求,但其性能取决于参数的整定情况。且快速性和超调量之间存在矛盾,使其不一定满足快速升温、超调小的技术要求。模糊控制在快速性和保持较小的超调量方面有着自身的优势,但其理论并不完善, 引言
电加热炉是典型工业过程控制对象,其温度控制具有升温单向性,大惯性,纯滞后,时变性等特点,很难用数学方法建立精确的模型和确定参数。而PID控制因其成熟,容易实现,并具有可消除稳态误差的优点,在大多数情况下可以满足系统性能要求,但其性能取决于参数的整定情况。且快速性和超调量之间存在矛盾,使其不一定满足快速升温、超调小的技术要求。模糊控制在快速性和保持较小的超调量方面有着自身的优势,但其理论并不完善,算法复杂,控制过程会存在稳态误差。
将模糊控制算法引入传统的加热炉控制系统构成智能模糊控制系统,利用模糊控制规则自适应在线修改PID参数,构成模糊自整定:PID控制系统,借此提高其控制效果。 基于PID控制算法,以ADuC845单片机为主体,构成一个能处理较复杂数据和控制功能的智能控制器,使其既可作为独立的单片机控制系统,又可与微机配合构成两级控制系统。该控制器控制精度高,具有较高的灵活性和可靠性。
2 温度控制系统硬件设计
该系统设计的硬件设计主要由单片机主控、前向通道、后向通道、人机接口和接口扩展等模块组成,如图l所示。由图1可见,以内含C52兼容单片机的ADuC845为控制核心.配有640 KB的非易失RAM数据存储器、外扩键盘输人、320x240点阵的图形液晶显示器进行汉字、图形、曲线和数据显示,超温报警装置等外围电路;预留微型打印机接口,可以现场打印输出结果;预留RS232接口,能和PC机联机,将现场检测的数据传输至PC机来进一步处理、显示、打印和存档。
电阻炉的温度先由热电偶温度传感器检测并转换成微弱的电压信号,温度变送器将此弱信号进行非线性校正及电压放大后,由单片机内部A/D转换器将其转换成数字量。此数字量经数字滤波、误差校正、标度变换、线性拟合、查表等处理后。一方面将炉窑温度经人机面板上的LCD显示:另一方面将该温度值与被控制值(由键盘输入的设定温度值)比较,根据其偏差值的大小,提供给控制算法进行运算,最后输出移相控制脉冲,放大后触发可控硅导通(即控制电阻炉平均功率)。达到控制电炉温度的目的。如果实际测得的温度值超过了该系统所要求的温度范围,单片机就向报警装置发出指令,系统进行报警。
2.1 系统主控模块
系统主控模块电路如图2所示,它主要由CPU及数据存储器,晶体振荡器、复位电路、图形液晶显示器(LCD)及控制电路、微型打印机接口控制电路、实时日历时钟,热电偶信号处理电路等构成。这里,该系统设计可测量3点温度。传感器选择K型(镍铬-镍硅)热电偶,可用于从室温到1 200°C的温度测量,测量范围宽,精度高。在温度测量范围内K型热电偶的输出热电势只有0~45.119 mV,为了和ADuC845的A/D转换器相匹配,采用ACl226和1B51作为信号调理电路,由AC12
26、1B51构成热电偶冷端温度补偿及信号调理器电路。当热端距测温仪表较远时,需利用热电偶匹配导线将冷端延长。CD4051为多路模拟开关,由ABC控制接通,当5~3接通时,输入接地,UO输出UOmin,用于零点校准;当4~3接通时,单片机1.25 V稳定参考电压Uref,再经电阻R
1、R2分压,得到毫伏级参考输入电压,UO输出UOmax,用于增益校准;当2~
3、1~
3、12~3分别分时接通时,依次输入3个热电偶正常测温所得变换电压,UO从而输出3个温度点所对应的电压UOA,UOB,UOC。在HI端与+UISO端之间串上一只220 MΩ上拉电阻,一旦热电偶开路,HI端即被偏置为+UISO,迫使1B51的输出电压超量程,由此判定热电偶已开路。多路模拟开关和测量数据采集过程在单片机协调下工作,每次数据采集都进行自动判断和校准阁。
2.2 控制输出驱动电路
对温度的控制是通过可控硅调功器电路实现,如图3所示。双向可控硅管和硅碳棒串接在交流220 V、50 Hz交流市电回路中,图3中只给出了A相。移相触发脉冲由ADuC845用软件在P1.3引脚上产生的,零同步脉冲同步后,经光耦合管和驱动器输出送到可控硅的控制极。过零同步脉冲由过零触发电路产生,利用同步变压器和电压比较器LM311组成正弦交流电的正半波过零检测电路,它在交流电每一个正半周的起始零点处产生上升沿.并在正半周回零处产生一个下降沿,电压比较器LM311用于把50 Hz正弦交流电压变成方波。方波的正边沿和负边沿分别作为两个单稳态触发器的输入触发信号,单稳态触发器输出的2个窄脉冲经二极管或门混合后通过可重复触发集成单稳态触发器MC14528,单稳态输出的两路窄脉冲再叠加,就可得到对应于交流市电的100 Hz过零同步脉冲。脉冲宽度可由MC14528的外接电阻R4和外接电容C
1、C2调节。此脉冲加到ADUC845的TO作为计数脉冲和INT1中断口触发INT1中断。可控硅的过流、过压保护采用一般阻容保护电路。R5是触发器输出限流电阻,R3用以消除漏电流,防止KP150的误触发。
3 温度控制系统软件设计 3.1 主程序及其功能
软件设计采用模块化设计原则。控制程序主要由测量采样操作,温度参数设置界面的显示,操作按键的管理,测量过程,数据算法处理,输出控制的处理及测量结果显示等模块组成。主模块是为其他模块构建整体框架及初始化工作。调用运算和显示构成一个无限循环圈,温控的所有功能都在该循环圈中周而复始有选择执行。除非掉电或复位,否则系统程序不会跳出该循环圈。因浮点数运算占用时间较多,应将其作为单独模块。控制算法模块包括:PID运算模块和PID参数自整定模块两部分,主要是相应控制算法的初始化及运算程序。数学运算模块主要包括诸如带符号浮点数求补运算、带符号浮点数乘法、无符号浮点数除法以及浮点数加减法等运算子程序,供其他模块根据算法的需要随时调用。显示设定和操作界面由菜单显示,用INTO中断完成。界面中用线框框起来的符号和汉字表示当前起作用的按键,用“上下左右”按键移动光标和改变数据,按下确认键后选中有效,开始执行所选功能,按下返回键就回到上一级界面(菜单)。数据的采集及预处理模块由TO计数定时产生中断,包括数字滤波、标度变换、显示刷新等部分,完成数据预处理及人机交互功能。过零同步由交流过零触发产生INT1中断,并确定移相顺序,触发T1定时,产生移相脉冲,控制输出。一旦中断,首先判断具体的中断源。若是定时中断,则调用相应的模块完成定时服务;若是人机面板的按键中断,则在识别按键后,进入散转程序,随之调用相应的键盘处理服务模块。无论是哪一个中断源产生中断,执行完相应的程序后均返回主模块,必要时修改显示内容,并开始下一轮循环。图4所示为系统软件主程序流程。
第五篇:PLC控制的加热炉温度控制系统
1 传统的加热炉电气控制系统普遍采用继电器控制技术,由于采用固定接线的硬件实现逻辑控制,使控制系统的体积增大,耗电多,效率不高且易出故障,不能 保证正常的工业生产。随着计算机控制技术的发展,传统继电器控制技术必然被基于计算机技术而产生的PLC控制技术所取代。而PLC本身优异的性能使基于 PLC控制的温度控制系统变的经济高效稳定且维护方便。这种温度控制系统对改造传统的继电器控制系统有普遍性意义。
2 加热炉温度控制系统基本构成
加热炉温度控制系统基本构成入图1所示,它由PLC主控系统、移相触发模块整、流器SCR、加热炉、传感器等5个部分组成。该加热炉温度希望稳定在100℃工作(其它工作温度同样可以照此方法设计)。
图1 加热炉温度控制系统基本组成
加热炉温度控制实现过程是:首先传感器将加热炉的温度转化为电压信号,PLC主控系统内部的A/D将送进来的电压信号转化为PLC可识别的数字量,然后 PLC将系统给定的温度值与反馈回来的温度值进行处理,给移相触发模块,再给三相整流电路(SCR)一个触发脉冲(既控制脉冲),这样通过SCR的输出我 们控制了加热炉电阻丝两端的电压,也既加热炉温度控制得到实现。其中PLC主控系统为加热炉温度控制系统的核心部分起重要作用。
3 PLC控制系统 3.1 PLC控制系统的硬件配置
在 加热炉温度控制系统中PLC采用日本三菱公司FX2N,其硬件采用模块化设计,配合了多种特殊功能模块及功能扩展模块,可实现模拟量控制、位置控制等功 能。该系列PLC可靠性高,抗干扰强、配置灵活、性价比高。本温度控制系统中PLC我们选择FX2N-48MR-001型,它与外部设备的连接如图
2、表 1所示。
图2 PLCI/O接线图 表1 PLC I/O地址分配表
3.2 流程设计
根据加热炉温度控制要求,本系统控制流程图如图3所示。
图3 加热炉控制流程图
3.3 控制算法
由于温度控制本身有一定的滞后性和惯性,这使系统控制出现动态误差。为了减小误差提高系统控制精度,采用PID控制算法,另外考虑到系统的控制对象,采用增量型PID算法。 △V(n)=U(n)-U(n-1)
+[e(n)-2e(n-1)+e(n-2)>}=KP{△e(n)+e(n)+[△e(n)-△e(n-1)>} 式中e(n)、e(n-1)、e(n-2)为PID连续三次的偏差输入。△e(n)、△e(n-1)为系统连续两次执行的误差。KP为比例放大系数T、TI、TD分别为采样周期、积分时间、微分时间。
当 加热炉刚启动加热时,由于测到的炉温为常温,sp-pv=△U为正值且较大,△U为PID调节器的输入,此时PID调节器中P起主要作用,使SCR为最大 电压给加热炉加热。当加热炉温度达到100℃以上时,sp-pv=△U为负值,经PID调节,使SCR输出电压减小,加热炉温度降低。当温度正好达到 100℃时,△U为零PID不调节,此时SCR输出的电压正好平衡加热炉消耗的热量,系统达到动态平衡。 3.4 K型热电偶分度电压拟合
(1)根据具体问题,确定拟合多项式的次数为n。 (2)由公式 Sk=tr= yi(k=0,1,2, ……2n) (r=0,1,2, ……n)
计数出Sk与Tr (3)写出正规方程
(4)解正规方程组 求出a0,a1,…,an (5)写出拟合公式多项式Pn(X)=
一 次多项式也叫作线性拟合。由上述方法可拟合出K分度电压随温度变化公式为:V=0.04T(其中V为电压,T为温度)。此拟合公式是在温度从0℃到 120℃之间变化的近似公式,因此正规方程只用到S0、S
1、S2拟合的多项式次数为n=1,电压随温度的变化可近似为线性变化。如果温度变化范围比较 大,则电压随温度变化为非线性变化,上述电压随温度变公式需要重新拟合,拟合多项式的次数也必然大于2。 3.5 系统调试
系统调试分为两大步骤,一是系统软件调试;二是系统硬件调试。
(1)系统软件调试。系统软件调试是在PC机上进行,我们将PLC控制程序输入PC机后,根据运行要求,设定若干数字开关量,模拟量,对系统的每一个功能进行检测测试并在此基础上不断完善程序以达到系统要求。
(2)系统硬件调试。相应的系统硬件也是在实验室里进行,用一个设备来摸仪控制对象。首先检查设备的诸个单元是否合乎要求,其次将软件和硬件结合起来进行测试。并不断完善PLC软硬件的配置以达到最优的结果。
4 结束语
加热炉温度控制系统采用成熟的PLC技术和电力电子技术,采用软硬件结合,较好的解决了传统加热炉温控系统中出现的问题。针对我国大部分的加热炉用户来说本系统将是一个比较理想的温控系统。