电容触摸屏—触摸画板
29.1 触摸屏简介
触摸屏又称触控面板,它是一种把触摸位置转化成坐标数据的输入设备,根据触摸屏的检测原理,主要分为电阻式触摸屏和电容式触摸屏。相对来说,电阻屏造价便宜,能适应较恶劣的环境,但它只支持单点触控(一次只能检测面板上的一个触摸位置),触摸时需要一定的压力,使用久了容易造成表面磨损,影响寿命;而电容屏具有支持多点触控、检测精度高的特点,电容屏通过与导电物体产生的电容效应来检测触摸动作,只能感应导电物体的触摸,湿度较大或屏幕表面有水珠时会影响电容屏的检测效果。
图 291单电阻屏、电阻液晶屏(带触摸控制芯片)
图 292单电容屏、电容液晶屏(带触摸控制芯片)
图 291和图 292分别是带电阻触摸屏及电容触摸屏的两种屏幕,从外观上并没有明显的区别,区分电阻屏与电容屏最直接的方法就是使用绝缘物体点击屏幕,因为电阻屏通过压力能正常检测触摸动作,而该绝缘物体无法影响电容屏所检测的信号,因而无法检测到触摸动作。目前电容式触摸屏被大部分应用在智能手机、平板电脑等电子设备中,而在汽车导航、工控机等设备中电阻式触摸屏仍占主流。
29.1.1 电阻式触摸屏检测原理
电阻式的触摸屏结构见图 293。它主要由表面硬涂层、两个ITO层、间隔点以及玻璃底层构成,这些结构层都是透明的,整个触摸屏覆盖在液晶面板上,透过触摸屏可看到液晶面板。表面涂层起到保护作用,玻璃底层起承载的作用,而两个ITO层是触摸屏的关键结构,它们是涂有铟锡金属氧化物的导电层。两个ITO层之间使用间隔点使两层分开,当触摸屏表面受到压力时,表面弯曲使得上层ITO与下层ITO接触,在触点处连通电路。
图 293 电阻式触摸屏结构
两个ITO涂层的两端分别引出X-、X+、Y-、Y+四个电极,见图 294,这是电阻屏最常见的四线结构,通过这些电极,外部电路向这两个涂层可以施加匀强电场或检测电压。
图 294 XY的ITO层结构
当触摸屏被按下时,两个ITO层相互接触,从触点处把ITO层分为两个电阻,且由于ITO层均匀导电,两个电阻的大小与触点离两电极的距离成比例关系,利用这个特性,可通过以下过程来检测坐标,这也正是电阻触摸屏名称的由来,见图 295。
计算X坐标时,在X+电极施加驱动电压Vref,X-极接地,所以X+与X-处形成了匀强电场,而触点处的电压通过Y+电极采集得到,由于ITO层均匀导电,触点电压与Vref之比等于触点X坐标与屏宽度之比,从而:
计算Y坐标时,在Y+电极施加驱动电压Vref,Y-极接地,所以Y+与Y-处形成了匀强电场,而触点处的电压通过X+电极采集得到,由于ITO层均匀导电,触点电压与Vref之比等于触点Y坐标与屏高度之比,从而:
图 295 触摸检测等效电路
为了方便检测触摸的坐标,一些芯片厂商制作了电阻屏专用的控制芯片,控制上述采集过程、采集电压,外部微控制器直接与触摸控制芯片通讯直接获得触点的电压或坐标。如图 291中我们生产的这款3.2寸电阻触摸屏就是采用XPT2046芯片作为触摸控制芯片,XPT2046芯片控制4线电阻触摸屏,STM32与XPT2046采用SPI通讯获取采集得的电压,然后转换成坐标。
29.1.2 电容式触摸屏检测原理
与电阻式触摸屏不同,电容式触摸屏不需要通过压力使触点变形,再通过触点处电压值来检测坐标,它的基本原理和前面定时器章节中介绍的电容按键类似,都是利用充电时间检测电容大小,从而通过检测出电容值的变化来获知触摸信号。见图 296,电容屏的最上层是玻璃(不会像电阻屏那样形变),核心层部分也是由ITO材料构成的,这些导电材料在屏幕里构成了人眼看不见的静电网,静电网由多行X轴电极和多列Y轴电极构成,两个电极之间会形成电容。触摸屏工作时,X轴电极发出AC交流信号,而交流信号能穿过电容,即通过Y轴能感应出该信号,当交流电穿越时电容会有充放电过程,检测该充电时间可获知电容量。若手指触摸屏幕,会影响触摸点附近两个电极之间的耦合,从而改变两个电极之间的电容量,若检测到某电容的电容量发生了改变,即可获知该电容处有触摸动作(这就是为什么它被称为电容式触摸屏以及绝缘体触摸没有反应的原因)。
图 296 电容触摸屏基本原理
电容屏ITO层的结构见图 297,这是比较常见的形式,电极由多个菱形导体组成,生产时使用蚀刻工艺在ITO层生成这样的结构。
图 297 电容触摸屏的ITO层结构
X轴电极与Y轴电极在交叉处形成电容,即这两组电极构成了电容的两极,这样的结构覆盖了整个电容屏,每个电容单元在触摸屏中都有其特定的物理位置,即电容的位置就是它在触摸屏的XY坐标。检测触摸的坐标时,第1条X轴的电极发出激励信号,而所有Y轴的电极同时接收信号,通过检测充电时间可检测出各个Y轴与第1条X轴相交的各个互电容的大小,各个X轴依次发出激励信号,重复上述步骤,即可得到整个触摸屏二维平面的所有电容大小。当手指接近时,会导致局部电容改变,根据得到的触摸屏电容量变化的二维数据表,可以得知每个触摸点的坐标,因此电容触摸屏支持多点触控。
其实电容触摸屏可看作是多个电容按键组合而成,就像机械按键中独立按键和矩阵按键的关系一样,甚至电容触摸屏的坐标扫描方式与矩阵按键都是很相似的。
29.2 电容触摸屏控制芯片
相对来说,电容屏的坐标检测比电阻屏的要复杂,因而它也有专用芯片用于检测过程,下面我们以本章重点讲述的电容屏使用的触控芯片GT9157为例进行讲解,关于它的详细说明可从《gt91x编程指南》和《电容触控芯片GT9157》文档了解。(7寸屏使用GT911触控芯片,原理类似)
29.2.1 GT9157芯片的引脚
GT9157芯片的外观可以图 292中找到,其内部结构框图见图 298。
图 298 GT9157结构框图
该芯片对外引出的信号线介绍如下:
表 291 GT9157信号线说明
信号线 | 说明 |
AVDD、AVDD18、DVDD12、VDDDIO、GND | 电源和地 |
Driving channels | 激励信号输出的引脚,一共有0-25个引脚,它连接到电容屏ITO层引出的各个激励信号轴 |
Sensing channels | 信号检测引脚,一共有0-13个引脚,它连接到电容屏ITO层引出的各个电容量检测信号轴 |
I2C | I2C通信信号线,包含SCL与SDA,外部控制器通过它与GT9157芯片通讯,配置GT9157的工作方式或获取坐标信号 |
INT | 中断信号,GB9157芯片通过它告诉外部控制器有新的触摸事件 |
/RSTB | 复位引脚,用于复位GT9157芯片;在上电时还与INT引脚配合设置IIC通讯的设备地址 |
若您把电容触摸屏与液晶面板分离开来,在触摸面板的背面,可看到它的边框有一些电路走线,它们就是触摸屏ITO层引出的XY轴信号线,这些信号线分别引出到GT9157芯片的Driving channels及Sensing channels引脚中。也正是因为触摸屏有这些信号线的存在,所以手机厂商追求的屏幕无边框是比较难做到的。
现有的电容式液晶触摸屏,其触控感应元件包括透明基板及设置在透明基板上的相互垂直的两组触控电极,分别用于定位触控点X轴与Y轴的坐标。通常,靠近透明基板的边缘(左右的侧边)的区域还需要预留一部分空间来容纳电路走线,用于将触控电极的信号引出到触控控制器。现有技术中,这些走线为不透明的金属走线,需要在触摸屏保护面板边框位置覆盖一层遮光油墨层来遮盖这些走线,因而,很难做到无边框。
29.2.2 上电时序与I2C设备地址
GT9157触控芯片有两个备选的I2C通讯地址,这是由芯片的上电时序设定的,见图 299。上电时序有Reset引脚和INT引脚生成,若Reset引脚从低电电平转变到高电平期间,INT引脚为高电平的时候,触控芯片使用的I2C设备地址为0x28/0x29(8位写、读地址),7位地址为0x14;若Reset引脚从低电电平转变到高电平期间,INT引脚一直为低电平,则触控芯片使用的I2C设备地址为0xBA/0xBB(8位写、读地址),7位地址为0x5D。
图 299 GT9157的上电时序及I2C设备地址
29.2.3 寄存器配置
上电复位后,GT9157芯片需要通过外部主控芯片加载寄存器配置,设定它的工作模式,这些配置通过I2C信号线传输到GT9157,它的配置寄存器地址都由两个字节来表示,这些寄存器的地址从0x8047-0x8100,一般来说,我们实际配置的时候会按照GT9157生产厂商给的默认配置来控制芯片,仅修改部分关键寄存器,其中部分寄存器说明见图 2910。
图 2910 部分寄存器配置说明
这些寄存器介绍如下:
(1) 配置版本寄存器
0x8047配置版本寄存器,它包含有配置文件的版本号,若新写入的版本号比原版本大,或者版本号相等,但配置不一样时,才会更新配置文件到寄存器中。其中配置文件是指记录了寄存器0x8048-0x80FE控制参数的一系列数据。
为了保证每次都更新配置,我们一般把配置版本寄存器设置为"0x00",这样版本号会默认初始化为'A',这样每次我们修改其它寄存器配置的时候,都会写入到GT9157中。
(2) X、Y分辨率
0x8048-0x804B寄存器用于配置触控芯片输出的XY坐标的最大值,为了方便使用,我们把它配置得跟液晶面板的分辨率一致,这样就能使触控芯片输出的坐标一一对应到液晶面板的每一个像素点了。
(3) 触点个数
0x804C触点个数寄存器用于配置它最多可输出多少个同时按下的触点坐标,这个极限值跟触摸屏面板有关,如我们本章实验使用的触摸面板最多支持5点触控。
(4) 模式切换
0x804D模式切换寄存器中的X2Y位可以用于交换XY坐标轴;而INT触发方式位可以配置不同的触发方式,当有触摸信号时,INT引脚会根据这里的配置给出触发信号。
(5) 配置校验
0x80FF配置校验寄存器用于写入前面0x8047-0x80FE寄存器控制参数字节之和的补码,GT9157收到前面的寄存器配置时,会利用这个数据进行校验,若不匹配,就不会更新寄存器配置。
(6) 配置更新
0x8100配置更新寄存器用于控制GT9157进行更新,传输了前面的寄存器配置并校验通过后,对这个寄存器写1,GT9157会更新配置。
29.2.4 读取坐标信息
坐标寄存器
上述寄存器主要是由外部主控芯片给GT9157写入配置的,而它则使用图 2911中的寄存器向主控器反馈信息。
图 2911 坐标信息寄存器
(1) 产品ID及版本
0x8140-0x8143 寄存器存储的是产品ID,上电后我们可以利用I2C读取这些寄存器的值来判断I2C是否正常通讯,这些寄存器中包含有"9157"字样; 而0x8144-0x8145则保存有固件版本号,不同版本可能不同。
(2) X/Y分辨率
0x8146-0x8149寄存器存储了控制触摸屏的分辨率,它们的值与我们前面在配置寄存器写入的XY控制参数一致。所以我们可以通过读取这两个寄存器的值来确认配置参数是否正确写入。
(3) 状态寄存器
0x814E地址的是状态寄存器,它的Buffer status位存储了坐标状态,当它为1时,表示新的坐标数据已准备好,可以读取,0表示未就绪,数据无效,外部控制器读取完坐标后,须对这个寄存器位写0 。number of touch points位表示当前有多少个触点。其余数据位我们不关心。
(4) 坐标数据
从地址0x814F-0x8156的是触摸点1的坐标数据,从0x8157-0x815E的是触摸点2的坐标数据,依次还有存储3-10触摸点坐标数据的寄存器。读取这些坐标信息时,我们通过它们的track id来区分笔迹,多次读取坐标数据时,同一个track id号里的数据属于同一个连续的笔划轨迹。
读坐标流程
上电、配置完寄存器后,GT9157就会开监测触摸屏,若我们前面的配置使INT采用中断上升沿报告触摸信号的方式,整个读取坐标信息的过程如下:
(1) 待机时INT引脚输出低电平;
(2) 有坐标更新时,INT引脚输出上升沿;
(3) INT输出上升沿后,INT 脚会保持高直到下一个周期(该周期可由配置 Refresh_Rate 决定)。外部主控器在检测到INT的信号后,先读取状态寄存器(0x814E)中的number of touch points位获当前有多少个触摸点,然后读取各个点的坐标数据,读取完后将 buffer status位写为 0。外部主控器的这些读取过程要在一周期内完成,该周期由0x8056地址的Refresh_Rate寄存器配置;
(4) 上一步骤中INT输出上升沿后,若主控未在一个周期内读走坐标,下次 GT9157 即使检测到坐标更新会再输出一个 INT 脉冲但不更新坐标;
(5) 若外部主控一直未读走坐标,则 GT9 会一直输出 INT 脉冲。
29.3 电容触摸屏—触摸画板实验
本小节讲解如何驱动电容触摸屏,并利用触摸屏制作一个简易的触摸画板应用。
学习本小节内容时,请打开配套的"电容触摸屏—触摸画板"工程配合阅读。
29.3.1 硬件设计
图 2912 液晶屏实物图
本实验使用的液晶电容屏实物见图 2719,屏幕背面的PCB电路对应图 2721、图 2725中的原理图,分别是触摸屏接口及排针接口。
我们这个触摸屏出厂时就与GT9157芯片通过柔性电路板连接在一起了,柔性电路板从GT9157芯片引出VCC、GND、SCL、SDA、RSTN及INT引脚,再通过FPC座子引出到屏幕的PCB电路板中,PCB电路板加了部分电路,如I2C的上拉电阻,然后把这些引脚引出到屏幕右侧的排针处,方便整个屏幕与外部器件相连。
图 2913 电容屏接口
以上是我们STM32F429实验板使用的5寸屏原理图,它通过屏幕上的排针接入到实验板的液晶排母接口,与STM32芯片的引脚相连,连接见图 2725。
图 2914 屏幕与实验板的引脚连接
图 2725中35-38号引脚即电容触摸屏相关的控制引脚。
以上原理图可查阅《LCD5.0-黑白原理图》及《秉火F429开发板黑白原理图》文档获知,若您使用的液晶屏或实验板不一样,请根据实际连接的引脚修改程序。
29.3.2 软件设计
本工程中的GT9157芯片驱动主要是从官方提供的Linux驱动修改过来的,我们把这部分文件存储到"gt9xx.c"及"gt9xx.h"文件中,而这些驱动的底层I2C通讯接口我们存储到了"bsp_i2c_touch.c"及"bsp_i2c_touch.h"文件中,这些文件也可根据您的喜好命名,它们不属于STM32标准库的内容,是由我们自己根据应用需要编写的。在我们提供的资料《gt9xx_1.8_drivers.zip》压缩包里有官方的原Linux驱动,感兴趣的读者可以对比这些文件,了解如何移植驱动。
1. 编程要点
(1) 分析官方的gt9xx驱动,了解需要提供哪些底层接口;
(2) 编写底层驱动接口;
(3) 利用gt9xx驱动,获取触摸坐标;
(4) 编写测试程序检验驱动。