嵌入式Linux系统应用及项目实践 教学课件 ppt 作者 丰海 第8章_远程温度采集与曲线的生成综合实例

上传人:E**** 文档编号:89502147 上传时间:2019-05-26 格式:PPT 页数:34 大小:1.57MB
返回 下载 相关 举报
嵌入式Linux系统应用及项目实践 教学课件 ppt 作者 丰海 第8章_远程温度采集与曲线的生成综合实例_第1页
第1页 / 共34页
嵌入式Linux系统应用及项目实践 教学课件 ppt 作者 丰海 第8章_远程温度采集与曲线的生成综合实例_第2页
第2页 / 共34页
嵌入式Linux系统应用及项目实践 教学课件 ppt 作者 丰海 第8章_远程温度采集与曲线的生成综合实例_第3页
第3页 / 共34页
嵌入式Linux系统应用及项目实践 教学课件 ppt 作者 丰海 第8章_远程温度采集与曲线的生成综合实例_第4页
第4页 / 共34页
嵌入式Linux系统应用及项目实践 教学课件 ppt 作者 丰海 第8章_远程温度采集与曲线的生成综合实例_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《嵌入式Linux系统应用及项目实践 教学课件 ppt 作者 丰海 第8章_远程温度采集与曲线的生成综合实例》由会员分享,可在线阅读,更多相关《嵌入式Linux系统应用及项目实践 教学课件 ppt 作者 丰海 第8章_远程温度采集与曲线的生成综合实例(34页珍藏版)》请在金锄头文库上搜索。

1、1,第八章 远程温度采集与曲线的生成综合实例,丰海,2,基于远程网络的监测技术已经广泛应用于嵌入式系统中,本章将介绍基于S3C2440和Linux为平台的嵌入式远程温度采集系统,利用DS18B20温度传感器实现温度的采集,通过嵌入式web服务器Boa实现了远程温度的监测,还利用JavaScript脚本在网页中绘制出温度随时间变化的曲线图。软硬件总体设计部分说明了温度采集硬件电路的基本构成;DS18B20驱动程序编写部分详细讲述了DS18B20底层硬件驱动的编写;应用程序部分详细讲述了嵌入式web服务器boa的移植和生成温度曲线图的JavaScript脚本。,3,系统结构图,4,DS18B20与

2、s3c2410的接口电路图,DS18B20与s3c2440处理器的接口电路如上图所示。 4.7 k的上拉电阻能保证总线闲置时其状态为高电平, 供电电压Vcc为3.3v,GND接地, VDD管脚接3.3v供电电源,DQ为通信接口。,5,GPIO接口的使用步骤,(1) 先通过s3c2410_gpio_cfgpin(GPIO接口号,功能代号)函数设置GPIO接口是用来输入的还是用来输出的。如s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_OUTP);表示将S3C2410_GPG14接口设置成输出。 (2) 再通过s3c2410_gpio_setpin

3、(GPIO接口号,输出的值)函数设置GPIO接口输出高低电平,0表示低电平,1表示高电平;s3c2410_gpio_setpin(S3C2410_GPG14,1)表示S3C2410_GPG14接口输出高电平。 (3) s3c2410_gpio_getpin(GPIO接口号)函数用来获得指定GPIO接口输入的值,如s3c2410_gpio_getpin(S3C2410_GPG14),如果S3C2410_GPG14这个接口输入为高电平,返回值是100 0000 0000 0000(十进制为16384),即第14位上是1; (4) s3c2410_gpio_pullup(GPIO接口号) 函数用来指

4、定GPIO接口是否要使用内部的上拉电阻。 使用s3c2410_gpio_pullup(S3C2410_GPG14, 1);宏命令将S3C2410_GPG14接口设置成不使用上拉电阻:注意:默认情况是使用上拉电阻的,因此在大多数情况都省略了这一步;,6,DS18B20驱动需要的头文件,#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static int ds18b20_majo

5、r; /* 将ds18b20的数据引脚DQ接在2440处理器的GPG14管脚上*/ #define DQ S3C2410_GPG14 #define CFG_IN S3C2410_GPG14_INP #define CFG_OUT S3C2410_GPG14_OUTP,7,单总线器件采用了严格的通信协议来保证数据的完整性,通信协议包括:复位脉冲、应答脉冲、写0和写1时序、读0和读1时序。所有这些传输的数据都是以先低位后高位的方式发送或接收的。驱动程序是Linux内核与硬件之间的接口,驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样

6、对硬件设备进行操作。硬件设备驱动程序是内核的一部分,它主要完成以下的功能:设备的初始化、把数据从内核传送到硬件或从硬件读取数据、并给应用程序提供系统调用。编写设备驱动程序的主要工作就是编写子函数模块,并填充file_operations结构体的各个域。,DS18B20 时序,8,DS18B20初始化时序及其驱动模块的实现(代码见书),初始化脉冲由复位脉冲(RESET PULSE)和应答脉冲(PRESENCE PULSE)组成,特别说明的是所有的通信都是以初始化时序开始的。主机总线在开始时刻发送一个从高电平到低电平的复位脉冲,这个低电平信号持续时间最短为480us,接着释放总线进入接收状态,DS

7、l8B20在检测到总线的上升沿之后等待15-60us,随后DS18B20发出持续时间为60-240us的低电平存在脉冲。相应的初始化脉冲模块如下所示,其中变量DQ用来表示总线的电平:,9,while(ret=0) / while循环,直到初始化成功,成功则ret为1,退出循环 s3c2410_gpio_cfgpin(DQ, CFG_OUT); /配置DQ管脚的GPIO接口为输出 s3c2410_gpio_pullup(DQ, 1); / 禁用上拉电阻,已经在电路中接了4.7k的上拉电阻 s3c2410_gpio_setpin(DQ, 1); / 输出高电平 udelay(5); s3c2410

8、_gpio_setpin(DQ, 0); / 产生reset脉冲,并保持低电平 600us udelay(600); s3c2410_gpio_setpin(DQ, 1); / 释放总线 udelay(70); s3c2410_gpio_cfgpin(DQ, CFG_IN); /等待70us后,总线改为输入口 if(s3c2410_gpio_getpin(DQ) /判断总线是否拉低,没被拉低表示初始化失败 printk(“DS18B20 init failed.rn“); ret=0; else udelay(430); / 再继续等待430us后,如果总线被重新释放则表明初始化成功 if(s

9、3c2410_gpio_getpin(DQ) ret=1; printk(“DS18B20 init succesful.rn“); break; s3c2410_gpio_cfgpin(DQ, CFG_OUT); s3c2410_gpio_setpin(DQ, 1); / 释放总线 udelay(3); return ret; /返回初始化标志,ret为0表示没有成功,ret为1表示初始化成功,10,DS18B20写时序及其驱动模块的实现(代码见书),所有的读写操作不论是命令还是数据,都是以字节为单位的,全部都是以先低位后高位的方式传输的。DS18B20的写时序如图8-4所示,当总线从高电平

10、拉至低电平之后的15us之内就必须将所写的位数据送到总线上,DSl8B20在随后的15-45us时间间隔内对总线采样,若总线为低电平,写入的位就是0,若总线为高电平,则写入的位就是1,连续写2位数据的间隙必须大于1us,发送一位数据的时间从总线拉低开始到发送该位结束,时间必须控制在60120us。数据写入结束后,需要将总线释放以确保之后的操作能正确进行。,11,char i = 0; s3c2410_gpio_cfgpin(DQ, CFG_OUT); for(i=0; i= 1; / 向右移一位,准备写下一个位数据 ,向DS18B20写一个字节的子程序部分,12,DS18B20读时序及其驱动模

11、块的实现(代码见书),DS18B20的读取过程:首先主机将总线拉低1us6us,然后释放总线,接着就可以去判断总线的电平,若总线为低电平,说明读取的数据位为0,若总线为高电平,则表明读取的数据位为1,读取一位数据的时间从总线拉低开始到将总线置高准备读取下一位数据位的时间必须大于60us,如图8-5所示,并且位与位之间须有一个大于1us的高电平时间间隔。由于DS18B20温度传感器默认采用12位的分辨率,因此一个温度数据需要读取两个字节。,13,读DS18B20一个字节的子程序部分如下,unsigned char i; unsigned char data=0; s3c2410_gpio_cfg

12、pin(DQ, CFG_OUT); for(i=0; i8; i+) s3c2410_gpio_setpin(DQ, 1); udelay(3); s3c2410_gpio_setpin(DQ, 0); / 总线从高电平拉至低电平产生读时间隙 udelay(3); s3c2410_gpio_setpin(DQ, 1); / 保持低电平3us后,释放总线 s3c2410_gpio_cfgpin(DQ, CFG_IN); / 总线改为输入 udelay(9); if(s3c2410_gpio_getpin(DQ) / 等待9us后,读取总线的位数据 data |= 0x01i; / 如果读到的位为

13、1,则相应的位为1 udelay(60); s3c2410_gpio_cfgpin(DQ, CFG_OUT); / 等待60us后,总线改为输出,并释放总线 s3c2410_gpio_setpin(DQ, 1); udelay(3); / 保证读时间隙的间隔为3us return data;,14,读取DS18B20温度传感器的子程序部分如下:,unsigned char temp=0; unsigned char flag; unsigned char data9; flag = init_ds(); / 产生初始化DS18B20的脉冲序列 if(flag) write_byte(0x0cc

14、); / 因为总线上只有一个DS18B20,所以跳过读ROM里的编号, write_byte(0x44); / 发出温度转换命令 else printk(“write_byte cc 44 command error“); ,15,s3c2410_gpio_cfgpin(DQ, CFG_IN); while(s3c2410_gpio_getpin(DQ)=0) / 当DS18B20正在转换温度时,输出低电平udelay(200); / 等待200us,后再去判断DS18B20是否完成温度的转换 s3c2410_gpio_cfgpin(DQ, CFG_OUT); s3c2410_gpio_set

15、pin(DQ, 1); /总线改为输出,并释放总线/ flag = init_ds(); / 初始化DS18B20 if(flag) write_byte(0x0cc); write_byte(0x0be); /跳过ROM命令,发出读取温度的命令 else printk(“write_byte cc be command error“); / 初始化失败,这打印出错信息 data0 = read_byte();data1 = read_byte(); / 读取温度的低8位和高8位,读取第0字节和第1字节 data2 = read_byte();data3 = read_byte();data4

16、 = read_byte();data5 = read_byte(); data6 = read_byte();data7 = read_byte(); / 读取SCRATCHPAD存储器的第2字节到第7字节 data8 = read_byte(); / 读取CRC校验码,即SCRATCHPAD存储器的第8字节 data1 ,16,驱动的结构体如下: static struct file_operations ds18b20_fops = .owner = THIS_MODULE, .read = ds18b20_read, ; 驱动的初始化子程序部分如下: int _init ds18b20_init

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号