明珠的个人博客

是谁告诉你,你是赤裸的?

0%

触摸屏

触摸屏

利用TFTLCD 模块,51 单片机系统就有了高级信息输出的功能,触摸屏刚好满足作为一个友好的用户输入的设备的需求。现如今大多电子产品是将触摸屏配合液晶显示器组成人机交互系统,比如手机、平板等。

触摸屏简介

触摸屏又称触控面板,它是一种把触摸位置转化成坐标数据的输入设备,根据触摸屏的检测原理,主要分为电阻式触摸屏和电容式触摸屏。下面我们就分别来介绍下这两种触摸屏。

电阻式触摸屏

电阻式触摸屏是一种传感器,它将矩形区域中触摸点(X,Y)的物理位置转换为代表 X 坐标和 Y 坐标的电压。很多 LCD 模块都采用了电阻式触摸屏,比如2.0/2.2/2.4/2.6/2.8/3.0/3.2/3.5 寸的 TFTLCD 模块都是采用电阻式触摸屏。使用时需要用一定的压力才会能检测到电压,即触摸。
电阻式触摸屏基本上是薄膜加上玻璃的结构,薄膜和玻璃相邻的一面上均涂有 ITO(纳米铟锡金属氧化物)涂层,ITO 具有很好的导电性和透明性。当触摸操作时,薄膜下层的 ITO 会接触到玻璃上层的 ITO,经由感应器传出相应的电信号,经过转换电路送到处理器,通过运算转化为屏幕上的X、Y 值,而完成点选的动作,并呈现在屏幕上。电阻式触摸屏结构如下图所示:

电阻触摸屏的工作原理主要是通过压力感应原理来实现对屏幕内容的操作和控制的,这种触摸屏屏体部分是一块与显示器表面非常配合的多层复合薄膜,其中第一层为玻璃或有机玻璃底层,第二层为隔层,第三层为多元树脂表层,表面还涂有一层透明的导电层,上面再盖有一层外表面经硬化处理、光滑防刮的塑料层。在多元脂表层表面的传导层及玻璃层感应器是被许多微小的隔层所分隔电流通过表层,轻触表层压下时,接触到底层,控制器同时从四个角读出相称的电流及计算手指位置的距离。这种触摸屏利用两层高透明的导电层组成触摸屏,两层之间距离仅为 2.5 微米。当手指触摸屏幕时,平常相互绝缘的两层导电层就在触摸点位置有了一个接触,因其中一面导电层接通Y 轴方向的电源均匀电压场,使得侦测层的电压由零变为非零,控制器侦测到这个接通后,进行A/D转换,并将得到的电压值与参考电压相比,即可得触摸点的Y 轴坐标,同理得出 X 轴的坐标,这就是所有电阻技术触摸屏共同的最基本原理。
电阻触摸屏的优点:精度高、价格便宜、抗干扰能力强、稳定性好。
电阻触摸屏的缺点:容易被划伤、透光性不太好、不支持多点触摸。
从上面的简介,我们知道触摸屏都需要一个 AD 转换器,也就是要将电压变化读取出来,供主机求出触摸的位置。作者手中TFTLCD 模块使用的是四线电阻式触摸屏,这种触摸屏的控制芯片有很多,包括:ADS7843、ADS7846、TSC2046、XPT2046 和 AK4182 等。这几款芯片的驱动基本上是一样的,也就是说只要写出了 XPT2046 的驱动,这个驱动对其他几个芯片也是有效的。而且封装也有一样的,而且管脚也完全兼容。所以在替换起来非常方便。其中XPT2046 的特点主要有:

  1. 一款 4 导线制触摸屏控制器,采用 SPI 模式进行通信。
  2. 内含 12 位分辨率 125KHz 转换速率逐步逼近型A/D 转换器。
  3. 支持从 1.5V 到 5.25V 的低电压 I/O 接口。
    4)只需执行两次 A/D 转换即可查出被按的屏幕位置。
    5)可以测量加在触摸屏上的压力
    6)芯片内部自带温度检测、电池电压(0-6V)监测等等

电容式触摸屏

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

电容式触摸屏原理

表面电容式电容触摸屏

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

投射式电容触摸屏

投射式电容触摸屏却具有多指触控的功能。这两种电容式触摸屏都具有透光率高、反应速度快、寿命长等优点,缺点是:随着温度、湿度的变化,电容值会发生变化,导致工作稳定性差,时常会有漂移现象,需要经常校对屏幕,且不可佩戴普通手套进行触摸定位。
投射电容式触摸屏是传感器利用触摸屏电极发射出静电场线。一般用于投射电容传感技术的电容类型有两种:自我电容和交互电容。
自我电容又称绝对电容,是最广为采用的一种方法,自我电容通常是指扫描电极与地构成的电容。在玻璃表面有用 ITO 制成的横向与纵向的扫描电极,这些电极和地之间就构成一个电容的两极。当用手或触摸笔触摸的时候就会并联一个电容到电路中去,从而使在该条扫描线上的总体的电容量有所改变。在扫描的时候,控制 IC 依次扫描纵向和横向电极,并根据扫描前后的电容变化来确定触摸点坐标位置。笔记本电脑触摸输入板就是采用的这种方式,笔记本电脑的输入板采用 XY 的传感电极阵列形成一个传感格子,当手指靠近触摸输入板时,在手指和传感电极之间产生一个小量电荷。采用特定的运算法则处理来自行、列传感器的信号来确定手指的位置。
交互电容又叫做跨越电容,它是在玻璃表面的横向和纵向的ITO 电极的交叉处形成电容。交互电容的扫描方式就是扫描每个交叉处的电容变化,来判定触摸点的位置。当触摸的时候就会影响到相邻电极的耦合,从而改变交叉处的电容量,交互电容的扫面方法可以侦测到每个交叉点的电容值和触摸后电容变化,因而它需要的扫描时间与自我电容的扫描方式相比要长一些,需要扫描检测X
Y根电极。目前智能手机/平板电脑等的触摸屏,都是采用交互电容技术。

下面以投射式电容屏(交互电容类型)介绍
投射式电容触摸屏(交互电容类型)内部由驱动电极与接收电极组成,驱动电极发出低电压高频信号投射到接收电极形成稳定的电流,当人体接触到电容屏时,由于人体接地,手指与电容屏就形成一个等效电容,而高频信号可以通过这一等效电容流入地线,这样,接收端所接收的电荷量减小,而当手指越靠近发射端时,电荷减小越明显,最后根据接收端所接收的电流强度来确定所触碰的点。
电容触摸屏通常也需要一个驱动 IC 来检测电容触摸,且一般是通过I2C接口输出触摸数据的。

电阻触摸屏采用的是 SPI 通信(使用 IO 口模拟SPI 时序)

程序滤波

比较常用的程序滤波的方法其实就是多次数据的读取,然后把最大最小值除去,算出平均值。这种方法读取的次数越多,得到的数据就越准确。
另外一种方式滤波是当读取到两次数据之后,检查两个数据之间的差值,如果超过理想的误差,那么丢弃数据。这种方法是处理飞点现象的常用方法。

如何将触摸屏物理坐标转换为 LCD 坐标

我们使用 XPT2046 读取到了触摸屏的触摸位置之后,想要在LCD 屏相对应的位置上进行操作,我们还要将它转换成 LCD 屏的坐标值。比如说,我们在LCD屏(0,0)坐标位置按下,而读取到的物理坐标值(也就是AD 值)为(100,200),那么我们想要在 LCD 屏(0, 0)位置进行处理,将要将物理坐标(100,200)转换成 LCD 屏坐标。
那如何转换呢?我们知道,XPT2046 的分辨率为 12 位,也就是说我们读取X 轴的物理坐标值(这里我们假设为:Px)和 Y 轴的物理坐标值(这里我们假设为:Py)的值肯定是在 0~4096 之间。但是我们 LCD 彩屏X 轴和Y 轴的像素坐标确是 240X400。(对应 TFT26_R61509V 彩屏的像素,不管多少,我们明白原理就行,为了更好的表示,在这里我们 LCD 彩屏 X 轴像素坐标我们假设为:Lcdx,LCD 彩屏 Y 轴像素坐标我们假设为:Lcdy)那么我们假设当(Px, Py) =(0,0)时,正好 LCD 彩屏像素坐标的起始坐标(0,0),当(Px,Py) = (4096,4096)时,正好 LCD 彩屏像素坐标的终止坐标(239, 399)。难么我们不难看出触摸屏的物理坐标跟 LCD 彩屏像素坐标的对应关系为:

1
2
"Factorx = Lcdx / Px;"
"Factory = Lcdy / Py;"

我们就可以求出 Factorx 和 Factory,然后每次读取到Px 和Py 之后就可以讲它很轻松的转换为 Lcdx 和 Lcdy。这是一个很简单的数学关系。
不过呢,事情没有那么理想化,我们在 LCD 像素坐标为(0, 0)读取的触摸屏物理坐标值不一定是(0,0),在 LCD 像素坐标为最大时,也不一定读取到的是触摸屏的物理坐标最大值。所以我们要进行一些数据校正,这也是为什么电阻屏幕校正的原因。
什么意思呢?那我们在来解一个数学问题:
我们都知道每个触摸屏物理坐标值都能一一对应一个LCD 彩屏上面的像素坐标值,也就是它们是成比例关系的。现在我们知道 LCD 彩屏的X 轴像素坐标最小值为 Lcdx1,我们能显示的 LCD 彩屏的 X 轴像素坐标最大值为Lcdx2。而我们在 LCD 彩屏像素坐标 X 轴最小值处读取的触摸屏X 轴物理坐标为Px1,在 LCD 彩屏 X 轴像素坐标最大值处读取的触摸屏 X 轴的物理坐标为Px2。那么现在我们知道有一个触摸屏物理坐标值在 Px1 到 Px2 之间的坐标值为Px,那么和它对应的 Lcdx 的值是多少呢?
我们可以这么解:

1
2
"Factorx = (Lcdx2 – Lcdx1) / (Px2 – Px1);"
"Lcdx = (Px – Px1) * Factorx;"

那么就求得出 Lcdx 是多少了。
现在我们把它分解出来

1
"Lcdx = Px * Factorx – Px1 * Factorx;"

然后将 Px1*Factorx 替换成一个变量 Offsetx。那么我们现在就可以得到Lcdx 和 Px 之间的对应关系式。 而关于 Y 轴也是同理,所以它们从物理坐标到像素坐标的转换关系式:

1
2
"Lcdx = Px * Factorx – Offsetx;"
"Lcdy = Py * Factory – Offsety;"

在程序中对应的如下所示:

1
2
3
4
"xpt_xy.lcdx=xpt_xy.x;"
"xpt_xy.lcdx=((xpt_xy.lcdx - 240)*260)/3850;"
"xpt_xy.lcdy=xpt_xy.y;"
"xpt_xy.lcdy =((xpt_xy.lcdy - 200)*420)/3950;"

xpt_xy.x 和 xpt_xy.y 是读取 XPT2046 的 X 和 Y 方向的AD 值,而xpt_xy.lcdx和 xpt_xy.lcdy 是对应 TFTLCD 触摸屏实际的 XY 轴坐标值。

还有一个函数是非常重要的,即触摸屏扫描函数。该函数检测是否有触摸,并在该函数中获取触摸屏的物理坐标和 LCD 坐标…套用示例函数即可。