




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、江西理工大學(xué)應(yīng)用科學(xué)學(xué)院嵌入式系統(tǒng)開(kāi)發(fā)技術(shù)課程設(shè)計(jì)專 業(yè): 電子信息工程 班 級(jí): 電信121 學(xué) 號(hào): 姓 名: 賀佳 設(shè)計(jì)題目:Linux溫度傳感器驅(qū)動(dòng)程序 2015年11月24日姓 名賀佳班 級(jí)電信121學(xué) 號(hào)課設(shè)題目基于嵌入式Linux溫濕度傳感器驅(qū)動(dòng)程序指導(dǎo)教師王蘇敏評(píng)分項(xiàng)目滿分分值得分設(shè)計(jì)文檔(30分)文檔格式封面2頁(yè)面布局4目錄格式3圖表質(zhì)量2頁(yè)眉頁(yè)腳2文檔內(nèi)容內(nèi)容完整性6內(nèi)容邏輯性5內(nèi)容正確性6程序代碼(30分)程序功能15編程規(guī)范7編程文檔8答辯(20分)課題陳述7問(wèn)題答辯10是否超時(shí)3考勤(20分)20總評(píng)成績(jī)指導(dǎo)教師評(píng)語(yǔ)簽名: 年 月 日教研室意見(jiàn)簽名: 年 月 日基于嵌
2、入式Linux溫濕度傳感器驅(qū)動(dòng)程序2.需求分析在工業(yè)控制和工業(yè)生產(chǎn)領(lǐng)域中, 傳感器對(duì)于工業(yè)控制和生產(chǎn)環(huán)境的監(jiān)控作用不言而喻。傳統(tǒng)的傳感器監(jiān)控系統(tǒng)大都采用單片機(jī)控制, 其監(jiān)控的準(zhǔn)確度和實(shí)時(shí)性不太令人滿意。本文尋找到一套切實(shí)可行的傳感器設(shè)計(jì)方案,其利用溫濕度傳感器芯片,基于PXA310硬件平臺(tái)和操作系統(tǒng),能有效監(jiān)控現(xiàn)場(chǎng)溫濕度Linux變化。在周圍環(huán)境發(fā)生變化, 不能滿足工作要求時(shí),可以獲取監(jiān)控?cái)?shù)據(jù)并提出預(yù)警, 提高生產(chǎn)和工作環(huán)境檢測(cè)的可靠性及實(shí)時(shí)性。溫度設(shè)計(jì)傳感器電路設(shè)計(jì)比較了一些傳感器應(yīng)用設(shè)計(jì)方案后 ,選用SHTl O 芯片為嵌入式溫濕度傳感器的 核心部件。它外圍電路簡(jiǎn) 便,相比其他傳感器芯片(
3、DSl 8820)有其獨(dú)到優(yōu)勢(shì)1。 STHlO 每秒可進(jìn)行 3 次溫濕度測(cè)量 ,數(shù)據(jù)精度 14 bit 并且工作穩(wěn)定。其測(cè)量采用 CMOSens 專利2 ,所以在 測(cè)量效率和精度上要好于 。 采用 單單、線控制方案( l-wire) ,大約每秒測(cè)量一次,9 位數(shù) 字式溫度數(shù)據(jù);只提供溫度測(cè)量需求概述SHTlO 是一款高度集成的溫濕度傳感器芯片 ,提供全量程標(biāo)定數(shù)字輸出 。傳感器包括一個(gè)電窯 性聚合 體濕度敏感元件和一個(gè)用能隙材料制成的溫度 敏感元 件,他們與 個(gè) 14 位 AI D 轉(zhuǎn)換器以及一個(gè)串行接 口電路設(shè)計(jì)在同一個(gè)芯片上面。其通過(guò)標(biāo)定得到校 準(zhǔn) 系數(shù)以程序形式儲(chǔ)存在芯片 OTP 內(nèi)存中
4、,并利用兩 線制串行接口與 內(nèi)部電壓調(diào)整 ,使外國(guó)系統(tǒng)集成變得 快速而簡(jiǎn)單。其在生產(chǎn)環(huán)境檢測(cè)要 求嚴(yán)格時(shí),就顯得精度和功能有些不足.SHTl O 芯片 電源 3.3V 。傳感器上 電后,等待 門ms 來(lái)完成 “休眠” 狀態(tài)。通信復(fù)位和啟動(dòng)傳輸命 令后,發(fā)送 組測(cè)量命令( 表示相對(duì)濕 度 RH, 門 表示溫度 T) ,控制器要等待測(cè) 量結(jié)束。這個(gè)過(guò)程需要大約 ll/5 5 / 210ms ,分別對(duì) 應(yīng) 8/12 /14bit 測(cè)量。SHTlO 通過(guò)下拉 DATA 至低 電平,表示測(cè)量結(jié)束。控制器觸發(fā) SCK 時(shí)鐘前,必須等待這個(gè) “數(shù)據(jù)備妥” 信號(hào)才能將測(cè)量數(shù)據(jù)正確讀 入。 測(cè)量和通訊結(jié)束后 ,
5、SHTlO 自動(dòng)轉(zhuǎn)入休眠模式。數(shù)據(jù) 傳送采用兩線制串行接 口(與 12( 接口不兼容)。3.總體設(shè)計(jì)SHTl O 采用 LCC 封裝,其DATA 和 SCK 號(hào) 腳分別連接到 PXA310 的 GP1078 和 GP.氣 79。PXA3 lO通過(guò)模擬時(shí)序方式實(shí)現(xiàn)對(duì)外 國(guó)溫濕度傳感器的控制和 數(shù)據(jù)讀寫操作。由于 SHTl O 對(duì)于溫濕度靈敏度很高 ,在系統(tǒng)集成時(shí)應(yīng)盡量遠(yuǎn)離發(fā)熱源(如 MCU、LCD 等), 否則測(cè)量結(jié)果會(huì)有所偏離 ;為 SHTlO 布線時(shí),周圍應(yīng) 盡量鋪地減少周圍器件對(duì)其 的干擾。SHTlO 電路原理 圖如圖 1 所示。d三KSOP.豆雨雨4”tJV、iF G圖 1 SHTl O
6、 電路原理圖Linux溫濕度傳感器驅(qū)動(dòng)程序 實(shí)現(xiàn)單片機(jī)控制的傳感器設(shè)備中 ,單片機(jī)通常是單線 程運(yùn)行。在進(jìn)行溫濕度測(cè)量時(shí) ,單片機(jī)需要等待測(cè)試 結(jié)果返回,其方法阻礙了其他測(cè)試和操作的罔步執(zhí)行。 在嵌入式 LimX 系統(tǒng)中,驅(qū)動(dòng)程序?qū)y(cè)試任務(wù)送入任 務(wù)隊(duì)列,交出CPU 控制權(quán),繼而進(jìn)行其他實(shí)時(shí)任務(wù)運(yùn) 行,待內(nèi)核空閑再進(jìn)任務(wù)隊(duì)列完成傳感器的測(cè)量 , 以此提高系統(tǒng)執(zhí)行的效率和實(shí)時(shí)性。Linux 溫濕度傳感器設(shè)備加載 溫濕度傳感器使用Linux 內(nèi)核的 Miscdevice 數(shù)據(jù)結(jié)構(gòu)在驅(qū)動(dòng)程序初始化時(shí)將設(shè)備注冊(cè)到內(nèi)核 。 Miscdevice 是字符設(shè)備 ,其主設(shè)備號(hào)為 10,設(shè)備及 設(shè)備接口函數(shù)定義
7、如下所示。static struct file_operations shtl O_fops = owner:THIS_MODULE,/ 所 屬 的 設(shè) 備 模塊read: shtl O_ read, /數(shù)據(jù)讀取操作static struct miscdevice my_shtl O =.minor=4, /設(shè)備號(hào)為4 .name=SHTl O /設(shè)備名稱為SHTl O.fops=&shtl O_fops, /設(shè)備可用相關(guān)操作驅(qū)動(dòng)程序加載設(shè)備時(shí)將調(diào)用 內(nèi)核的注冊(cè)函數(shù)。在Linux2.4 和 2.6 內(nèi)核申,幾乎所有 Linux 驅(qū)動(dòng)程序都依靠如下函數(shù)加載模塊.static int init s
8、htl O_init(void)misc_register(&my_shtl O); /注冊(cè)設(shè)備SHTl Oreturn O; /返回成功操作0驅(qū)動(dòng)程序初始化完成后 ,上層應(yīng)用程序可以調(diào)用 shtl O_fops 中的 shtl O_read 函數(shù)進(jìn)行溫濕度的讀 取操作。Linux 溫濕度傳感器設(shè)備操作進(jìn)行數(shù)據(jù)讀取前,首先要在驅(qū)動(dòng)程序 甲開(kāi)辟 4 個(gè) 字節(jié)的數(shù)據(jù)空間,用于存放溫度和濕度測(cè)量值 。這里 定義全局變量數(shù)據(jù)緩沖區(qū)為 unsigned char bu例。讀取 SHTl O 溫濕度數(shù)據(jù)前 ,需要進(jìn)行端 口初始化 和 SHTlO 復(fù)位操作,然后將任務(wù)送于任務(wù)隊(duì)列 并阻塞 線程SJ ,當(dāng)任務(wù)
9、完成返回后再喚醒線 程,將讀到數(shù)據(jù) 傳遞給上層應(yīng)用程序做進(jìn)一步處理 。程序流程圖和實(shí) 現(xiàn)函數(shù)如圖 2 所示。 進(jìn)入任務(wù)隊(duì)列完成傳 感器測(cè)量,喚醒線程 內(nèi)核空間數(shù)據(jù)送往用戶空間處理 圖 2驅(qū)動(dòng)程序流程圖static int measure_ shtl O(u8 checksum,u8 mode)unsigned char error=O; 設(shè)備無(wú)應(yīng)答 ,標(biāo)識(shí)清 Oint i=O; 用來(lái)指示數(shù)據(jù)存放位置start_trans(); 模擬時(shí)序,啟動(dòng)傳輸switch(mode) 選擇 測(cè) 量 方式case TEMP:error+ =write_ byte(MEASURE_ TEMP);i= l;bre
10、ak; 測(cè)量溫度 ,指示存放位置caseHUMl:error+=wite_byte(MEASURE_ HUMI);break; 測(cè)量濕度while() 等待 SHTlO 應(yīng)答 ,退出if(read_data0=0) break;if(i) 查看 i,存放數(shù)據(jù)bufO=read_byte(ACK); 將測(cè)量溫度數(shù)據(jù) 存放于bufl =read_byte(ACK); / /bufO和 buf1,并應(yīng)答elsebuf2=read_byte(ACK); 將測(cè)量濕度數(shù)據(jù) 存放于buf3=read_byte(ACK); / / buf2矛日 buf3并應(yīng)答 最后讀效驗(yàn) ,無(wú)應(yīng)答checksum= read
11、_byte(noACK);return error; 返回錯(cuò)誤標(biāo)識(shí)上 述函數(shù)中 start_trans; write_byte; read_data;read_byte 分別利用 PXA310 sl腳模擬時(shí)序 完成啟動(dòng)傳輸、寫字節(jié),讀一位數(shù)據(jù)和讀字節(jié)的操作。staticssize_tsht lO_read(structfile吁ile,char *buffer,size_t count,loff_t *ppos)porUnit(); 初始化 PXA310 端口reset_sht100; 復(fù)位 SHTl Otasklet_schedule(&shtl O_tasklet); 將任務(wù)送于任務(wù)隊(duì)列w
12、ait_for_completion(&comp); 阻塞線程 ,等待完成copy_to_user(buffer, (char *)&buf,sizeof(buf); 將讀到的數(shù)據(jù)返 回用戶return O; 空間,退出內(nèi) 核 tasklet_sched ule() 調(diào) 度 執(zhí) 行 指 定 的tasklet ,在獲得運(yùn)行機(jī)會(huì)之前 只會(huì)調(diào)度一次 ,如果在 運(yùn) 行 時(shí)被 調(diào) 度 ,則 完 成 后 會(huì) 被 再 次 運(yùn) 行 6) 0 wait_for_completion ()這個(gè)函數(shù)進(jìn)行個(gè)不可打斷 的等待,如果有代碼調(diào)用它 ,并且沒(méi)有完成這個(gè)任務(wù) , 結(jié)果會(huì)是一個(gè)不可殺死的進(jìn)程 。copy_to_u
13、ser ()將內(nèi) 核空間數(shù)據(jù)傳向上層用戶空間 ,并讓上層測(cè)試程序做 進(jìn)一步處理。 Linux 溫濕度傳感器設(shè)備阻塞操作 由于溫濕度傳感器測(cè)量需要一 定時(shí)間 ,為提高系統(tǒng)運(yùn)行效率和實(shí)時(shí)性 ,在驅(qū)動(dòng)程序中阻塞線程 ,交出 內(nèi)核控制權(quán) ,等待操作完成后喚醒線程 ,提高系統(tǒng)利 用率。complete()在函數(shù)申就是喚醒一個(gè)等待 的讀取 線程。任務(wù)隊(duì)列實(shí)現(xiàn)函數(shù)如下所示 。static int shtl O_dotasklet(void)unsigned int eror=O; 無(wú)應(yīng)答 ,標(biāo)識(shí)清 O unsigned char checksum=O; 效驗(yàn)清 O error+=measure_shtl O
14、(checksum,TEMP);error+=measure_shtl O(checksum, HUMI); complete(&comp); 完成測(cè)量,喚醒線程if(error! =0) 測(cè)量有誤 ,提示 printk(”wrong in 1easureerror=%dn”,error);elseprintk(”data correct!n”); 測(cè)量無(wú)誤輸出提示return error; 返回錯(cuò)誤標(biāo)識(shí)Tasklet 可以使測(cè)量操作在系統(tǒng)負(fù)荷不重時(shí)被調(diào)用,或是被立即執(zhí)行,但始終不會(huì)晚于下一個(gè) CPU clock。 Tasklet 始終在中斷期間運(yùn)行 ,并且在調(diào)度他的同 CPU 上運(yùn)行。對(duì)比單
15、片機(jī)系統(tǒng),在單線程情況下,一般在 shtl O_read()中調(diào)用 2 次 measure_shtl 0()來(lái)等 待測(cè)量完成 ,測(cè)量效率依賴 2 次測(cè)量消耗的時(shí)間;但在Linux 驅(qū)動(dòng)程序中,使用 Tasklet 方式操作,2 次測(cè)量過(guò)程不會(huì)對(duì)其他線程產(chǎn)生影響,在有其他實(shí)時(shí)事件需要 及時(shí)處理時(shí)(如網(wǎng)絡(luò),視頻),可以更有效提高驅(qū)動(dòng)運(yùn)行效率,降低對(duì)其他實(shí)時(shí)處理產(chǎn)生的影響。溫濕度傳感器測(cè)試途徑與效率驗(yàn)證 在測(cè)試程序中 ,考慮上述測(cè)量環(huán)境下溫濕度之間的非線性,調(diào)用驅(qū)動(dòng)程序 的 shtl O_read 函數(shù)將讀到 的溫濕度數(shù)據(jù)返回上層測(cè)試程序進(jìn)行浮點(diǎn)數(shù)運(yùn)算 ,將 計(jì)算值通過(guò)串 口輸出,達(dá)到測(cè)試驗(yàn)證的 目
16、的。測(cè)試程 序的實(shí)現(xiàn)如下所示 。static void calc_sht l O(float*temp)float rh =*h u mi: float t=*tem p; float rh _l ine float rh_truet=t*d 2 +d l ; /溫度轉(zhuǎn)換公式rh _li ne=C3*rh*rh +C2*rh +Cl ; /相對(duì)濕度轉(zhuǎn) 換公式rh_t rue =(t甲2 5)*(t l +t2*rh)+ rh_l ine /相對(duì)濕度溫度補(bǔ)償 if(rh_true 1OO)rh_tru e= l 00; /超出范圍 if(rh_trueO. l )rh_true=0.1 ;pri
17、ntf (” Hu mid ityis: %.2 RH n,rh _true); pri ntf(”Tem peratu re is: %.2f C n”,t);i nt mai n(i nt argc, char *argv) /主函數(shù)i nt fd;float tem p, h u mi; /溫濕度數(shù)據(jù)char buffer4; /數(shù)據(jù)緩沖fd = open(” /dev/ sht l O, O);/打開(kāi)文件if (fd 0) /打開(kāi)失敗 ,退出perror(pen device / dev/ sht l O); exit( l );read(fd,buffer,sizeof(buffer
18、); /讀取 溫 濕 度值tem p=(float)(bufferO 8)1 bufferl ); h u mi =(float)(buffer2 %dn”,error);elseprintk(”data correct!n”); 測(cè)量無(wú)誤輸出提示return error; 返回錯(cuò)誤標(biāo)識(shí)static void calc_sht l O(float*temp)float rh =*h u mi: float t=*tem p; float rh _l ine float rh_truet=t*d 2 +d l ; /溫度轉(zhuǎn)換公式rh _li ne=C3*rh*rh +C2*rh +Cl ; /相對(duì)濕度轉(zhuǎn) 換公式rh_t rue =(t甲2 5)*(t l +t2*rh)+ rh_l ine /相對(duì)濕度溫度補(bǔ)償 if(rh_true 1OO)rh_tru e= l 00; /超出范圍 if(rh_trueO. l )rh_true=0.1 ;printf (” Hu mid ityis: %.2 RH n,rh _true); pri ntf(”Tem peratu re is: %.2f C n”,t);i nt mai n(i nt argc, char *argv) /主函數(shù)i nt fd;float tem p, h u mi; /溫濕度數(shù)據(jù)ch
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工頂崗換崗管理辦法
- 科技特派服務(wù)管理辦法
- 工時(shí)定額制定管理辦法
- 存款貼息資金管理辦法
- 設(shè)計(jì)薪酬管理辦法規(guī)定
- 綜合柜員存款管理辦法
- 自費(fèi)出國(guó)旅游管理辦法
- 外聘機(jī)構(gòu)審計(jì)管理辦法
- 郵政中轉(zhuǎn)處理管理辦法
- 科研創(chuàng)新計(jì)劃管理辦法
- 2025年綏化市中考化學(xué)試題卷(含答案解析)
- GB/T 45719-2025半導(dǎo)體器件金屬氧化物半導(dǎo)體(MOS)晶體管的熱載流子試驗(yàn)
- 寶媽日常心理護(hù)理
- 2025年社會(huì)學(xué)概論測(cè)試題含答案(附解析)
- 2025-2030年環(huán)境工程產(chǎn)業(yè)深度調(diào)研及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 2025年事業(yè)單位公開(kāi)招聘考試(E類)《綜合應(yīng)用能力西醫(yī)臨床》試卷真題及完整解析
- 國(guó)家開(kāi)放大學(xué)2024年春季學(xué)期期末統(tǒng)一考試《中文學(xué)科論文寫作》試題(試卷代號(hào)11332)
- 2024年安徽大學(xué)專職輔導(dǎo)員招聘筆試真題
- GB 9743-2024轎車輪胎
- 滬科版七年級(jí)上數(shù)學(xué)教學(xué)計(jì)劃
- 沃爾瑪專用匯總Wal-MartTerminology
評(píng)論
0/150
提交評(píng)論