驱动开发-温湿度传感器_第1页
驱动开发-温湿度传感器_第2页
驱动开发-温湿度传感器_第3页
驱动开发-温湿度传感器_第4页
驱动开发-温湿度传感器_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、定时中断技术一、 确定任务1、掌握单总线设备的使用。2、掌握S5PV210设备编程。3、掌握DHT11温湿度传感器的使用。二、 学习内容 1、 阅读S5PV210数据手册,了解GPIO的使用。2、阅读DHT11数据手册,学习怎样使用温湿度传感器。三、基础知识1、硬件原理:根据上述双核实验箱的原理图,我们可以看到温湿度传感器的总线引脚连接到了S5PV210的外部中断0,也就是对应GPH0-0这个引脚上面。四、基本原理要使用DHT11我们得从它的数据手册下手,从DHT11的数据手册我们可以知道,DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和

2、温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。接口说明建议连接线长度短于20米时

3、用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻 DATA用于210与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模

4、式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。通讯过程如下图所示: 总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到

5、输入模式,或者输出高电平均可,总线由上拉电阻拉高。 一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。数字0信号表示方法如下图所示: 数字1信号表示方法如下图所示: 五、代码设计 结合上述的实验原理,我们知道DHT11为一个单总线的设备,DHT11通过单总线与210的GPH0-0连接,所以在我们的实验编程当中我们需要根据DHT11的单总线数据传输协议进行通信才能够采集到正确的数据。驱动的实现也是严格按照DHT11数据手册上的时序进行编程,并且为了数据的准确性,我们还需要对数据进行校验,校验的过程如DHT11数据手册所述。下面给出通信的关键代码,具体驱动代码

6、的实现请查阅对应的驱动源码。#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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论