HS1101程序及应用原理Word格式.docx
《HS1101程序及应用原理Word格式.docx》由会员分享,可在线阅读,更多相关《HS1101程序及应用原理Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
在自动测试系统中,电容值随着空气湿度的变化而变化,因此将电容值的变化转换成电压或频率的变化,才能进行有效地数据采集。
用555集成电路组成振荡电路,HSl100湿度传感器充当振荡电容,从而完成湿度到频率的转换。
2.3测量方法
HSll01湿敏传感器是采用侧面开放式封装,只有两个引脚,有线性电压输出和线性频率输出两种电路。
在使用时,将2脚接地,这里选用频率输出电路。
该传感器采用电容构成材料,不允许直流方式供电。
所以我们使用555定时器电路组成单稳态电路。
具体电路分析如下。
电源电压工作范围是UCC=+3.5~+12V。
利用一片CMOS定时器TLC555.配上HSll01和电阻R2、R4构成单稳态电路,将相对湿度值变化转换成频率信号输出。
输出频率范围是7351-6033Hz,所对应的相对湿度为0~100%。
当RH=55%时,f=6660Hz。
输出的频率信号可送至数字频率计或控制系统,经整理后送显示。
R3为输出端的限流电阻,起保护作用。
通电后.电源沿着Uc→R4→R2→C对HSl101充电。
经过t1时间后湿敏电容的压降Uc就被充电到TI~C555的高触发电平(Uh=0.67Ucc),使内部比较器翻转,OUT的输出变成低电平。
然后C开始放电,放电回路为C→R2→D→内部放电管地。
经过t2时间后,Uc降到低触发电平(Ul=0.33Ucc),内部比较器再次翻转,使OUT端的输出变成高电平。
这样周而复始的进行充、放电,形成了振荡。
充电、放电时间计算公式分别为:
tl=C(R2+R4)ln2;
t2=CR21n2;
输出波形的频率(f)和占空比(D)的计算公式如下:
f=1/T=1/(t1+t2)=1/C(2R2+R4)ln2;
D=tl/T=t1/t1+t2=R2+R4/(2R2+R4);
通常取R4《R2,使D≈50%,输出接近于方波。
例如,取人R2=567kQ,R4=49.9kΩ。
湿度传感器只是保证传感探头的精度,在实际使用中,综合精度除了与湿度传感器本身元件有关,还与外围电路的器件选择相关。
为了与HSll01温度系数相匹配,Rl数值应取为1%精度,且最大温漂不超过100ppm(ppm:
百万分之一,表示当温度变化1℃,所对应的电阻相对变化量)。
为了保证达到6660Hz/55%,R2与555电路选取参照如下表:
当RH=55%、TA=+25℃时,典型输出方波频率与相对湿度的数据对照见表3。
2.4与微处理器IPC2132接口
LPC2132是一种支持实时仿真和跟踪的16/32位基于ARM7TDMI-S内核的CPU,并带有64KB嵌入的高速FLASH存储器。
LPC2132的实时仿真和跟踪功能方便了代码调试,降低了开发成本。
并且I/O口能够接受5V容限。
整个湿度传感器由于采用频率输出电路,接口简单,可直接与LPC2132普通I/0对接,这里选用PO.6脚做为频率测量接口。
3软件设计
软件设计主要完成对HSl101在单位时间内的频率测量。
软件设计采用端口扫描方式,间隔8S开始测量,测量时间为1S。
统计单位时间内脉冲的个数,与表3对照,确定湿度值的范围,并将湿度值通过LCD显示。
为了保证测量精度,可以取3次以上测量数据,求平均值后,作为最终送显示数据。
微处理器工作晶体选用12.000MHz。
程序代码采用嵌入式C语言编写,经在ADSl.2编译环境中进行编译后,移植到微处理器内执行。
参考软件代码之一:
Do
{
IODIR0=10DIROIRO&OXOfffffbf:
//p0.6设置成输入
d0//读IO口寄存器
{if((IOPIN0&
(1<
<
0x06))==0x00000000)
break:
//检测0电平
}while
(1);
0x06))!
=Ox00000000)
//检测l电平
}while
(1);
fdat++:
//累积1S时间内脉冲个数
}while(pt8s%8==0);
//间隔8S测量一次
fdat--;
time
(1);
//延时必须保留
if((fdat>
6033)&
(fdat<
6187))rhb=90;
//将测量数值转换为对应百分比,1%一100%
6186)&
6331))rhb=80;
6330)&
6469))rhb=70;
6468)&
6601))rhb=60;
6600)&
6729))rhb=50;
6728)&
6854))rhb=40;
6853)&
6977))rhb=30;
6976)&
7101))rhb=20;
7100)&
7225))rhb=10;
if(fdat>
7224)rhb=00:
lhb=fdat%100:
//对测量数值取低两位
//处理需要等待一段时间,否则lhb=0
if((rhb==60)\(rhb==70)\(rhb==90))lhb=lhb/
13:
//对低两位数值取个位,
elseif(rhb==80)lhb=lhb/14;
elselhb=lhb/12;
rhb=rhb+lhb;
//将数据合成一起,送显示
fdat=Ox00000000;
//清0,为下次准备
}
参考软件代码之二:
#include"
reg51.h"
#defineucharunsignedchar
#defineuint
unsignedint
uchar
tem0,tem1;
temp0,temp1;
uint
f=0;
//初值
/****************************************************************************
*名称:
timer0()
*功能:
定时器1,每50000us中断一次。
*入口参数:
****************************************************************************/
voidtimer0()interrupt1
EA=0;
TR0=0;
TR1=0;
TL0=0xFF;
//重装值
定时50000us
OX4BFFH
TH0=0x4B;
tem0=TL1;
//读数
tem1=TH1;
TL1=0x00;
//定时器1清零
TH1=0x00;
f=1;
//作标注位
TR0=1;
TR1=1;
EA=1;
timer1()
计数器,用于计数将555输出的频率,以计数相对湿度。
voidtimer1()interrupt3
//T1中断,表示计数的频率溢出,超出了可测量的频率范围,显然在这里不可能。
所以重新启动。
TL0=0x00;
定时50000us
TH0=0x4C;
voidInit_timer()
TMOD=0x51;
//01010001定时器0在模式1下工作16位定时器,定时方式
定时器1在模式1下工作16位计数器,T1负跳变加1
//定时器0初值定时50000us
ET0=1;
//使能定时器0中断
ET1=1;
//使能定时器1中断
//使能总中断
//开始计时
voidtran()
f=tem1;
f=(f<
8)|tem0;
f=f*20;
//这里f的值是最终读到的频率,不同频率对于不同相对湿度。
if((5623<
=f)&
&
(f<
=6852))
//相对湿度在有效范围内(0%--100%)
{
if((6734<
f)&
(f<
=6852))
{temp0=0;
temp1=(6852-f)*10/118;
}
if((6618<
=6734))
{temp0=1;
temp1=(6734-f)*10/116;
}
if((6503<
=6618))
{temp0=2;
temp1=(6618-f)*10/115;
}
if((6388<
=6503))
{temp0=3;
temp1=(6503-f)*10/115;
if((6271<
=6388))
{temp0=4;
temp1=(6388-f)*10/117;
if((6152<
=6271))
{temp0=5;
temp1=(6271-f)*10/119;
if((6029<
=6152))
{temp0=6;
temp1=(6152-f)*10/123;
if((5901<
=6029))
{temp0=7;
temp1=(6029-f)*10/128;
if((5766<
=5901))
{temp0=8;
temp1=(5901-f)*10/135;
if((5623<
(f<
=5766))
{temp0=9;
temp1=(5766-f)*10/143;
else
temp0=0;
temp1=0;
voidmain()
uchar
i,k;
count;
Init_timer();
count=0;
while
(1)
for(i=0;
i<
200;
i++)
for(k=0;
k<
k++);
//延时
tran();
temp0&
=0x0F;
temp1&
temp0=temp0<
4;
count=temp0|temp1;
Ddisp(count);
说明:
将555定时器的输出引脚与单片机AT89C2051的定时输入引脚相连,计数出1秒钟内输入的脉冲个数,此脉冲个数即为555定时器的振荡频率。
对于CMOS工艺的555定时器,其测得的相对湿度与输出的脉冲频率具有如下关系式:
Fmes(Hz)=F55(Hz)(1.1038-1.936810-3*RH+3.011410-6*RH2-3.440310-8*RH3),其中的F55(Hz)表示相对湿度为55%时的频率值,在25°
C下F55(Hz)=6660Hz。
因此,根据测得的脉冲频率即可求出湿度值。
从上式可以看出,F与RH之间是一种比较复杂的曲线关系,为了简化计算,必须寻求更为简单的求解方法。
在25°
C下,如果以F55(Hz)=6660Hz为参考点,555定时器频率输出电路具有如下对应关系表。
测湿电路为了使计算简单,可以将频率与湿度之间的非线性关系按照上表分为10段进行处理,每一小段内按线性关系处理,从而大大简化了计算过程。
系统程序分为两大部分:
系统主程序和T0中断服务程序。
T0的中断服务程序主要是实现555定时器输出频率的计算,而由频率计算湿度则是在主程序中实现的。
对于555定时器输出频率的计算,采用单片机AT89C2051的定时器中断的方式实现:
单片机AT89C2051内部集成了两个16位的定时器T0和T1,设置单片机定时器T0定时20ms,并允许T0中断;
定时器T1则用来对555的输出脉冲进行计数。
每当T0发生20ms定时中断时,就读取T1中的计数脉冲个数,T1×
50即为此时555定时器的输出频率,并设置T0的中断标志变量flagT0为1。
初始化主要包括定时器T0和T1的初始化、中断逻辑初始化等。
然后判断“FlagT0=1?
”,当FlagT0=1时,表示又发生了一次新的T0定时中断,并且在T0的中断服务程序中已经求出了此时555定时器的输出频率;
然后主程序执行求湿度子程序,根据频率求出此时湿度。
如果FlagT0=0,则表示没有新的T0定时中断发生,主程序直接往下执行,扫描“测湿”键和“清除”键,当“测湿”键按下时,就将测得的湿度在数码管上显示出来;
当“清除”键按下时,就执行清除显示子程序,将数码管的显示全部变为0。
然后再判断“FlagT0=1?
”,如此往复循环。
4结语
由于HSll01采用独特的电容式单元设计,具有响应速度快、体积小、线性度好、较稳定等优点,我们将HSll01用在智能家居控制系统中,完成对空气湿度的测量,经长期应用,性能达到了稳定可靠,同时也实现了对低成本的要求。
本文来源:
《电子测试》