基于PXA310平台的温湿度传感器设计与实现方法
将内核空间数据传向上层用户空间,并让上层测试程序做进一步处理。
3.3 Linux温湿度传感器设备阻塞操作
由于温湿度传感器测量需要一定时间,为提高系统运行效率和实时性,在驱动程序中阻塞线程,交出内核控制权,等待操作完成后唤醒线程,提高系统利用率。complete()在函数中就是唤醒一个等待的读取线程。任务队列实现函数如下所示。
Tasklet可以使测量操作在系统负荷不重时被调用,或是被立即执行,但始终不会晚于下一个CPUclock.
Tasklet始终在中断期间运行,并且在调度他的同一CPU上运行。对比单片机系统,在单线程情况下,一般在sht10_read()中调用2次 measure_sht10()来等待测量完成,测量效率依赖2次测量消耗的时间;但在Linux驱动程序中,使用Tasklet方式操作,2次测量过程不会对其他线程产生影响,在有其他实时事件需要及时处理时(如网络,视频),可以更有效提高驱动运行效率,降低对其他实时处理产生的影响。
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驱动程序中实际测量消耗的时间
上表的测试结果不仅和传感器的响应速
- 基于STC89C52单片机的温湿度远程监控系统设计(06-11)
- 浅析传感器在地铁中的应用(06-15)
- 温湿度传感器选型的注意事项(11-27)
- 温湿度传感器等在智能家居环境监测中的应用(02-06)
- LT3751如何使高压电容器充电变得简单(08-12)
- 三路输出LED驱动器可驱动共阳极LED串(08-17)