1、引言
在工業(yè)控制和工業(yè)生產(chǎn)領(lǐng)域中,傳感器對于工業(yè)控制和生產(chǎn)環(huán)境的監(jiān)控作用不言而喻。傳統(tǒng)的傳感器監(jiān)控系統(tǒng)大都采用單片機(jī)控制,其監(jiān)控的準(zhǔn)確度和實時性不太令人滿意。本文尋找到一套切實可行的傳感器設(shè)計方案,其利用溫濕度傳感器芯片,基于 PXA310硬件平臺和Linux操作系統(tǒng),能有效監(jiān)控現(xiàn)場溫濕度變化。在周圍環(huán)境發(fā)生變化,不能滿足工作要求時,可以獲取監(jiān)控數(shù)據(jù)并提出預(yù)警,提高生產(chǎn)和工作環(huán)境檢測的可靠性及實時性。
2、溫濕度傳感器電路設(shè)計
比較了一些傳感器應(yīng)用設(shè)計方案后,選用SHT10芯片為嵌入式溫濕度傳感器的核心部件。它外圍電路簡便,相比其他傳感器芯片(DS18B20)有其獨到優(yōu)勢。
SHT10每秒可進(jìn)行3次溫濕度測量,數(shù)據(jù)精度14bit并且工作穩(wěn)定。其測量采用CMOSens專利,所以在測量效率和精度上要好于 DS18B20.DS18B20采用單總線控制方案(1-wire),大約每秒測量一次,9位數(shù)字式溫度數(shù)據(jù);只提供溫度測量。其在生產(chǎn)環(huán)境檢測要求嚴(yán)格時,就顯得精度和功能有些不足。
2.1 SHT10簡介
SHT10是一款高度集成的溫濕度傳感器芯片,提供全量程標(biāo)定數(shù)字輸出。傳感器包括一個電容性聚合體濕度敏感元件和一個用能隙材料制成的溫度敏感元件,他們與一個14 位A/D轉(zhuǎn)換器以及一個串行接口電路設(shè)計在同一個芯片上面。其通過標(biāo)定得到校準(zhǔn)系數(shù)以程序形式儲存在芯片OTP內(nèi)存中,并利用兩線制串行接口與內(nèi)部電壓調(diào)整,使外圍系統(tǒng)集成變得快速而簡單。
2.2 SHT10工作原理
SHT10芯片電源3.3V.傳感器上電后,等待11ms來完成“休眠”狀態(tài)。通信復(fù)位和啟動傳輸命令后,發(fā)送一組測量命令(‘00000101’表示相對濕度RH,‘00000011’表示溫度T),控制器要等待測量結(jié)束。這個過程需要大約11/55/210ms,分別對應(yīng)8/12/14bit測量。 SHT10通過下拉DATA至低電平,表示測量結(jié)束??刂破饔|發(fā)SCK時鐘前,必須等待這個“數(shù)據(jù)備妥”信號才能將測量數(shù)據(jù)正確讀入。
測量和通訊結(jié)束后,SHT10自動轉(zhuǎn)入休眠模式。數(shù)據(jù)傳送采用兩線制串行接口(與I2C接口不兼容)。
2.3SHT10電路原理圖
SHT10采用LCC封裝,其DATA和SCK引腳分別連接到PXA310的GPIO78和GPIO79.PXA310通過模擬時序方式實現(xiàn)對外圍溫濕度傳感器的控制和數(shù)據(jù)讀寫操作。由于SHT10對于溫濕度靈敏度很高,在系統(tǒng)集成時應(yīng)盡量遠(yuǎn)離發(fā)熱源(如MCU、LCD等),否則測量結(jié)果會有所偏離;為 SHT10布線時,周圍應(yīng)盡量鋪地減少周圍器件對其的干擾。SHT10電路原理圖如圖1所示。
圖1SHT10電路原理圖
?????? 3、Linux溫濕度傳感器驅(qū)動程序?qū)崿F(xiàn)
單片機(jī)控制的傳感器設(shè)備中,單片機(jī)通常是單線程運行。在進(jìn)行溫濕度測量時,單片機(jī)需要等待測試結(jié)果返回,其方法阻礙了其他測試和操作的同步執(zhí)行。
在嵌入式Linux系統(tǒng)中,驅(qū)動程序?qū)y試任務(wù)送入任務(wù)隊列,交出CPU控制權(quán),繼而進(jìn)行其他實時任務(wù)運行,待內(nèi)核空閑再進(jìn)入任務(wù)隊列完成傳感器的測量,以此提高系統(tǒng)執(zhí)行的效率和實時性。
3.1 Linux溫濕度傳感器設(shè)備加載
溫濕度傳感器使用Linux內(nèi)核的Miscdevice數(shù)據(jù)結(jié)構(gòu)在驅(qū)動程序初始化時將設(shè)備注冊到內(nèi)核。
Miscdevice是字符設(shè)備,其主設(shè)備號為10,設(shè)備及設(shè)備接口函數(shù)定義如下所示。
驅(qū)動程序加載設(shè)備時將調(diào)用內(nèi)核的注冊函數(shù)。在Linux2.4和2.6內(nèi)核中,幾乎所有Linux驅(qū)動程序都依靠如下函數(shù)加載模塊。
驅(qū)動程序初始化完成后,上層應(yīng)用程序可以調(diào)用sht10_fops中的sht10_read函數(shù)進(jìn)行溫濕度的讀取操作。
3.2 Linux溫濕度傳感器設(shè)備操作
進(jìn)行數(shù)據(jù)讀取前,首先要在驅(qū)動程序中開辟4個字節(jié)的數(shù)據(jù)空間,用于存放溫度和濕度測量值。這里定義全局變量數(shù)據(jù)緩沖區(qū)為unsignedcharbuf[4]。
讀取SHT10溫濕度數(shù)據(jù)前,需要進(jìn)行端口初始化和SHT10復(fù)位操作,然后將任務(wù)送于任務(wù)隊列并阻塞線程,當(dāng)任務(wù)完成返回后再喚醒線程,將讀到數(shù)據(jù)傳遞給上層應(yīng)用程序做進(jìn)一步處理。程序流程圖和實現(xiàn)函數(shù)如圖2所示。
圖2驅(qū)動程序流程圖。
上述函數(shù)中start_trans;write_byte;read_data;read_byte分別利用PXA310引腳模擬時序完成啟動傳輸、寫字節(jié),讀一位數(shù)據(jù)和讀字節(jié)的操作。
內(nèi)核tasklet_schedule()調(diào)度執(zhí)行指定的tasklet,在獲得運行機(jī)會之前只會調(diào)度一次,如果在運行時被調(diào)度,則完成后會被再次運行。
wait_for_completion()這個函數(shù)進(jìn)行一個不可打斷的等待,如果有代碼調(diào)用它,并且沒有完成這個任務(wù),結(jié)果會是一個不可殺死的進(jìn)程。copy_to_user()將內(nèi)核空間數(shù)據(jù)傳向上層用戶空間,并讓上層測試程序做進(jìn)一步處理。
3.3 Linux溫濕度傳感器設(shè)備阻塞操作
由于溫濕度傳感器測量需要一定時間,為提高系統(tǒng)運行效率和實時性,在驅(qū)動程序中阻塞線程,交出內(nèi)核控制權(quán),等待操作完成后喚醒線程,提高系統(tǒng)利用率。complete()在函數(shù)中就是喚醒一個等待的讀取線程。任務(wù)隊列實現(xiàn)函數(shù)如下所示。
Tasklet可以使測量操作在系統(tǒng)負(fù)荷不重時被調(diào)用,或是被立即執(zhí)行,但始終不會晚于下一個CPUclock.
Tasklet始終在中斷期間運行,并且在調(diào)度他的同一CPU上運行。對比單片機(jī)系統(tǒng),在單線程情況下,一般在sht10_read()中調(diào)用2次 measure_sht10()來等待測量完成,測量效率依賴2次測量消耗的時間;但在Linux驅(qū)動程序中,使用Tasklet方式操作,2次測量過程不會對其他線程產(chǎn)生影響,在有其他實時事件需要及時處理時(如網(wǎng)絡(luò),視頻),可以更有效提高驅(qū)動運行效率,降低對其他實時處理產(chǎn)生的影響。
4、溫濕度傳感器測試與驗證
驅(qū)動程序完成以后,需要相應(yīng)測試程序驗證驅(qū)動程序編寫的正確性。由于驅(qū)動程序中不能對數(shù)據(jù)進(jìn)行浮點數(shù)運算,所以測試程序必須將驅(qū)動程序傳遞來的數(shù)據(jù)進(jìn)行浮點數(shù)運算才能得到相應(yīng)的溫濕度值。
4.1溫濕度傳感器測試環(huán)境
在實驗室常溫下,測試程序多次調(diào)用驅(qū)動程序中讀溫濕度的函數(shù)接口獲得測試數(shù)據(jù),來驗證設(shè)計的正確和可靠。并考慮實驗室內(nèi)常溫下,相對濕度與溫度具有非線性關(guān)系,計算濕度值時需要考慮溫度的補(bǔ)償關(guān)系,其關(guān)系如圖3所示。
圖3SORH轉(zhuǎn)換到相對濕度。
為補(bǔ)償濕度傳感器的非線性以獲取準(zhǔn)確數(shù)據(jù),并考慮實際溫度與測試參考溫度(25℃)不同,使用如下公式修正讀數(shù)。
RHlinear是溫度修正系數(shù),RHtrue是相對濕度,SORH是傳感器返回的濕度值。進(jìn)行12bit濕度檢測時,參數(shù)取值如下表所示。
表1濕度轉(zhuǎn)換系數(shù)與溫度補(bǔ)償系數(shù)
由于能隙材料研發(fā)的溫度傳感器具有極好線性,14bit溫度值參考如下公式。
Temperature=d1+d2xSOT
溫度轉(zhuǎn)換系數(shù)取值如下表所示,SOT是傳感器返回的溫度值。
表2溫度轉(zhuǎn)換系數(shù)
利用上述溫濕度轉(zhuǎn)換公式和系數(shù)可以得出溫濕度測量值。
4.2 溫濕度傳感器測試途徑與效率驗證
在測試程序中,考慮上述測量環(huán)境下溫濕度之間的非線性,調(diào)用驅(qū)動程序的sht10_read函數(shù)將讀到的溫濕度數(shù)據(jù)返回上層測試程序進(jìn)行浮點數(shù)運算,將計算值通過串口輸出,達(dá)到測試驗證的目的。測試程序的實現(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;//相對濕度轉(zhuǎn)換公式
rh_true=(t-25)*(t1+t2*rh)+rh_line;
//相對濕度溫度補(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);//打開文件
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);//溫濕度數(shù)值轉(zhuǎn)換
close(fd);//關(guān)閉文件
return0;//退出
}
測試完成后,考察驅(qū)動程序運行效率,即在驅(qū)動程序的tasklet_schedule和copy_to_user前分別對PXA310的OSCR時間計數(shù)寄存器進(jìn)行時間讀取,計算此次溫濕度測量所用時間。計算公式如下所示。
Time=(OSCR2-OSCR1)/OSCR_FREQ
OSCR2是喚醒線程后的時間,OSCR1是進(jìn)入任務(wù)隊列前的時間。OSCR_FREQ是PXA310內(nèi)部時鐘頻率3.25MHz.這樣就可以計算出每次溫濕度讀取消耗的時間,以此對比SHT10開發(fā)文檔中理論測量時間值,確定實際驅(qū)動程序運行的效率。
5、實驗結(jié)果與分析
超級終端中插入驅(qū)動模塊,運行測試程序,可以在終端上看到測試結(jié)果(如圖4)。
圖4超級終端測試結(jié)果
系統(tǒng)功能實現(xiàn)后,利用上述Time計算公式計算驅(qū)動程序中溫濕度測量消耗的時間,實際測試結(jié)果如表3所示。
表3驅(qū)動程序中實際測量消耗的時間
上表的測試結(jié)果不僅和傳感器的響應(yīng)速度有關(guān),而且還與系統(tǒng)中其他運行的線程有關(guān)。當(dāng)系統(tǒng)中有高一級任務(wù)到來或其他實時事件需要處理時,實際測量時間會大于上表中的測量時間,并且隨著任務(wù)的增加測量時間也會相應(yīng)的增加,完成的時間也受到外界中斷的影響。內(nèi)核會在任務(wù)不繁忙時完成測量操作。上表測試結(jié)果并未受到系統(tǒng)中其他驅(qū)動程序和中斷的影響。對比開發(fā)手冊中理論測量時間可以看到,使用任務(wù)隊列的方法對改善系統(tǒng)處理能力與實時性效果明顯。
此外,實現(xiàn)溫濕度傳感器驅(qū)動程序還需要清楚了解SHT10讀寫時序,讀取溫度和濕度所需要的時間不同。如果應(yīng)用程序中得出的溫濕度值超過預(yù)期值,就可以打開GPIO驅(qū)動模塊,觸發(fā)系統(tǒng)板上的蜂鳴器達(dá)到預(yù)警效果。
6、結(jié)語
此設(shè)計方案已經(jīng)應(yīng)用于嵌入式無聲交互控制系統(tǒng)的檢測,并且運行正常。實踐證明,該嵌入式Linux溫濕度傳感器設(shè)計方案可行有效,線程阻塞提高系統(tǒng)運行效率,在環(huán)境測量準(zhǔn)確度和系統(tǒng)實時性方面得到了令人滿意的效果。由于此方案基于Linux操作系統(tǒng)和PXA310平臺,其在多任務(wù)、實時快速處理上具有一定的優(yōu)勢。
評論
查看更多