4、溫濕度傳感器測(cè)試與驗(yàn)證
驅(qū)動(dòng)程序完成以后,需要相應(yīng)測(cè)試程序驗(yàn)證驅(qū)動(dòng)程序編寫的正確性。由于驅(qū)動(dòng)程序中不能對(duì)數(shù)據(jù)進(jìn)行浮點(diǎn)數(shù)運(yùn)算,所以測(cè)試程序必須將驅(qū)動(dòng)程序傳遞來(lái)的數(shù)據(jù)進(jìn)行浮點(diǎn)數(shù)運(yùn)算才能得到相應(yīng)的溫濕度值。
4.1溫濕度傳感器測(cè)試環(huán)境
在實(shí)驗(yàn)室常溫下,測(cè)試程序多次調(diào)用驅(qū)動(dòng)程序中讀溫濕度的函數(shù)接口獲得測(cè)試數(shù)據(jù),來(lái)驗(yàn)證設(shè)計(jì)的正確和可靠。并考慮實(shí)驗(yàn)室內(nèi)常溫下,相對(duì)濕度與溫度具有非線性關(guān)系,計(jì)算濕度值時(shí)需要考慮溫度的補(bǔ)償關(guān)系,其關(guān)系如圖3所示。
圖3SORH轉(zhuǎn)換到相對(duì)濕度。
為補(bǔ)償濕度傳感器的非線性以獲取準(zhǔn)確數(shù)據(jù),并考慮實(shí)際溫度與測(cè)試參考溫度(25℃)不同,使用如下公式修正讀數(shù)。
RHlinear是溫度修正系數(shù),RHtrue是相對(duì)濕度,SORH是傳感器返回的濕度值。進(jìn)行12bit濕度檢測(cè)時(shí),參數(shù)取值如下表所示。
表1濕度轉(zhuǎn)換系數(shù)與溫度補(bǔ)償系數(shù)
由于能隙材料研發(fā)的溫度傳感器具有極好線性,14bit溫度值參考如下公式。
Temperature=d1+d2xSOT
溫度轉(zhuǎn)換系數(shù)取值如下表所示,SOT是傳感器返回的溫度值。
表2溫度轉(zhuǎn)換系數(shù)
利用上述溫濕度轉(zhuǎn)換公式和系數(shù)可以得出溫濕度測(cè)量值。
4.2 溫濕度傳感器測(cè)試途徑與效率驗(yàn)證
在測(cè)試程序中,考慮上述測(cè)量環(huán)境下溫濕度之間的非線性,調(diào)用驅(qū)動(dòng)程序的sht10_read函數(shù)將讀到的溫濕度數(shù)據(jù)返回上層測(cè)試程序進(jìn)行浮點(diǎn)數(shù)運(yùn)算,將計(jì)算值通過(guò)串口輸出,達(dá)到測(cè)試驗(yàn)證的目的。測(cè)試程序的實(shí)現(xiàn)如下所示。
staticvoidcalc_sht10(float*humi,float*temp)
{
floatrh=*humi;
floatt=*temp;
floatrh_line;
floatrh_true;
t=t*d2+d1;//溫度轉(zhuǎn)換公式
rh_line=C3*rh*rh+C2*rh+C1;//相對(duì)濕度轉(zhuǎn)換公式
rh_true=(t-25)*(t1+t2*rh)+rh_line;
//相對(duì)濕度溫度補(bǔ)償
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[])//主函數(shù)
{
intfd;
floattemp,humi;//溫濕度數(shù)據(jù)
charbuffer[4];//數(shù)據(jù)緩沖
fd=open(“/dev/sht10”,0);//打開(kāi)文件
if(fd《0){//打開(kāi)失敗,退出
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);//溫濕度數(shù)值轉(zhuǎn)換
close(fd);//關(guān)閉文件
return0;//退出
}
測(cè)試完成后,考察驅(qū)動(dòng)程序運(yùn)行效率,即在驅(qū)動(dòng)程序的tasklet_schedule和copy_to_user前分別對(duì)PXA310的OSCR時(shí)間計(jì)數(shù)寄存器進(jìn)行時(shí)間讀取,計(jì)算此次溫濕度測(cè)量所用時(shí)間。計(jì)算公式如下所示。
Time=(OSCR2-OSCR1)/OSCR_FREQ
OSCR2是喚醒線程后的時(shí)間,OSCR1是進(jìn)入任務(wù)隊(duì)列前的時(shí)間。OSCR_FREQ是PXA310內(nèi)部時(shí)鐘頻率3.25MHz.這樣就可以計(jì)算出每次溫濕度讀取消耗的時(shí)間,以此對(duì)比SHT10開(kāi)發(fā)文檔中理論測(cè)量時(shí)間值,確定實(shí)際驅(qū)動(dòng)程序運(yùn)行的效率。
5、實(shí)驗(yàn)結(jié)果與分析
超級(jí)終端中插入驅(qū)動(dòng)模塊,運(yùn)行測(cè)試程序,可以在終端上看到測(cè)試結(jié)果(如圖4)。
圖4超級(jí)終端測(cè)試結(jié)果
系統(tǒng)功能實(shí)現(xiàn)后,利用上述Time計(jì)算公式計(jì)算驅(qū)動(dòng)程序中溫濕度測(cè)量消耗的時(shí)間,實(shí)際測(cè)試結(jié)果如表3所示。
表3驅(qū)動(dòng)程序中實(shí)際測(cè)量消耗的時(shí)間
上表的測(cè)試結(jié)果不僅和傳感器的響應(yīng)速度有關(guān),而且還與系統(tǒng)中其他運(yùn)行的線程有關(guān)。當(dāng)系統(tǒng)中有高一級(jí)任務(wù)到來(lái)或其他實(shí)時(shí)事件需要處理時(shí),實(shí)際測(cè)量時(shí)間會(huì)大于上表中的測(cè)量時(shí)間,并且隨著任務(wù)的增加測(cè)量時(shí)間也會(huì)相應(yīng)的增加,完成的時(shí)間也受到外界中斷的影響。內(nèi)核會(huì)在任務(wù)不繁忙時(shí)完成測(cè)量操作。上表測(cè)試結(jié)果并未受到系統(tǒng)中其他驅(qū)動(dòng)程序和中斷的影響。對(duì)比開(kāi)發(fā)手冊(cè)中理論測(cè)量時(shí)間可以看到,使用任務(wù)隊(duì)列的方法對(duì)改善系統(tǒng)處理能力與實(shí)時(shí)性效果明顯。
此外,實(shí)現(xiàn)溫濕度傳感器驅(qū)動(dòng)程序還需要清楚了解SHT10讀寫時(shí)序,讀取溫度和濕度所需要的時(shí)間不同。如果應(yīng)用程序中得出的溫濕度值超過(guò)預(yù)期值,就可以打開(kāi)GPIO驅(qū)動(dòng)模塊,觸發(fā)系統(tǒng)板上的蜂鳴器達(dá)到預(yù)警效果。
6、結(jié)語(yǔ)
此設(shè)計(jì)方案已經(jīng)應(yīng)用于嵌入式無(wú)聲交互控制系統(tǒng)的檢測(cè),并且運(yùn)行正常。實(shí)踐證明,該嵌入式Linux溫濕度傳感器設(shè)計(jì)方案可行有效,線程阻塞提高系統(tǒng)運(yùn)行效率,在環(huán)境測(cè)量準(zhǔn)確度和系統(tǒng)實(shí)時(shí)性方面得到了令人滿意的效果。由于此方案基于Linux操作系統(tǒng)和PXA310平臺(tái),其在多任務(wù)、實(shí)時(shí)快速處理上具有一定的優(yōu)勢(shì)。
評(píng)論