本栏目责任编辑:谢媛媛
开发研究与设计技术
电脑知识与技术
1引言
触摸屏在嵌入式设备中的应用正在迅速普及开来,特别是新
一代的智能手机(SmartPhone)、
个人多媒体娱乐设备(如iPod)等手持设备都将提供人机交互的手写识别触摸屏功能。触摸屏正在随
处可见,工业控制系统、
消费电子产品,甚至医疗设备上很多都装备了触摸屏输入装置。
2触摸屏工作原理
2.1触摸屏坐标检测
触摸屏在嵌入式系统中的应用需要高度集成的芯片以节省费用、减少能耗和空间。现在很多音频编解码芯片都集成了触摸屏控制功能(如Wolfson的WM9712),也可以用单独的模数转换芯片实现触摸屏控制功能(如本文讲述的AD7887)。
最常见的触摸屏是电阻式触摸屏,触摸屏是在一个显示屏上覆盖一个触感设备,或者触摸板。便携式应用中最常见的型号是电阻式四线触摸板,有两块透明的电阻层组成,分别是X板和Y板。如下图1所示。
图1
触摸屏原理图
X板的左端和右端有电接触,而Y板的顶部和底部有电接
触。当一个指点设备,例如一只笔或手指,接触触摸屏上的任何一点时,这一点就会在X板和Y板之间形成电接触。如上图所示。
为了决定X的坐标,一个电压被加到X板上,电阻Rx+(从X板的正电压边到接触点)和Rx-(从接触点到负边)形成一个电势
差,接触点的电势和X轴坐标是成比例的。
此时,没有电流流经Y板,可以在Y板的任何一端测量接触点的电势。通常,Y的两端被连在一起然后连接到ADC的输入端。获得Y轴坐标的方法与X轴坐标类似,只需要把X板和Y板交换即可。
2.2触摸屏压力检测
检测触摸屏的压力是非常有用的,可以实现一些功能,例如:用笔画线时,用的力越大,画的线就越
粗。触摸屏压力检测是间接检测的,通过检测顶端和底端之间的电阻Rc。随着压力和接触面积的增加,电阻Rc会减小。
然而,压力检测在许多便携式系统中不是首选项,是可选项,因为它消耗能量较多,而且需要很多计算。有一种方法,将顶端连到电源端,底端连接到地,通过检测流经触摸板的电流可知电阻
Rc的大小。
如下图2所示。这种方法本质上是不精确的,因为它不是检测的电阻Rc,而是Rc+R+R,R是X板正端(X+)和接触点顶端之间的电阻,R是接触点底端到Y板负端(Y-)端之间的电阻。如果笔接触点的坐标和板电阻已知,Rc可以估算出来,但是这需要计算能力和额外的检测板的电阻。这种方法的另一个缺点是当笔点到触摸屏的一个角落时,一个很大的电流可能流过,不必要的消耗大量的电量并引起散热难题。
图2触摸屏压力检测
3触摸屏控制电路
触摸屏控制电路可以采用独立的模数转换芯片,本文采用的方案是StrongARM芯片外接美国模拟器件公司的AD7887。
AD7887是一个高速、低能耗、12位的模数转换芯片,直接输出二
进制编码,转换速度可达2.5MHz。AD7887支持两个通道,可以通过片上控制寄存器配置为双通道或者单通道操作,触摸屏的坐标数据分为X坐标和Y坐标,因此需要把AD7887配置为双通道工作模式。双通道操作模式下,管脚V/AIN1是AIN1功能,提供第二个模拟输入通道。这种情况下,参考电压通过管脚V提供,AIN0和AIN1模拟输入电压范围都是0到V。
AD7887主要功能管脚的介绍:
收稿日期:2007-04-25
基金项目:校级重点课程(4053010)
作者简介:郭小梅(1953-),女,江苏南京,副教授;高峰(1978-),男,河南,硕士,工程师。
嵌入式Linux触摸屏驱动开发
郭小梅1,高峰2
(1.南京晓庄学院计算机系,江苏南京210038;2.无锡矽太恒科电子有限公司,江苏无锡214000)
摘要:根据触摸屏坐标检测原理和压力检测方法,以AD7887芯片为例讲述了触摸屏控制电路的控制原理和方法;以IntelStron-gARM嵌入式系统为平台,介绍Linux下触摸屏驱动程序的开发方法。系统通过AD转换芯片采样触摸屏数据,做模数转换后通过CPU的串口送给系统.触摸屏驱动程序包括AD7887和SA1110相关控制寄存器的硬件初始化,驱动程序的流程和构架,引入内核定时器的重要意义,以及坐标数据的处理。
关键词:触摸屏;Linux;设备驱动程序;SA1110,AD7887中图分类号:TP316文献标识码:A文章编号:1009-3044(2007)09-20766-03
TouchScreenDriverDevelopmentforEmbeddedLinux
GUOXiaomei1,GAOFeng2
(1.NanjingXiaozhuangInstituteDepartmentofComputer,Nanjing210038,China;2.WuxiSITEKHengKeElectronicsCO.LTD,214000,China)
Abstract:Thispaperintroducesthattouchscreenhowtowork,howtocheckpressureandcoordinateswithanADICchip:AD7887.ThepaperalsointroduceshowtodevelopatouchscreendriverforembeddedLinuxbasedonIntelStrongARM1110platform.Thetouchscreenda-taaresampledthroughAD7887,thenbeconvertedfromAnalogtoDigitalandtransferredtoCPUthroughserialport.Thepointsincludeini-tializingtouchscreenhardwarebysettingregisters,howtoprocesscoordinatesdataandtheimportanceofusingLinuxkerneltimer.
Keywords:TouchScreen;Linux;Device
Driver;
SA1110;AD7887
766
本栏目责任编辑:谢媛媛
开发研究与设计技术
*AIN1/V:模拟输入端1/参考电压输入端。
双通道模式下,这个管脚作为AIN1。
*AIN0:模拟输入0端。双通道模式下,模拟输入电压范围:0到V。
*DIN:数据输入端。写给AD7887控制寄存器的数据通过这个管脚输入,在SCLK时钟信号的上升沿写到寄存器中。
*DOUT:数据输出端。AD7887的转换结果以串行数据流的
格式从DOUT端输出。
在SCLK时钟信号的下降沿触发。数据流以四个0开头,后面是12位的数据,最大字节优先(MSB)。
*SCLK:串行时钟信号。从AD7887读数据,或者写串行数据给AD7887寄存器时都需
嵌入式linux开发书籍要这个时钟。也作为AD7887模数转换过程的时钟源。
AD7887的控制寄存器是一个8位的只写寄存器。在SCLK的上升沿,数据从AD7887的DIN管脚载入。MSB表示数据流中的第一位,寄存器的内容加电初始化时都为0。下图3是寄存器各位的功能。
图3
AD7887寄存器功能
*DONTC:Don'tCare。这一位的值没有意义,是0或1都没有关系。
*ZERO:这一位赋值零才能保证AD7887的正确操作。
*REF:参考位。0表示片上参考电压使能。1表示片上参考电
压禁止。
*SIN/DUAL:0表示单通道模式,1表示双通道模式。
*CH:通道选择位。
双通道模式时,这一位决定哪一个通道将作下一个模数转换。0表示选择AIN0,1表示选择AIN1。
单通道模式下,这一位总为0。
*ZERO:为确保AD7887的正确操作,这一位必须为0。
*PM1,PM0:电源管理位。表示AD7887的操作模式。大多数情况下,PM1和PM0都为0,AD7887工作在电源管理的0模式,
也就是正常工作模式。
开发板的CPU是Intel的嵌入式处理器StrongARM1110,AD7887连接到SA1110的串口4,串口4
工作在SSP(SynchronousSerialPort:同步串口)模式,SA1110的
LDD3-LDD0四个管脚设置为GPIO
功能。SA1110和AD7887以及触摸屏的管脚连接为:AD7887和触摸屏SA1110AD7887和触摸屏
SA1110
CS#<-----SFRM_CDOUT------>RXD_CDIN<-----TXD_CSCLK<-----SCLK_CPenDownINT---->GPIO23
Y+<-----LDD0Y-<-----LDD1X+<-----LDD2X-<-----LDD3LDD3LDD2LDD1LDD0
0101
禁止触摸屏检测电路(电源关闭)1101
使能触摸屏检测电路(电源开),等待笔的中断1001
获取X轴坐标0110
获取Y轴坐标SA1110的通用输入输出端口GPIO23必须设置为中断模式、输入、下降沿、以接收笔的中断。
获取触摸屏信号的控制顺序为:
(1)通过设置LDD3-LDD0为1101,使能触摸屏检测电路;(2)如果GPIO23收到下降沿触发的中断,先获取X轴坐标,具体先设置LDD3-LDD0为1001,延迟20微秒后,通过SA1110的串口下命令转换AD7887的AIN0值;
(3)然后再设置LDD3-LDD0为0110,延迟20微秒后,通过SA1110串口下命令转换AD7887的AIN1值,这是Y轴的坐标。
4触摸屏驱动程序设计
触摸屏作为字符设备向Linux内核注册,以设备文件的形式进行读写操作。这里分几个功能模块介绍触摸屏驱动程序,主要
有:硬件初始化模块、
定时器模块、坐标数据处理模块等。4.1init和exit函数
触摸屏驱动可以编译进Linux内核或者单独编译为一个模块,需要定义设备驱动的init函数:
int__initad7887_init(void);init函数主要完成的功能有:
(1)注册触摸屏设备节点:misc_register(&ad7887_ts);(2)初始化触摸屏硬件:init_chip();
(3)初始化存放触摸屏坐标数据的缓冲区:init_buf();
(4)为触摸屏申请中断:request_irq(IRQ_GPIO23,ts_ad7887_interrupt,SA_INTERRUPT,“ad7887",dev_id);
(5)等中断:waiting_touch();4.2硬件初始化init_chip()
硬件初始化主要有以下六个步骤:
(1)SA1110的LCD控制寄存器0的bit0置0,禁止LCD控制器功能,使LDD7--LDD0作为通用I/O口。语句:LCCR0&= ̄
LCCR0_LEN;
(2)SA1110串口4的MCP(MultimediaCommunicationPort)控制寄存器的bit16置0,禁止串口4的MCP功能,串口4工作在SSP模式。语句:Ser4MCCR0&= ̄MCCR0_MCE;
(3)设置串口4的SSP控制寄存器SSCR0和SSCR1,寄存器0如下图所示:
有DSS,FRF,SSE,SCR四个字段,DSS表示SSP传输和接收的数据位数,设置为1111,表示16位数据;FRF表示帧格式,设置为00,表示MotorolaSPI帧格式;SSE表示同步串口使能,设置为1,表示使能SSP操作,相应管脚作为SSP功能管脚;SCR表示串行时钟速率,设置为00000111,十进制是7,SA1110片上晶振产生的时钟频率为3.6864MHz,串行位时钟的计算公式是:
计算结果,位时钟为:230.4KHz。
SSP控制寄存器SSCR1的各位都采用默认值0,语句为:
Ser4SSCR1=0;
(4)驱动使用4个LCD管脚LDD3、LDD2、LDD1、LDD0作为通用I/O端口,控制触摸屏的X-、X+、Y-、Y+四个输出端。设置LCD端口管脚方向寄存器PPDR,将四个管脚设置为输出;
(5)通过PPC管脚状态寄存器PPSR设置[LDD3:LDD0]的输
出电平;按前面所述的获取触摸屏信号的控制顺序,首先设置[LDD3:LDD0]为1101,使能触摸屏检测电路;
(6)设置SA1110的GPIO23中断方式为下降沿:set_GPI-O_IRQ_edge(GPIO_GPIO23,GPIO_FALLING_EDGE)。
SA1110的串口、LCD管脚、
中断等初始化完成后,就可以发命令读取坐标数据了。
4.3定时器中断
触摸屏驱动中要使用内核定时器。定时器用于调度函数(定时器处理程序)在未来某个特定时间执行。在定时器注册的时间超时后,就执行一次内核定时器注册的处理函数。系统维护一个定时器双向
链接表,这意味着可以加入任意多的定时器。定时器包括它的timeout(超时)值(单位是jiffies)和超时时调用的函数。
在ad7887_init()函数中,为触摸屏申请中断时,引用了一个中断处理函数ts_ad7887_interrupt()。这个中断处理函数主要完成三项工作,首先禁止GPIO23端口的触摸屏中断;然后设
置
SA1110
767
本栏目责任编辑:谢媛媛
开发研究与设计技术
电脑知识与技术
(上接第763页)
点编号和本节点逻辑关系都存放在关系数据库了,在推理过程的搜索策略中可以采用堆栈的链表数据结构。具体知识搜索算法描述如下:
图5
正向推理程序流程图
(1)根据故障现象,选择故障分类point*P,P=root初始化堆栈InitStack(S);
(2)进入根节点的下层节点P=P一>RChild;(根节点在单分支故障树只有一个子节点,默认为右子节点)
(3)IF(当前节点是中间节点)
{IF(P在栈不存在,即P一>Flag=false){该节点入栈Push(S,P);P一>Flag=true;}
ELSE
{IF该节点知识和询问故障相匹配,转入(4);ELSE
{根据判断节点的询问内容和已知事实进行对比并作为回答;
IF(回答==“是”)进入下层左子节点P=P一>Lchild转入(3);IF(回答==“否”)进入下层右子节点P=P一>RChild,转入(3);
}}}//endofif
ELSEIF(当前节点是叶节点),转入(5);
(4)该节点出栈,返回该节点编码,系统成功搜索到相匹配的
知识,结束。
(5)该节点提供的为故障处理措施,此时故障树搜索完毕,没有到相应的匹配知识,查失败。
在搜索的过程中由于采用了单分支故障树模式,使知识的搜索变得非常简单,只需要沿着树的左右分支对知识和事实进行匹配,直到右节点为叶子节点为止。若查到相匹配的知识,根据返回的故障编码根据推理方式查规则表得到结论码,从而给出诊断结论。
4结束语
利用120-1空气制动机故障诊断专家系统,可为设备维护人员对设备分析和诊断提供辅助决策,从而提高设备维修效率和速度。
本文在故障树分析法基础上利用二叉树的转换理论建立了单分支故障树的故障模型,在故障诊断知识搜索时只对左右节点进行匹配,从而大大缩小了搜索范围,节省了内存空间,提高了诊断速度。在知识库设计上利用数据库的理论,并结合了故障信息的编码技术完成了各个表结构的设计,在以后可逐步向库中添加知识。
参考文献:
[1]王仲生.智能故障诊断与容错控制[M].西安:西北工业大学出版社,2005.
[2]王永庆.人工智能原理与方法[M].西安:西安交通大学出版社,1998.
[3]夏寅荪,吴培元.120型空气制动机[M].北京:中国铁道出版社,1995.
[4]蔡子兴,约翰﹒
德尔金,龚涛.高级专家系统:原理﹑设计及应用[M].北京:科学出版社,2005.
[5]余金山,林慧.数据库开发实例入门与提高[M].北京:电子工业出版社
,2006.
的GEDR和GFER寄存器,将GPIO23端口设置为下降沿检测;最后将定时器插入定时器的全局队列,语句:add_timer(ts_timer);ts_timer的定义为:
staticstructtimer_listts_timer={function:ts_timer_proc};
ts_timer_proc就是定时器处理函数,在这个函数中调用函数read_x()和read_y()分别读取X坐标和Y坐标。然后调用一个处理函数对读取的坐标进行处理:proc_sample(x_pos,y_pos);在proc_sample()函数中打开GPIO23触摸屏中断,然后进行触摸屏坐
标数据的处理。
在触摸屏驱动中使用内核定时器,而不是将数据读取、
滤波等处理都放到中断处理函数中,这样可以将大部分工作交给定时器处理函数去做,中断处理函数只需要启动一个定时器,使得中断处理时间很短,可以很快的开中断,为下一个中断做准备。这样大大提高了系统的稳定性和处理能力。
4.4坐标数据处理
数据的处理首先是数据有效性的检查,如果读到的坐标小于0或者大于最大坐标值(2400,1900),则是错误的数据,函数返回不予处理;这样连续读取四次坐标值,然后X坐标和Y坐标分别两
两相减,得到四个X差值和四个Y差值,检查差值如果大于100,则表明这几组数据误差较大,函数返回不予处理。当这些差值都小于100时,则取差值最小的两组坐标求平均值作为此次读到的最终值。保存到pt_buf中,供ts_open函数读取。
5结束语
本文讲述了触摸屏坐标检测和压力检测的工作原理,介绍了如何在嵌入式LinuxStrongARM平台上利用串口和AD转换芯片实现一个触摸屏驱动。触摸屏驱动有很清晰的通用的结构,只需要改动底层硬件初始化和坐标读取的代码,就可以在多个嵌入式Linux系统平台上实现。本文以模块化的方式讲述了触摸屏驱动的各个功能模块,结构清晰,提供了了解和开发触摸屏驱动的很好借鉴。
参考文献:
[1]ALESSANDRORUBINI,等,魏永明,等译.LINUX设备驱动程序[M].中国电力出版社,2002.
[2]李驹光,等.ARM应用系统开发详解[M].清华大学出版社,2003.
[3]毛德操,胡希明.嵌入式系统[M].浙江大学出版社,2003.
768
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论