1、引言
在工业控制和工业生产领域中,传感器对于工业控制和生产环境的监控作用不言而喻。传统的传感器监控系统大都采用单片机控制,其监控的准确度和实时性不太令人满意。本文寻找到一套切实可行的传感器设计方案,其利用温湿度传感器芯片,基于 PXA310硬件平台和Linux操作系统,能有效监控现场温湿度变化。在周围环境发生变化,不能满足工作要求时,可以获取监控数据并提出预警,提高生产和工作环境检测的可靠性及实时性。
2、温湿度传感器电路设计
比较了一些传感器应用设计方案后,选用SHT10芯片为嵌入式温湿度传感器的核心部件。它外围电路简便,相比其他传感器芯片(DS18B20)有其独到优势。
SHT10每秒可进行3次温湿度测量,数据精度14bit并且工作稳定。其测量采用CMOSens专利,所以在测量效率和精度上要好于 DS18B20.DS18B20采用单总线控制方案(1-wire),大约每秒测量一次,9位数字式温度数据;只提供温度测量。其在生产环境检测要求严格时,就显得精度和功能有些不足。
2.1 SHT10简介
SHT10是一款高度集成的温湿度传感器芯片,提供全量程标定数字输出。传感器包括一个电容性聚合体湿度敏感元件和一个用能隙材料制成的温度敏感元件,他们与一个14 位A/D转换器以及一个串行接口电路设计在同一个芯片上面。其通过标定得到校准系数以程序形式储存在芯片OTP内存中,并利用两线制串行接口与内部电压调整,使外围系统集成变得快速而简单。
2.2 SHT10工作原理
SHT10芯片电源3.3V.传感器上电后,等待11ms来完成“休眠”状态。通信复位和启动传输命令后,发送一组测量命令(‘00000101’表示相对湿度RH,‘00000011’表示温度T),控制器要等待测量结束。这个过程需要大约11/55/210ms,分别对应8/12/14bit测量。 SHT10通过下拉DATA至低电平,表示测量结束。控制器触发SCK时钟前,必须等待这个“数据备妥”信号才能将测量数据正确读入。
测量和通讯结束后,SHT10自动转入休眠模式。数据传送采用两线制串行接口(与I2C接口不兼容)。
2.3SHT10电路原理图
SHT10采用LCC封装,其DATA和SCK引脚分别连接到PXA310的GPIO78和GPIO79.PXA310通过模拟时序方式实现对外围温湿度传感器的控制和数据读写操作。由于SHT10对于温湿度灵敏度很高,在系统集成时应尽量远离发热源(如MCU、LCD等),否则测量结果会有所偏离;为 SHT10布线时,周围应尽量铺地减少周围器件对其的干扰。SHT10电路原理图如图1所示。
图1SHT10电路原理图 4、温湿度传感器测试与验证
驱动程序完成以后,需要相应测试程序验证驱动程序编写的正确性。由于驱动程序中不能对数据进行浮点数运算,所以测试程序必须将驱动程序传递来的数据进行浮点数运算才能得到相应的温湿度值。
4.1温湿度传感器测试环境
在实验室常温下,测试程序多次调用驱动程序中读温湿度的函数接口获得测试数据,来验证设计的正确和可靠。并考虑实验室内常温下,相对湿度与温度具有非线性关系,计算湿度值时需要考虑温度的补偿关系,其关系如图3所示。
图3SORH转换到相对湿度。 为补偿湿度传感器的非线性以获取准确数据,并考虑实际温度与测试参考温度(25℃)不同,使用如下公式修正读数。
RHlinear是温度修正系数,RHtrue是相对湿度,SORH是传感器返回的湿度值。进行12bit湿度检测时,参数取值如下表所示。
表1湿度转换系数与温度补偿系数
由于能隙材料研发的温度传感器具有极好线性,14bit温度值参考如下公式。
Temperature=d1+d2xSOT
温度转换系数取值如下表所示,SOT是传感器返回的温度值。
表2温度转换系数
利用上述温湿度转换公式和系数可以得出温湿度测量值。
4.2 温湿度传感器测试途径与效率验证
在测试程序中,考虑上述测量环境下温湿度之间的非线性,调用驱动程序的sht10_read函数将读到的温湿度数据返回上层测试程序进行浮点数运算,将计算值通过串口输出,达到测试验证的目的。测试程序的实现如下所示。
staticvoidcalc_sht10(float*humi,float*temp)
{
floatrh=*humi;
floatt=*temp;
floatrh_line;
floatrh_true;
t=t*d2+d1;//温度转换公式
rh_line=C3*rh*rh+C2*rh+C1;//相对湿度转换公式
rh_true=(t-25)*(t1+t2*rh)+rh_line;
//相对湿度温度补偿
if(rh_true》100)rh_true=100;//超出范围
if(rh_true《0.1)rh_true=0.1;
printf(“Humidityis:%.2f%RHn”,rh_true);
printf(“Temperatureis:%.2f‘Cn”,t);
}
intmain(intargc,char*argv[])//主函数
{
intfd;
floattemp,humi;//温湿度数据
charbuffer[4];//数据缓冲
fd=open(“/dev/sht10”,0);//打开文件
if(fd《0){//打开失败,退出
perror(“opendevice/dev/sht10”);
exit(1);
}
read(fd,buffer,sizeof(buffer));//读取温湿度值
temp=(float)((buffer[0]《8)|buffer[1]);
humi=(float)((buffer[2]《8)|buffer[3]);
calc_sht10(&humi,&temp);//温湿度数值转换
close(fd);//关闭文件
return0;//退出
}
测试完成后,考察驱动程序运行效率,即在驱动程序的tasklet_schedule和copy_to_user前分别对PXA310的OSCR时间计数寄存器进行时间读取,计算此次温湿度测量所用时间。计算公式如下所示。
Time=(OSCR2-OSCR1)/OSCR_FREQ
OSCR2是唤醒线程后的时间,OSCR1是进入任务队列前的时间。OSCR_FREQ是PXA310内部时钟频率3.25MHz.这样就可以计算出每次温湿度读取消耗的时间,以此对比SHT10开发文档中理论测量时间值,确定实际驱动程序运行的效率。
5、实验结果与分析
超级终端中插入驱动模块,运行测试程序,可以在终端上看到测试结果(如图4)。
图4超级终端测试结果 系统功能实现后,利用上述Time计算公式计算驱动程序中温湿度测量消耗的时间,实际测试结果如表3所示。
表3驱动程序中实际测量消耗的时间
上表的测试结果不仅和传感器的响应速度有关,而且还与系统中其他运行的线程有关。当系统中有高一级任务到来或其他实时事件需要处理时,实际测量时间会大于上表中的测量时间,并且随着任务的增加测量时间也会相应的增加,完成的时间也受到外界中断的影响。内核会在任务不繁忙时完成测量操作。上表测试结果并未受到系统中其他驱动程序和中断的影响。对比开发手册中理论测量时间可以看到,使用任务队列的方法对改善系统处理能力与实时性效果明显。
此外,实现温湿度传感器驱动程序还需要清楚了解SHT10读写时序,读取温度和湿度所需要的时间不同。如果应用程序中得出的温湿度值超过预期值,就可以打开GPIO驱动模块,触发系统板上的蜂鸣器达到预警效果。
6、结语
此设计方案已经应用于嵌入式无声交互控制系统的检测,并且运行正常。实践证明,该嵌入式Linux温湿度传感器设计方案可行有效,线程阻塞提高系统运行效率,在环境测量准确度和系统实时性方面得到了令人满意的效果。由于此方案基于Linux操作系统和PXA310平台,其在多任务、实时快速处理上具有一定的优势。 |