触摸屏实验

触摸屏分类

按照触摸屏的工作原理和传输信息的介质,把触摸屏分为四种,它们分别为

电阻式:定位准确,单点触摸。

电容感应式:支持多点触摸,价格偏贵。工业应用最广泛

红外线式:价格低廉,但其外框易碎,容易产生光干扰,曲面情况下失真。

表面声波式:解决各种缺点,但是屏幕表面如果有水滴和尘土会使触摸屏变的迟钝。

电容型触摸屏

电容屏是利用人体感应进行触点检测控制,只需要轻微接触,通过检测感应电流来定位触摸坐标。现在几乎所有智能手机,包括平板电脑都是采用电容屏作为触摸屏。

电容型触摸屏分类

表面电容式电容触摸屏    

表面电容式触摸屏技术是利用ITO(铟锡氧化物,是一种透明的导电材料)导电膜,通过电场感应方式感测屏幕表面的触摸行为进行。但是表面电容式触摸屏有一些局限性,它只能识别一个手指或者一次触摸。

投射式电容触摸屏    

投射电容式触摸屏是传感器利用触摸屏电极发射出静电场线。一般用于投射电容传感技术的电容类型有两种:自我电容和交互电容。

自我电容式

自我电容又称绝对电容,是最广为采用的一种方法,自我电容通常是指扫描电极与地构成的电容。在玻璃表面有用ITO制成的横向与纵向的扫描电极,这些电极和地之间就构成一个电容的两极。当用手或触摸笔触摸的时候就会并联一个电容到电路中去,从而使在该条扫描线上的总体的电容量有所改变。在扫描的时候,控制IC依次扫描纵向和横向电极,并根据扫描前后的电容变化来确定触摸点坐标位置。笔记本电脑触摸输入板就是采用的这种方式,笔记本电脑的输入板采用X*Y的传感电极阵列形成一个传感格子,当手指靠近触摸输入板时,在手指和传感电极之间产生一个小量电荷。采用特定的运算法则处理来自行、列传感器的信号来确定手指的位置。

交互电容式

交互电容又叫做跨越电容,它是在玻璃表面的横向和纵向的ITO电极的交叉处形成电容。交互电容的扫描方式就是扫描每个交叉处的电容变化,来判定触摸点的位置。当触摸的时候就会影响到相邻电极的耦合,从而改变交叉处的电容量,交互电容的扫面方法可以侦测到每个交叉点的电容值和触摸后电容变化,因而它需要的扫描时间与自我电容的扫描方式相比要长一些,需要扫描检测X*Y根电极。目前智能手机/平板电脑等的触摸屏,都是采用交互电容技术。

电阻屏与电容屏的区别 

电阻屏在触模时需要轻触压按,而电容屏只需轻微的手指触碰就能激活

电阻屏可以用任何物体来触摸,而电容屏是人体热感应工作原理,只能用手指的热感区来触摸,指甲和手写笔均无效。由于手指头的面积比手写笔大很多,因此电容屏的手机,触摸比较小图标或者菜单的时候,触摸精度无法做到电阻屏那么高。

电容屏可以很容易进行多点触摸,电阻屏一般不能实现多点触摸的。

电阻屏内部是软的,一般是在4到5层超薄的钢化玻璃中间夹杂细微的炭粒(显微镜下才能看见),通过按压导致上下两层的炭粒相互接触而接通触屏电路,产生触摸反应,容易产生划痕,易坏,容易触屏不灵,而电容屏都是采用单层加厚钢化玻璃,硬度大,耐旧,使用寿长

电阻屏在阳光下可视性稍差,电容屏则非常好,在阳光下可视性很强。

电容触摸屏对工作环境的要求是比较高的,在潮湿、多尘、高低温环境下面,都是不适合使用电容屏的。

电容触摸屏原理

电容触摸屏一般都需要一个驱动IC来检测电容触摸,且一般是通过IIC接口输出触摸数据的。

常见的2种电容触摸屏驱动IC

GT9147:采用17*10的驱动结构(10个感应通道,17个驱动通道)。

OTT2001A:采用13*8的驱动结构(8个感应通道,13个驱动通道)。

它们与MCU连接通过4根线:SDA、SCL、RST和INT。

GT9147的IIC地址,可以是0X14或者0X5D,当复位结束后的5ms内,如果INT是高电平,则使用0X14作为地址,否则使用0X5D作为地址。本章我们使用0X14作为器件地址(不含最低位,换算成读写命令则是读:0X29,写:0X28)
 

GT9147关键寄存器

控制命令寄存器(0X8040)      

该寄存器可以写入不同值,实现不同的控制,我们一般使用0和2这两个值,写入2,即可软复位GT9147,在硬复位之后,一般要往该寄存器写2,实行软复位。然后,写入0,即可正常读取坐标数据(并且会结束软复位)。

配置寄存器组(0X8047~0X8100)      

这里共186个寄存器,用于配置GT9147的各个参数,这些配置一般由厂家提供给我们(一个数组),所以我们只需要将厂家给我们的配置,写入到这些寄存器里面,即可完成GT9147的配置。

产品ID寄存器(0X8140~0X8143)      

这里总共由4个寄存器组成,用于保存产品ID,对于GT9147,这4个寄存器读出来就是:9,1,4,7四个字符(ASCII码格式)。因此,我们可以通过这4个寄存器的值,来判断驱动IC的型号,从而判断是OTT2001A还是GT9147,以便执行不同的初始化。

状态寄存器(0X814E)

我们仅关心最高位和最低4位,最高位用于表示buffer状态,如果有数据(坐标/按键),buffer就会是1,最低4位用于表示有效触点的个数,范围是:0~5,0,表示没有触摸,5表示有5点触摸。

坐标数据寄存器(共30个)

这里共分成5组(5个点),每组6个寄存器存储数据,以触点1的坐标数据寄存器组为例,

我们一般只用到触点的x,y坐标,所以只需要读取0X8150~0X8153的数据,组合即可得到触点坐标。其他4组分别是:0X8158、0X8160、0X8168和0X8170等开头的16个寄存器组成,分别针对触点2~4的坐标。同样GT9147也支持寄存器地址自增,我们只需要发送寄存器组的首地址,然后连续读取即可,GT9147会自动地址自增,从而提高读取速度。 

 四线电阻屏工作原理

电阻屏的主要部分是一块与显示器表面配合非常好的电阻薄膜屏,这是一种多层的复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层秀明的导电层,上面再盖有一层外表硬化处理、光滑防刮的塑料层,它的内表面也涂有一层透明导电层,在两层导电层之间有许多细小(小于千分之一英寸)的透明隔离点把它们隔开绝缘。当手指触摸屏幕时,平常绝缘的两层导电层在触摸点位置就有了一个接触,控制器侦测到这个接通后,其中一面导电层接通У轴方向的5Ⅴ均匀电压场,另一导电层将接触点的电压引至控制卡进行A/D转换,得到电压值后与5Ⅴ相比即可得触摸点的у轴坐标,同理得出Χ轴的坐标,这就是所有电阻技术触摸屏共同的最基本原理。

 

 触摸屏程序注意事项:

 校准:确定电压和坐标之间的函数关系。

校准参数保存在EEPROM(断电可保存),每次重新上电系统初始化后读出来这个参数即可。

电阻屏感应触摸后输出两个方向的电压,根据电压值来判断触摸点。所以还需要一个特定的触摸屏AD转换芯片来转换。

XPT2046是一款4导线制触摸屏控制器,内含12位分辨率125KHz转换速率逐步逼近型A/D转换器。XPT2046支持从1.5V到5.25V的低电压I/O接口。XPT2046能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。内部自带2.5V参考电压可以作为辅助输入、温度测量和电池监测模式之用,电池监测的电压范围可以从0V到6V。XPT2046片内集成有一个温度传感器。

 XPT2046数字接口:

前8个时钟通过DIN引脚输入控制字节(命令字)。  

转换器收到有关下次转换的足够信息之后,接着根据获得的信息设置输入多路选择器和参考源输入,并进入采样模式。

三个多时钟之后(等待),控制字节设置完成,转换器进入转换模式。

接着12个时钟周期,将完成真正的AD转换。

如果度量比率转换方式(SER/_DRR=0),驱动器在转换过程中将一直工作,第13个时钟将输出转换的最后一位,剩下三个时钟完成转换器忽略的最后字节。

XPT2046命令字(控制字节):

u8 CMD_RDX=0XD0;//读取X轴坐标命令。

u8 CMD_RDY=0X90;//读取Y轴坐标命令 

从图中可以看出, T_MOSI、T_MISO、T_SCK、T_CS 和 T_PEN 分别连接在 STM32F4 的:PF11、 PB2、PB0、PC13 和 PB1 上。

如果是电容式触摸屏,我们的接口和电阻式触摸屏一样(上图右侧接口),只是没有用到 五根线了,而是四根线,分别是: T_PEN(CT_INT) 、 T_CS(CT_RST) 、 T_CLK(CT_SCL) 和 T_MOSI(CT_SDA)。其中:CT_INT、CT_RST、CT_SCL 和 CT_SDA 分别是 OTT2001A/GT9147/FT5206 的:中断输出信号、复位信号,IIC 的 SCL 和 SDA 信号。这里,我们用查询的方式读取 OTT2001A/GT9147/FT5206 的数据,对于 OTT2001A/FT5206 没有用到中断信号(CT_INT),所以 同 STM32F4 的连接,只需要 3 根线即可,不过 GT9147 还需要用到 CT_INT 做 IIC 地址设定,所 以需要 4 根线连接。

打开本章实验工程目录可以看到,我们在 HARDWARE 文件夹下新建了一个 TOUCH 文件 夹,然后新建了 touch.c、touch.h、ctiic.c、ctiic.h、ott2001a.c、ott2001a.h、gt9147.c、gt9147.h、 ft5206.c 和 ft5206.h 等十个文件用来存放触摸屏相关的代码。同时引入这些源文件到工程 HARDWARE 分组之下,并将 TOUCH 文件夹加入头文件包含路径。其中,touch.c 和 touch.h 是电阻触摸屏部分的代码,顺带兼电容触摸屏的管理控制,其他则是电容触摸屏部分的代码。 打开 touch.c 文件,里面主要是与触摸屏相关的代码(主要是电阻触摸屏的代码)。

 TP_Read_XY2 函数,该函数专门用于从电阻式触摸屏控制 IC 读取 坐标的值(0~4095),TP_Read_XY2 的代码如下:

//连续 2 次读取触摸屏 IC,且这两次的偏差不能超过
//ERR_RANGE,满足条件,则认为读数正确,否则读数错误. 
//该函数能大大提高准确度
//x,y:读取到的坐标值
//返回值:0,失败;1,成功。
#define ERR_RANGE 50 //误差范围
u8 TP_Read_XY2(u16 *x,u16 *y) 
{
u16 x1,y1;
u16 x2,y2;
u8 flag; 
 flag=TP_Read_XY(&x1,&y1); 
 if(flag==0)return(0);
 flag=TP_Read_XY(&x2,&y2); 
 if(flag==0)return(0); 
//前后两次采样在+-50 内
 if(((x2<=x1&&x1<x2+ERR_RANGE)||(x1<=x2&&x2<x1+ERR_RANGE))
 &&((y2<=y1&&y1<y2+ERR_RANGE)||(y1<=y2&&y2<y1+ERR_RANGE)))
 {
 *x=(x1+x2)/2;*y=(y1+y2)/2;
 return 1;
 }else return 0; 
} 

该函数采用了一个非常好的办法来读取屏幕坐标值,就是连续读两次,两次读取的值之差 不能超过一个特定的值(ERR_RANGE),通过这种方式,我们可以大大提高触摸屏的准确度。另 外该函数调用的 TP_Read_XY 函数,用于单次读取坐标值。TP_Read_XY 也采用了一些软件滤波算法。

TP_Adjust 是此部分最核心的代码,在这里,给大家介绍一下我们这里所使用的触摸屏校 正原理:我们传统的鼠标是一种相对定位系统,只和前一次鼠标的位置坐标有关。而触摸屏则 是一种绝对坐标系统,要选哪就直接点哪,与相对定位系统有着本质的区别。绝对坐标系统的 特点是每一次定位坐标与上一次定位坐标没有关系,每次触摸的数据通过校准转为屏幕上的坐 标,不管在什么情况下,触摸屏这套坐标在同一点的输出数据是稳定的。不过由于技术原理的 原因,并不能保证同一点触摸每一次采样数据相同,不能保证绝对坐标定位,点不准,这就是 触摸屏最怕出现的问题:漂移。对于性能质量好的触摸屏来说,漂移的情况出现并不是很严重。 所以很多应用触摸屏的系统启动后,进入应用程序前,先要执行校准程序。 通常应用程序中使用的 LCD 坐标是以像素为单位的。比如说:左上角的坐标是一组非 0 的数值,比如(20,20), 而右下角的坐标为(220,300)。这些点的坐标都是以像素为单位的,而从触摸屏中读出的是点的物理坐标,其坐标轴的方向、XY 值的比例因子、偏移量都与 LCD 坐标不同,所以,需要把物理坐标首先转换为像素坐标,然后再赋给 POS 结构,达到坐标转换的目的。

校正思路:在了解了校正原理之后,我们可以得出下面的一个从物理坐标到像素坐标的转换关系式:

LCDx=xfac*Px+xoff; LCDy=yfac*Py+yoff;

其中(LCDx,LCDy)是在 LCD 上的像素坐标,(Px,Py)是从触摸屏读到的物理坐标。xfac, yfac 分别是 X 轴方向和 Y 轴方向的比例因子,而 xoff 和 yoff 则是这两个方向的偏移量。 这样我们只要事先在屏幕上面显示 4 个点(这四个点的坐标是已知的),分别按这四个点就 可以从触摸屏读到 4 个物理坐标,这样就可以通过待定系数法求出 xfac、yfac、xoff、yoff 这四 个参数。我们保存好这四个参数,在以后的使用中,我们把所有得到的物理坐标都按照这个关 系式来计算,得到的就是准确的屏幕坐标。达到了触摸屏校准的目的。 TP_Adjust 就 是根 据 上面 的 原理 设 计的 校准函 数 ,注 意 该函 数里面 多 次使 用 了 lcddev.width和lcddev.height,用于坐标设置,主要是为了兼容不同尺寸的LCD(比如320*240、 480*320 和 800*480 的屏都可以兼容)。

触摸屏初始化函数:TP_Init,该函数根据 LCD 的 ID(即 lcddev.id)判别是电 阻屏还是电容屏,执行不同的初始化,tp_dev.scan,这个结构体函数指针,默认是指向 TP_Scan 的,如果是电阻屏则用默认的即可,如果是电容屏,则指向新的扫描函数 GT9147_Scan、 OTT2001A_Scan 或 FT5206_Scan(根据芯片 ID 判断到底指向那个),执行电容触摸屏的扫描函数。

打开 touch.h 文件,_m_tp_dev 结构体,改结构体用于管理和记录触摸屏(包括电阻 触摸屏与电容触摸屏)相关信息。通过结构体,在使用的时候,我们一般直接调用 tp_dev 的相 关成员函数/变量屏即可达到需要的效果,这种设计简化了接口,且方便管理和维护。

ctiic.c 和 ctiic.h 是电容触摸屏的 IIC 接口部分代码,与 myiic.c 和 myiic.h 基本 一样。

文件 ott2001a.c,此部分总共 5 个函数,其中 OTT2001A_WR_Reg 和 OTT2001A_RD_Reg 分别用于读写 OTT2001A 芯片,这里特别注意寄存器地址是 16 位的,与 OTT2001A 手册介绍的是有出入的, 必须 16 位才能正常操作。另外,重点介绍下 OTT2001A_Scan 函数,OTT2001A_Scan 函数用 于扫描电容触摸屏是否有按键按下,由于我们不是用的中断方式来读取 OTT2001A 的数据的, 而是采用查询的方式,所以这里使用了一个静态变量来提高效率,当无触摸的时候,尽量减少 对 CPU 的占用,当有触摸的时候,又保证能迅速检测到。至于对 OTT2001A 数据的读取,则 完全是我们在上面介绍的方法,先读取手势 ID 寄存器(OTT_GSTID_REG),判断是不是有有 效数据,如果有,则读取,否则直接忽略,继续后面的处理。

 gt9147.c 里面的 GT9147_Init 和 GT9147_Scan 两个函数,GT9147_Init 用于初始化 GT9147,该函数通过读取 0X8140~0X8143 这 4 个寄存 器,并判断是否是:“9147”,来确定是不是 GT9147 芯片,在读取到正确的 ID 后,软复位 GT9147, 然后根据当前芯片版本号,确定是否需要更新配置,通过 GT9147_Send_Cfg 函数,发送配置信 息(一个数组),配置完后,结束软复位,即完成 GT9147 初始化。GT9147_Scan 函数,用于读 取触摸屏坐标数据,这个和前面的 OTT2001A_Scan 大同小异。

main.c

rtp_test,该函数用于电阻触摸屏的测试,该函数代码比较简单,就是扫描按键和触摸屏, 如果触摸屏有按下,则在触摸屏上面划线,如果按中“RST”区域,则执行清屏。如果按键 KEY0 按下,则执行触摸屏校准。

ctp_test,该函数用于电容触摸屏的测试,由于我们采用 tp_dev.sta 来标记当前按下的触摸 屏点数,所以判断是否有电容触摸屏按下,也就是判断 tp_dev.sta 的最低 5 位,如果有数据, 则划线,如果没数据则忽略,且 5 个点划线的颜色各不一样,方便区分。另外,电容触摸屏不 需要校准,所以没有校准程序。

main 函数,则比较简单,初始化相关外设,然后根据触摸屏类型,去选择执行 ctp_test 还 是 rtp_test。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值