驅動開發(fā)-溫濕度傳感器_第1頁
驅動開發(fā)-溫濕度傳感器_第2頁
驅動開發(fā)-溫濕度傳感器_第3頁
驅動開發(fā)-溫濕度傳感器_第4頁
驅動開發(fā)-溫濕度傳感器_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、定時中斷技術一、 確定任務1、掌握單總線設備的使用。2、掌握S5PV210設備編程。3、掌握DHT11溫濕度傳感器的使用。二、 學習內容 1、 閱讀S5PV210數據手冊,了解GPIO的使用。2、閱讀DHT11數據手冊,學習怎樣使用溫濕度傳感器。三、基礎知識1、硬件原理:根據上述雙核實驗箱的原理圖,我們可以看到溫濕度傳感器的總線引腳連接到了S5PV210的外部中斷0,也就是對應GPH0-0這個引腳上面。四、基本原理要使用DHT11我們得從它的數據手冊下手,從DHT11的數據手冊我們可以知道,DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和

2、溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩(wěn)定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優(yōu)點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統(tǒng)集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。產品為4針單排引腳封裝。連接方便,特殊封裝形式可根據用戶需求而提供。接口說明建議連接線長度短于20米時

3、用5K上拉電阻,大于20米時根據實際情況使用合適的上拉電阻 DATA用于210與DHT11之間的通訊和同步,采用單總線數據格式,一次通訊時間4ms左右,數據分小數部分和整數部分,具體格式在下面說明,當前小數部分用于以后擴展,現(xiàn)讀出為零.操作流程如下:一次完整的數據傳輸為40bit,高位先出。數據格式:8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據+8bit校驗和數據傳送正確時校驗和數據等于“8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據”所得結果的末8位。用戶MCU發(fā)送一次開始信號后,DHT11從低功耗模式轉換到高速模

4、式,等待主機開始信號結束后,DHT11發(fā)送響應信號,送出40bit的數據,并觸發(fā)一次信號采集,用戶可選擇讀取部分數據.從模式下,DHT11接收到開始信號觸發(fā)一次溫濕度采集,如果沒有接收到主機發(fā)送開始信號,DHT11不會主動進行溫濕度采集。采集數據后轉換到低速模式。通訊過程如下圖所示: 總線空閑狀態(tài)為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發(fā)送80us低電平響應信號.主機發(fā)送開始信號結束后,延時等待20-40us后,讀取DHT11的響應信號,主機發(fā)送開始信號后,可以切換到

5、輸入模式,或者輸出高電平均可,總線由上拉電阻拉高。 一bit數據傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態(tài)。數字0信號表示方法如下圖所示: 數字1信號表示方法如下圖所示: 五、代碼設計 結合上述的實驗原理,我們知道DHT11為一個單總線的設備,DHT11通過單總線與210的GPH0-0連接,所以在我們的實驗編程當中我們需要根據DHT11的單總線數據傳輸協(xié)議進行通信才能夠采集到正確的數據。驅動的實現(xiàn)也是嚴格按照DHT11數據手冊上的時序進行編程,并且為了數據的準確性,我們還需要對數據進行校驗,校驗的過程如DHT11數據手冊所述。下面給出通信的關鍵代碼,具體驅動代碼

6、的實現(xiàn)請查閱對應的驅動源碼。#include <linux/kernel.h>#include <linux/module.h>#include <linux/slab.h>#include <linux/input.h>#include <linux/init.h>#include <linux/errno.h>#include <linux/serio.h>#include <linux/delay.h>#include <linux/clk.h>#include <linux

7、/wait.h>#include <linux/sched.h>#include <linux/cdev.h>#include <linux/miscdevice.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/uaccess.h>#include <mach/regs-adc.h>#include <mach/regs-gpio.h>#include <plat/gpio-cfg.h>#include <mach

8、/gpio.h>#define DEVICE_NAME "humidity"/XEINT0/KP_ROW0/GPH0_0unsigned long receive_value;unsigned long receive_jy;int data_in(void)s3c_gpio_cfgpin(S5PV210_GPH0(0), S3C_GPIO_INPUT);return gpio_get_value(S5PV210_GPH0(0);void data_out(int data)s3c_gpio_cfgpin(S5PV210_GPH0(0), S3C_GPIO_OUTPU

9、T);gpio_set_value(S5PV210_GPH0(0), data); void read_data(void)unsigned int flag = 0;unsigned int u32i = 0;data_out(0);mdelay(20);data_out(1);udelay(40);if (data_in() = 0)while( (data_in() = 0) && (flag+)<50000) );flag = 0;receive_value = 0;receive_jy = 0;while( data_in() != 0 );for (u32i=

10、0x80000000; u32i>0; u32i>>=1)flag = 0;while( (data_in() = 0) && (flag+)<50000) );flag = 0;while( (data_in() != 0) && (flag)<500)udelay(10);flag+;if(flag > 5)/printk("flag 1= %dn",flag);receive_value |= u32i;/printk("flag 0= %dn",flag);for (u32i=0

11、x80; u32i>0; u32i>>=1)flag = 0;while( (data_in() = 0) && (flag+)<50000) );flag = 0;while( (data_in() != 0) && (flag)<500)udelay(10);flag+;if(flag > 5)receive_jy |= u32i;void humidity_read_data(void)unsigned int flag = 0;unsigned int u32i = 0; receive_value = 0; rece

12、ive_jy = 0; data_out(0);mdelay(20);data_out(1);udelay(40);if (data_in() = 0) flag = 0; while(data_in() = 0) udelay(10); flag+; if(flag > 10) return; / printk("80us low flag=%dn",flag); flag = 0; while(data_in() = 1) udelay(10); flag+; if(flag > 10) return; / printk("80us high fl

13、ag=%dn",flag); flag = 0; for (u32i=0x80000000; u32i>0; u32i>>=1) flag = 0; while(data_in() = 0) udelay(10); flag+; if(flag > 10) break; flag = 0;while( data_in() = 1)udelay(10);flag+; if(flag > 10) break;if(flag > 5)receive_value |= u32i; #if 1/printk("flag 0= %dn",f

14、lag);for (u32i=0x80; u32i>0; u32i>>=1) flag = 0; while(data_in() = 0) udelay(10); flag+; if(flag > 10) break; flag = 0;while( data_in() = 1) udelay(10);flag+; if(flag > 10) break;if(flag > 5)receive_jy |= u32i; #endifstatic ssize_t gec210_humidiy_read(struct file *file, char _user

15、*buf, size_t size, loff_t *off)unsigned char tempz = 0;unsigned char tempx = 0;unsigned char humidityz = 0;unsigned char humidityx = 0; unsigned char ecc,jy; humidity_read_data(); humidityz = (receive_value & 0xff000000)>>24;humidityx = (receive_value & 0x00ff0000)>>16;tempz = (r

16、eceive_value & 0x0000ff00)>>8;tempx = (receive_value & 0x000000ff); jy = receive_jy & 0xff; ecc = humidityz + humidityx + tempz + tempx;/ printk("=ecc=%x jy=%x n",ecc,jy); if(ecc != jy) return -EAGAIN;copy_to_user(buf,&receive_value,sizeof (receive_value);return 0;sta

17、tic int gec210_humidiy_open(struct inode *inode, struct file *file)printk("open in kerneln");return 0;static void gec210_humidiy_release(struct inode *inode, struct file *file)printk("");static struct file_operations gec210_humidity_dev_fops = .owner= THIS_MODULE,.open = gec210_h

18、umidiy_open,.read = gec210_humidiy_read,.release = gec210_humidiy_release;static struct miscdevice gec210_humidity_dev = .minor= MISC_DYNAMIC_MINOR,.name= DEVICE_NAME,.fops= &gec210_humidity_dev_fops,;static int _init gec210_humidity_dev_init(void) int ret;ret = gpio_request(S5PV210_GPH0(0), &qu

19、ot;humidity");if (ret) printk("%s: request GPIO %d for humidity failed, ret = %dn", DEVICE_NAME,S5PV210_GPH0(0), ret);return ret;s3c_gpio_cfgpin(S5PV210_GPH0(0), 1);gpio_set_value(S5PV210_GPH0(0), 1);ret = misc_register(&gec210_humidity_dev);printk(DEVICE_NAME"tinitializedn&q

20、uot;);return ret;static void _exit gec210_humidity_dev_exit(void)gpio_free(S5PV210_GPH0(0);misc_deregister(&gec210_humidity_dev);module_init(gec210_humidity_dev_init);module_exit(gec210_humidity_dev_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Gec Lab.");應用部分代碼如下#include <st

21、dio.h>#include <sys/types.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <sys/ioctl.h>#include <sys/stat.h>#include <sys/termios.h>int main()int fd;int ret ;unsigned short tempz = 0;unsigned short tempx = 0; unsigned short humidiyz = 0;unsigned short humidiyx = 0;unsigned long temperature =

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論