基于PXA310平臺的溫濕度傳感器設計與實(shí)現方法
摘要:在嵌入式應用領(lǐng)域,需要測量周?chē)h(huán)境的質(zhì)量對生產(chǎn)和工作進(jìn)行監控和預警。通過(guò)比較設計方案,提出在嵌入式Linux 下,基于PXA310 平臺溫濕度傳感器的設計與實(shí)現方法。在Linux 操作系統下通過(guò)對驅動(dòng)程序接口調用,完成溫濕度數據讀取和預警,并對Linux 驅動(dòng)程序編寫(xiě)進(jìn)行比較。實(shí)驗表明,本方案硬件和軟件設計切實(shí)可行,提高了環(huán)境測量的準確度和系統性能的實(shí)時(shí)性。
本文引用地址:http://dyxdggzs.com/article/159806.htm1 引言
在工業(yè)控制和工業(yè)生產(chǎn)領(lǐng)域中,傳感器對于工業(yè)控制和生產(chǎn)環(huán)境的監控作用不言而喻。傳統的傳感器監控系統大都采用單片機控制,其監控的準確度和實(shí)時(shí)性不太令人滿(mǎn)意。本文尋找到一套切實(shí)可行的傳感器設計方案,其利用溫濕度傳感器芯片,基于PXA310硬件平臺和Linux 操作系統,能有效監控現場(chǎng)溫濕度變化。在周?chē)h(huán)境發(fā)生變化,不能滿(mǎn)足工作要求時(shí),可以獲取監控數據并提出預警,提高生產(chǎn)和工作環(huán)境檢測的可靠性及實(shí)時(shí)性。
2 溫濕度傳感器電路設計
比較了一些傳感器應用設計方案后,選用SHT10芯片為嵌入式溫濕度傳感器的核心部件。它外圍電路簡(jiǎn)便,相比其他傳感器芯片(DS18B20)有其獨到優(yōu)勢。
STH10 每秒可進(jìn)行3 次溫濕度測量,數據精度14 bit并且工作穩定。其測量采用CMOSens 專(zhuān)利,所以在測量效率和精度上要好于DS18B20.DS18B20 采用單總線(xiàn)控制方案(1-wire),大約每秒測量一次,9 位數字式溫度數據;只提供溫度測量。其在生產(chǎn)環(huán)境檢測要求嚴格時(shí),就顯得精度和功能有些不足。
2.1 sht10 簡(jiǎn)介
SHT10 是一款高度集成的溫濕度傳感器芯片,提供全量程標定數字輸出。傳感器包括一個(gè)電容性聚合體濕度敏感元件和一個(gè)用能隙材料制成的溫度敏感元件,他們與一個(gè)14 位A/D 轉換器以及一個(gè)串行接口電路設計在同一個(gè)芯片上面。其通過(guò)標定得到校準系數以程序形式儲存在芯片OTP 內存中,并利用兩線(xiàn)制串行接口與內部電壓調整,使外圍系統集成變得快速而簡(jiǎn)單。
2.2 SHT10 工作原理
SHT10 芯片電源3.3V .傳感器上電后,等待11ms 來(lái)完成休眠狀態(tài)。通信復位和啟動(dòng)傳輸命令后,發(fā)送一組測量命令('00000101'表示相對濕度RH,'00000011'表示溫度T),控制器要等待測量結束。這個(gè)過(guò)程需要大約11/55/210ms ,分別對應8/12/14bit 測量。SHT10 通過(guò)下拉DATA 至低電平,表示測量結束??刂破饔|發(fā)SCK 時(shí)鐘前,必須等待這個(gè)數據備妥信號才能將測量數據正確讀入。
測量和通訊結束后,SHT10 自動(dòng)轉入休眠模式。數據傳送采用兩線(xiàn)制串行接口(與I2C 接口不兼容)。
2.3 SHT10 電路原理圖
SHT10 采用LCC 封裝,其DATA 和SCK 引腳分別連接到PXA310 的GPIO78 和GPIO79.PXA310通過(guò)模擬時(shí)序方式實(shí)現對外圍溫濕度傳感器的控制和數據讀寫(xiě)操作。由于SHT10 對于溫濕度靈敏度很高,在系統集成時(shí)應盡量遠離發(fā)熱源(如MCU、LCD 等),否則測量結果會(huì )有所偏離;為SHT10 布線(xiàn)時(shí),周?chē)鷳M量鋪地減少周?chē)骷ζ涞母蓴_。SHT10 電路原理圖如圖1 所示。

圖1 SHT10 電路原理圖
3 Linux溫濕度傳感器驅動(dòng)程序實(shí)現
單片機控制的傳感器設備中,單片機通常是單線(xiàn)程運行。在進(jìn)行溫濕度測量時(shí),單片機需要等待測試結果返回,其方法阻礙了其他測試和操作的同步執行。
在嵌入式Linux 系統中,驅動(dòng)程序將測試任務(wù)送入任務(wù)隊列,交出CPU 控制權,繼而進(jìn)行其他實(shí)時(shí)任務(wù)運行,待內核空閑再進(jìn)入任務(wù)隊列完成傳感器的測量,以此提高系統執行的效率和實(shí)時(shí)性。
3.1 Linux 溫濕度傳感器設備加載
溫濕度傳感器使用Linux 內核的Miscdevice 數據結構在驅動(dòng)程序初始化時(shí)將設備注冊到內核。
Miscdevice 是字符設備,其主設備號為10,設備及設備接口函數定義如下所示。


驅動(dòng)程序加載設備時(shí)將調用內核的注冊函數。在Linux2.4 和2.6 內核中,幾乎所有Linux 驅動(dòng)程序都依靠如下函數加載模塊。
驅動(dòng)程序初始化完成后,上層應用程序可以調用sht10_fops 中的sht10_read 函數進(jìn)行溫濕度的讀取操作。
3.2 Linux 溫濕度傳感器設備操作
進(jìn)行數據讀取前,首先要在驅動(dòng)程序中開(kāi)辟4 個(gè)字節的數據空間,用于存放溫度和濕度測量值。這里定義全局變量數據緩沖區為unsigned char buf[4].
讀取SHT10 溫濕度數據前,需要進(jìn)行端口初始化和SHT10 復位操作,然后將任務(wù)送于任務(wù)隊列并阻塞線(xiàn)程,當任務(wù)完成返回后再喚醒線(xiàn)程,將讀到數據傳遞給上層應用程序做進(jìn)一步處理。程序流程圖和實(shí)現函數如圖2 所示。

圖2 驅動(dòng)程序流程圖。


上述函數中start_trans; write_byte; read_data; read_byte 分別利用PXA310 引腳模擬時(shí)序完成啟動(dòng)傳輸、寫(xiě)字節,讀一位數據和讀字節的操作。

內核tasklet_schedule() 調度執行指定的tasklet,在獲得運行機會(huì )之前只會(huì )調度一次,如果在運行時(shí)被調度, 則完成后會(huì )被再次運行。
wait_for_completion()這個(gè)函數進(jìn)行一個(gè)不可打斷的等待,如果有代碼調用它,并且沒(méi)有完成這個(gè)任務(wù),結果會(huì )是一個(gè)不可殺死的進(jìn)程。copy_to_user()將內核空間數據傳向上層用戶(hù)空間,并讓上層測試程序做進(jìn)一步處理。
3.3 Linux 溫濕度傳感器設備阻塞操作
由于溫濕度傳感器測量需要一定時(shí)間,為提高系統運行效率和實(shí)時(shí)性,在驅動(dòng)程序中阻塞線(xiàn)程,交出內核控制權,等待操作完成后喚醒線(xiàn)程,提高系統利用率。complete()在函數中就是喚醒一個(gè)等待的讀取線(xiàn)程。任務(wù)隊列實(shí)現函數如下所示。

Tasklet可以使測量操作在系統負荷不重時(shí)被調用,或是被立即執行,但始終不會(huì )晚于下一個(gè)CPU clock.
Tasklet 始終在中斷期間運行,并且在調度他的同一CPU 上運行。對比單片機系統,在單線(xiàn)程情況下,一般在sht10_read()中調用2 次measure_ sht10()來(lái)等待測量完成,測量效率依賴(lài)2 次測量消耗的時(shí)間;但在Linux 驅動(dòng)程序中,使用Tasklet 方式操作,2 次測量過(guò)程不會(huì )對其他線(xiàn)程產(chǎn)生影響,在有其他實(shí)時(shí)事件需要及時(shí)處理時(shí)(如網(wǎng)絡(luò ),視頻),可以更有效提高驅動(dòng)運行效率,降低對其他實(shí)時(shí)處理產(chǎn)生的影響。
4 溫濕度傳感器測試與驗證
驅動(dòng)程序完成以后,需要相應測試程序驗證驅動(dòng)程序編寫(xiě)的正確性。由于驅動(dòng)程序中不能對數據進(jìn)行浮點(diǎn)數運算,所以測試程序必須將驅動(dòng)程序傳遞來(lái)的數據進(jìn)行浮點(diǎn)數運算才能得到相應的溫濕度值。
4.1 溫濕度傳感器測試環(huán)境
在實(shí)驗室常溫下,測試程序多次調用驅動(dòng)程序中讀溫濕度的函數接口獲得測試數據,來(lái)驗證設計的正確和可靠。并考慮實(shí)驗室內常溫下,相對濕度與溫度具有非線(xiàn)性關(guān)系,計算濕度值時(shí)需要考慮溫度的補償關(guān)系,其關(guān)系如圖3 所示。

圖3 SORH 轉換到相對濕度。
為補償濕度傳感器的非線(xiàn)性以獲取準確數據,并考慮實(shí)際溫度與測試參考溫度(25℃)不同,使用如下公式修正讀數。

RHlinear 是溫度修正系數,RHtrue 是相對濕度,SORH是傳感器返回的濕度值。進(jìn)行12bit 濕度檢測時(shí),參數取值如下表所示。
表1 濕度轉換系數與溫度補償系數

由于能隙材料研發(fā)的溫度傳感器具有極好線(xiàn)性,14bit 溫度值參考如下公式。
Temperature = d1+d2 x SOT
溫度轉換系數取值如下表所示,SOT 是傳感器返回的溫度值。
表2 溫度轉換系數

利用上述溫濕度轉換公式和系數可以得出溫濕度測量值。
4.2 溫濕度傳感器測試途徑與效率驗證
在測試程序中,考慮上述測量環(huán)境下溫濕度之間的非線(xiàn)性,調用驅動(dòng)程序的sht10_read 函數將讀到的溫濕度數據返回上層測試程序進(jìn)行浮點(diǎn)數運算,將計算值通過(guò)串口輸出,達到測試驗證的目的。測試程序的實(shí)現如下所示。
static void calc_sht10(float *humi, float*temp)
{
float rh=*humi;
float t=*temp;
float rh_line;
float rh_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_true0.1)rh_true=0.1;
printf(Humidity is: %.2f%RHn,rh_true);
printf(Temperature is: %.2f'Cn,t);
}
int main(int argc, char *argv[]) //主函數
{
int fd;
float temp,humi; //溫濕度數據
char buffer[4]; //數據緩沖
fd = open(/dev/sht10, 0); //打開(kāi)文件
if (fd 0) { //打開(kāi)失敗,退出
perror(open device /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); //關(guān)閉文件
return 0; //退出
}
測試完成后,考察驅動(dòng)程序運行效率,即在驅動(dòng)程序的tasklet_schedule 和copy_to_user 前分別對PXA310 的OSCR 時(shí)間計數寄存器進(jìn)行時(shí)間讀取,計算此次溫濕度測量所用時(shí)間。計算公式如下所示。
Time=(OSCR2-OSCR1)/OSCR_FREQ
OSCR2 是喚醒線(xiàn)程后的時(shí)間,OSCR1 是進(jìn)入任務(wù)隊列前的時(shí)間。OSCR_FREQ 是PXA310 內部時(shí)鐘頻率3.25MHz.這樣就可以計算出每次溫濕度讀取消耗的時(shí)間,以此對比SHT10 開(kāi)發(fā)文檔中理論測量時(shí)間值,確定實(shí)際驅動(dòng)程序運行的效率。
5 實(shí)驗結果與分析
超級終端中插入驅動(dòng)模塊,運行測試程序,可以在終端上看到測試結果(如圖4)。

圖4 超級終端測試結果
系統功能實(shí)現后,利用上述Time 計算公式計算驅動(dòng)程序中溫濕度測量消耗的時(shí)間,實(shí)際測試結果如表3 所示。
表3 驅動(dòng)程序中實(shí)際測量消耗的時(shí)間

上表的測試結果不僅和傳感器的響應速度有關(guān),而且還與系統中其他運行的線(xiàn)程有關(guān)。當系統中有高一級任務(wù)到來(lái)或其他實(shí)時(shí)事件需要處理時(shí),實(shí)際測量時(shí)間會(huì )大于上表中的測量時(shí)間,并且隨著(zhù)任務(wù)的增加測量時(shí)間也會(huì )相應的增加,完成的時(shí)間也受到外界中斷的影響。內核會(huì )在任務(wù)不繁忙時(shí)完成測量操作。上表測試結果并未受到系統中其他驅動(dòng)程序和中斷的影響。對比開(kāi)發(fā)手冊中理論測量時(shí)間可以看到,使用任務(wù)隊列的方法對改善系統處理能力與實(shí)時(shí)性效果明顯。
此外,實(shí)現溫濕度傳感器驅動(dòng)程序還需要清楚了解SHT10 讀寫(xiě)時(shí)序,讀取溫度和濕度所需要的時(shí)間不同。如果應用程序中得出的溫濕度值超過(guò)預期值,就可以打開(kāi)GPIO 驅動(dòng)模塊,觸發(fā)系統板上的蜂鳴器達到預警效果。
6 結語(yǔ)
此設計方案已經(jīng)應用于嵌入式無(wú)聲交互控制系統的檢測,并且運行正常。實(shí)踐證明,該嵌入式Linux溫濕度傳感器設計方案可行有效,線(xiàn)程阻塞提高系統運行效率,在環(huán)境測量準確度和系統實(shí)時(shí)性方面得到了令人滿(mǎn)意的效果。由于此方案基于Linux 操作系統和PXA310 平臺,其在多任務(wù)、實(shí)時(shí)快速處理上具有一定的優(yōu)勢。
評論