linux课程设计温度传感器1.docx

上传人:b****4 文档编号:7000452 上传时间:2023-05-10 格式:DOCX 页数:11 大小:48.33KB
下载 相关 举报
linux课程设计温度传感器1.docx_第1页
第1页 / 共11页
linux课程设计温度传感器1.docx_第2页
第2页 / 共11页
linux课程设计温度传感器1.docx_第3页
第3页 / 共11页
linux课程设计温度传感器1.docx_第4页
第4页 / 共11页
linux课程设计温度传感器1.docx_第5页
第5页 / 共11页
linux课程设计温度传感器1.docx_第6页
第6页 / 共11页
linux课程设计温度传感器1.docx_第7页
第7页 / 共11页
linux课程设计温度传感器1.docx_第8页
第8页 / 共11页
linux课程设计温度传感器1.docx_第9页
第9页 / 共11页
linux课程设计温度传感器1.docx_第10页
第10页 / 共11页
linux课程设计温度传感器1.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

linux课程设计温度传感器1.docx

《linux课程设计温度传感器1.docx》由会员分享,可在线阅读,更多相关《linux课程设计温度传感器1.docx(11页珍藏版)》请在冰点文库上搜索。

linux课程设计温度传感器1.docx

linux课程设计温度传感器1

江西理工大学应用科学学院

嵌入式系统开发技术

课程设计

 

专业:

电子信息工程

班级:

电信121

学号:

姓名:

贺佳

设计题目:

Linux温度传感器驱动程序

 

2015年11月24日

 

姓名

贺佳

班级

电信121

学号

课设题目

基于嵌入式Linux温湿度传感器驱动程序

指导教师

王苏敏

评分项目

满分分值

得分

设计文档(30分)

文档格式

封面

2

页面布局

4

目录格式

3

图表质量

2

页眉页脚

2

文档内容

内容完整性

6

内容逻辑性

5

内容正确性

6

程序代码(30分)

程序功能

15

编程规范

7

编程文档

8

答辩(20分)

课题陈述

7

问题答辩

10

是否超时

3

考勤(20分)

20

总评成绩

指导教师评语

 

签名:

年月日

教研室意见

 

签名:

年月日

 

基于嵌入式Linux温湿度传感器驱动程序

2.需求分析

在工业控制和工业生产领域中,传感器对于工业控制和生产环境的监控作用不言而喻。

传统的传感器监控系统大都采用单片机控制,其监控的准确度和实时性不太令人满意。

本文寻找到一套切实可行的传感器设计方案,其利用温湿度传感器芯片,,基于PXA310硬件平台和操作系统,能有效监控现场温湿度Linux变化。

在周围环境发生变化,不能满足工作要求时,可以获取监控数据并提出预警,提高生产和工作环境检测的可靠性及实时性。

温度设计传感器电路设计

比较了一些传感器应用设计方案后,选用SHTlO芯片为嵌入式温湿度传感器的核心部件。

它外围电路简便,相比其他传感器芯片(DSl8820)有其独到优势[1]。

STHlO每秒可进行3次温湿度测量,数据精度14bit并且工作稳定。

其测量采用CMOSens专利[2],所以在测量效率和精度上要好于。

采用单单、线控制方案(l-wire),大约每秒测量一次,9位数字式温度数据;只提供温度测量

需求概述

SHTlO是一款高度集成的温湿度传感器芯片,提供全量程标定数字输出。

传感器包括一个电窑性聚合体湿度敏感元件和一个用能隙材料制成的温度敏感元件,他们与个14位AID转换器以及一个串行接口电路设计在同一个芯片上面。

其通过标定得到校准系数以程序形式储存在芯片OTP内存中,并利用两线制串行接口与内部电压调整,使外国系统集成变得快速而简单。

其在生产环境检测要求严格时,就显得精度和功能有些不足.SHTlO芯片电源3.3V。

传感器上电后,等待门ms来完成“休眠”状态。

通信复位和启动传输命令后,发送组测量命令('’表示相对湿度RH,'门’表示温度T),控制器要等待测量结束。

这个过程需要大约ll/55/210ms,分别对应8/12/14bit测量。

SHTlO通过下拉DATA至低电平,表示测量结束。

控制器触发SCK时钟前,必须等待这个“数据备妥”信号才能将测量数据正确读入。

测量和通讯结束后,SHTlO自动转入休眠模式。

数据传送采用两线制串行接口(与12(接口不兼容)。

3.总体设计

SHTlO采用LCC封装,其DATA和SCK号|脚分

别连接到PXA310的GP1078和GP.气79。

PXA3lO

通过模拟时序方式实现对外国温湿度传感器的控制和数据读写操作。

由于SHTlO对于温湿度灵敏度很高,在系统集成时应尽量远离发热源(如MCU、LCD等),否则测量结果会有所偏离;为SHTlO布线时,周围应尽量铺地减少周围器件对其的干扰。

SHTlO电路原理图如图1所示。

 

4

--

t

JV

i

F

『『

·

G

图1SHTlO电路原理图

Linux温湿度传感器驱动程序实现

单片机控制的传感器设备中,单片机通常是单线程运行。

在进行温湿度测量时,单片机需要等待测试结果返回,其方法阻碍了其他测试和操作的罔步执行。

在嵌入式Lim』X系统中,驱动程序将测试任务送入任务队列,交出CPU控制权,继而进行其他实时任务运行,待内核空闲再进λ任务队列完成传感器的测量,以此提高系统执行的效率和实时性。

Linux温湿度传感器设备加载

温湿度传感器使用Linux内核的Miscdevice数据结构在驱动程序初始化时将设备注册到内核。

Miscdevice是字符设备,其主设备号为10,设备及设备接口函数定义如下所示。

staticstructfile_operationsshtlO_fops={owner:

THIS_MODULE,//所属的设备模块

read:

shtlO_read,//数据读取操作

staticstructmiscdevicemy_shtlO={

.minor=4,//设备号为4

.name="SHTlO"//设备名称为SHTlO

.fops=&shtlO_fops,//设备可用相关操作

驱动程序加载设备时将调用

内核的注册函数。

在Linux2.4和2.6内核申,几乎所有Linux驱动程序都依靠如下函数加载模块.

staticintinitshtl

O_init(void)

misc_register(&my_shtlO);//注册设备SHTlO

returnO;//返回成功操作0

驱动程序初始化完成后,上层应用程序可以调用shtlO_fops中的shtlO_read函数进行温湿度的读取操作。

Linux温湿度传感器设备操作

进行数据读取前,首先要在驱动程序甲开辟4个字节的数据空间,用于存放温度和湿度测量值。

这里定义全局变量数据缓冲区为unsignedcharbu例。

读取SHTlO温湿度数据前,需要进行端口初始化和SHTlO复位操作,然后将任务送于任务队列并阻塞线程[SJ,当任务完成返回后再唤醒线程,将读到数据传递给上层应用程序做进一步处理。

程序流程图和实现函数如图2所示。

内核空间数据送往用户空间处理

 

图2驱动程序流程图

staticintmeasure_shtlO(u8checksum,u8mode)

unsignedcharerror=O;//设备无应答,标识清O

inti=O;//用来指示数据存放位置

start_trans();//模拟时序,启动传输

switch(mode)//选择测量方式

caseTEMP:

error+=write_byte(MEASURE_TEMP);

i=l;break;//测量温度,指示存放位置

caseHUMl:

error+=w「ite_byte(MEASURE_HUMI);

break;//测量湿度

while(]){//等待SHTlO应答,退出

if(read_data0==0)break;

if(i){//查看i,存放数据

buf[O]=read_byte(ACK);//将测量温度数据存放于

buf[l]=read_byte(ACK);//buf[O]和buf[1],并应答

else{

buf[2]=read_byte(ACK);//将测量湿度数据存放于

buf[3]=read_byte(ACK);//buf[2]矛日buf[3]并应答

}//最后读效验,无应答

checksum=read_byte(noACK);

returnerror;//返回错误标识

 

上述函数中start_trans;write_byte;read_data;read_byte分别利用PXA310sl脚模拟时序完成启动传输、写字节,读一位数据和读字节的操作。

 

staticssize_tshtlO_read(structfile吁ile,char*buffer,size_tcount,loff_t*ppos)

porUnit();//初始化PXA310端口

reset_sht100;//复位SHTlO

tasklet_schedule(&shtlO_tasklet);//将任务送于任务队列

wait_for_completion(&comp);//阻塞线程,等待完成

copy_to_user(buffer,(char*)&buf,sizeof(buf));//将读到的数据返回用户

returnO;//空间,退出

 

内核tasklet_schedule()调度执行指定的tasklet,在获得运行机会之前只会调度一次,如果在运行时被调度,则完成后会被再次运行[6)0wait_for_completion()这个函数进行个不可打断的等待,如果有代码调用它,并且没有完成这个任务,结果会是一个不可杀死的进程。

copy_to_user()将内核空间数据传向上层用户空间,并让上层测试程序做进一步处理。

Linux温湿度传感器设备阻塞操作由于温湿度传感器测量需要一定时间,为提高系统运行效率和实时性,在驱动程序中阻塞线程,交出内核控制权,等待操作完成后唤醒线程,提高系统利用率。

complete()在函数申就是唤醒一个等待的读取线程。

任务队列实现函数如下所示。

staticintshtlO_do『tasklet(void)

unsignedinte「ror=O;//无应答,标识清O

unsignedcharchecksum=O;//效验清O

error+=measure_shtlO(checksum,TEMP);

error+=measure_shtlO(checksum,HUMI);

complete(&comp);//完成测量,唤醒线程

if(error!

=0)//测量有误,提示

{printk(”wrongin1easureerror==>%d\n”,error);

else{

printk(”datacorrect!

\n”);//测量无误输出提示

returnerror;//返回错误标识

 

Tasklet可以使测量操作在系统负荷不重时被调用,或是被立即执行,但始终不会晚于下一个CPUclock。

Tasklet始终在中断期间运行,并且在调度他的同CPU上运行。

对比单片机系统,在单线程情况下,一般在shtlO_read()中调用2次measure_shtl0()来等待测量完成,测量效率依赖2次测量消耗的时间;但在Linux驱动程序中,使用Tasklet方式操作,2次测量过程不会对其他线程产生影响,在有其他实时事件需要及时处理时(如网络,视频),可以更有效提高驱动运行效率,降低对其他实时处理产生的影响。

温湿度传感器测试途径与效率验证在测试程序中,考虑上述测量环境下温湿度之间的非线性,调用驱动程序的shtlO_read函数将读到的温湿度数据返回上层测试程序进行浮点数运算,将计算值通过串口输出,达到测试验证的目的。

测试程序的实现如下所示。

staticvoidcalc_shtlO(float*temp)

floatrh=*humi:

floatt=*temp;

floatrh_line·

floatrh_true·

t=t*d2+dl;//温度转换公式

rh_line=C3*rh*rh+C2*rh+Cl;//相对湿度转换公式

rh_true=(t甲25)*(tl+t2*rh)+rh_line//相对湿度温度补偿

if(rh_true>1OO)rh_true=l00;//超出范围

if(rh_true

printf(”Humidityis:

%.2RH\n",rh_true);

printf(”Temperatureis:

%.2fC\n”,t);

intmain(intargc,char*argv[])//主函数

intfd;

floattemp,humi;//温湿度数据

charbuffer[4];//数据缓冲

fd=open(”/dev/shtlO",O);//打开文件

if(fd<0){//打开失败,退出

perror(pendevice/dev/shtlO");exit(l);

read(fd,buffer,sizeof(buffer));//读取温湿度

temp=(float)((buffer[O]<<8)1buffer[l]);

humi=(float)((buffer[2]<<8)Ibuffer[3]);

calc_shtlO(&humi,&temp);//温湿度数值转换

close(fd);//关闭文件

returnO;//退出

 

测试完成后,考察驱动程序运行效率,即在驱动程序的tasklet_schedu怡和copy_to_user前分别对PXA310的OSCR时间计数寄存器进行时间读取,计算此次温湿度测量所用时间。

计算公式如下所示。

Time=(OSCR2-0SCR1)/0SCR_FREQ

OSCR2是唤醒线程后的时间OSCR1是进人任务队列前的时间。

OSCR_FREQ是PXA310内部时钟频率3.25MHz这样就可以计算出每次温湿度读取消耗的时间,以此对比SHTlO开发文档中理论测量时间值,确定实际驱动程序运行的效率。

5实验结果与分析

超级终端中插入驱动模块,运行测试程序,可以在终端上看到测试结果(如图的。

[root@Linux/rootJt#insmodsht10.ko

Usingshtl0.ko

[root@Linux/root]./sht10

datacorrect!

Humidityis:

37.4S%RH

Temperatureis:

23.72’C

[root@Linux/rootJH

 

4.设计总结

在嵌入式应用领域,需要测量周围环境的质量对生产和工作进行监控和预警。

通过比较设计方案,提出在嵌入式Linux下,基于PXA3lO平台温温度传感器的设计与实现方法。

在Linux操作系统下通过对驱动程序接口调用,完成温温度数据读取和预警,并对Linux驱动程序编写进行比较。

实验表明,本方案硬件和软件设计切实可行,提高了环境测量的准确度和系统性能的实时性.此设计方案己经应用于嵌入式无声交互控制系统的检测,并且运行正常。

实践证明,该嵌人式Linux温湿度传感器设计方案可行有效,线程阻塞提高系统运行效率,在环境测量准确度和系统实时性方面得到了令人满意的效果。

由于此方案基于Linux操作系统和PXA310平台,其在多任务、实时快速处理上具有一定的优势。

5参考文献

1.嵌入式系统接口设计与Linux驱动程序开发

2.嵌入式Linux应用程序开发(第2版).人民邮电局出版社

3.嵌入式Linux应用开发完全手册

4.Linux内核设计与实现

5.Linux设备驱动程序

 

6附录

staticintmeasure_shtlO(u8checksum,u8mode

unsignedcharerror=O;//设备无应答,标识清O

inti=O;//用来指示数据存放位置

start_trans();//模拟时序,启动传输

switch(mode)//选择测量方式

caseTEMP:

error+=write_byte(MEASURE_TEMP);

i=l;break;//测量温度,指示存放位置

caseHUMl:

error+=w「ite_byte(MEASURE_HUMI);

break;//测量湿度

while(]){//等待SHTlO应答,退出

if(read_data0==0)break;

if(i){//查看i,存放数据

buf[O]=read_byte(ACK);//将测量温度数据存放于

buf[l]=read_byte(ACK);//buf[O]和buf[1],并应答

else{

buf[2]=read_byte(ACK);//将测量湿度数据存放于

buf[3]=read_byte(ACK);//buf[2]矛日buf[3]并应答

}//最后读效验,无应答

checksum=read_byte(noACK);

returnerror;//返回错误标识

staticssize_tshtlO_read(structfile吁ile,char*buffer,size_tcount,loff_t*ppos)

porUnit();//初始化PXA310端口

reset_sht100;//复位SHTlO

tasklet_schedule(&shtlO_tasklet);//将任务送于任务队列

wait_for_completion(&comp);//阻塞线程,等待完成

copy_to_user(buffer,(char*)&buf,sizeof(buf));//将读到的数据返回用户

returnO;//空间,退出

staticintshtlO_do『tasklet(void)

unsignedinte「ror=O;//无应答,标识清O

unsignedcharchecksum=O;//效验清O

error+=measure_shtlO(checksum,TEMP);

error+=measure_shtlO(checksum,HUMI);

complete(&comp);//完成测量,唤醒线程

if(error!

=0)//测量有误,提示

{printk(”wrongin1easureerror==>%d\n”,error);

else{

printk(”datacorrect!

\n”);//测量无误输出提示

returnerror;//返回错误标识

staticvoidcalc_shtlO(float*temp)

floatrh=*humi:

floatt=*temp;

floatrh_line·

floatrh_true·

t=t*d2+dl;//温度转换公式

rh_line=C3*rh*rh+C2*rh+Cl;//相对湿度转换公式

rh_true=(t甲25)*(tl+t2*rh)+rh_line//相对湿度温度补偿

if(rh_true>1OO)rh_true=l00;//超出范围

if(rh_true

printf(”Humidityis:

%.2RH\n",rh_true);

printf(”Temperatureis:

%.2fC\n”,t);

intmain(intargc,char*argv[])//主函数

intfd;

floattemp,humi;//温湿度数据

charbuffer[4];//数据缓冲

fd=open(”/dev/shtlO",O);//打开文件

if(fd<0){//打开失败,退出

perror(pendevice/dev/shtlO");exit(l);

read(fd,buffer,sizeof(buffer));//读取温湿度

temp=(float)((buffer[O]<<8)1buffer[l]);

humi=(float)((buffer[2]<<8)Ibuffer[3]);

calc_shtlO(&humi,&temp);//温湿度数值转换

close(fd);//关闭文件

returnO;//退出

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2