【正点原子探索者STM32F407开发板例程连载+教学】第33章 触摸屏实验

2019-07-20 20:35发布

第三十三章 触摸屏实验

       本章,我们将介绍如何使用STM32F4来驱动触摸屏,ALIENTEK探索者STM32F4开发板本身并没有触摸屏控制器,但是它支持触摸屏,可以通过外接带触摸屏的LCD模块(比如ALIENTEK TFTLCD模块),来实现触摸屏控制。在本章中,我们将向大家介绍STM32控制ALIENTKE TFTLCD模块(包括电阻触摸与电容触摸),实现触摸屏驱动,最终实现一个手写板的功能。本章分为如下几个部分: 33.1电阻与电容触摸屏简介 33.2 硬件设计 33.3 软件设计 33.4 下载验证  

33.1 触摸屏简介    

目前最常用的触摸屏有两种:电阻式触摸屏与电容式触摸屏。下面,我们来分别介绍。

33.1.1电阻式触摸屏

Iphone面世之前,几乎清一 {MOD}的都是使用电阻式触摸屏,电阻式触摸屏利用压力感应进行触点检测控制,需要直接应力接触,通过检测电阻来定位触摸位置。 ALIENTEK 2.4/2.8/3.5TFTLCD模块自带的触摸屏都属于电阻式触摸屏,下面简单介绍下电阻式触摸屏的原理。 电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层涂层、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层隔开绝缘。 当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在XY两个方向上产生信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出(XY)的位置,再根据获得的位置模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。  电阻触摸屏的优点:精度高、价格便宜、抗干扰能力强、稳定性好。 电阻触摸屏的缺点:容易被划伤、透光性不太好、不支持多点触摸。  从以上介绍可知,触摸屏都需要一个AD转换器, 一般来说是需要一个控制器的。ALIENTEK TFTLCD模块选择的是四线电阻式触摸屏,这种触摸屏的控制芯片有很多,包括:ADS7843ADS7846TSC2046XPT2046AK4182等。这几款芯片的驱动基本上是一样的,也就是你只要写出了ADS7843的驱动,这个驱动对其他几个芯片也是有效的。而且封装也有一样的,完全PIN TO PIN兼容。所以在替换起来,很方便。 ALIENTEK TFTLCD模块自带的触摸屏控制芯片为XPT2046XPT2046是一款4导线制触摸屏控制器,内含12位分辨率125KHz转换速率逐步逼近型A/D转换器。XPT2046支持从1.5V5.25V的低电压I/O接口。XPT2046能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。内部自带2.5V参考电压可以作为辅助输入、温度测量和电池监测模式之用,电池监测的电压范围可以从0V6VXPT2046片内集成有一个温度传感器。 在2.7V的典型工作状态下,关闭参考电压,功耗可小于0.75mWXPT2046采用微小的封装形式:TSSOP-16,QFN-16(0.75mm厚度)VFBGA48。工作温度范围为-40℃~+85 该芯片完全是兼容ADS7843ADS7846的,关于这个芯片的详细使用,可以参考这两个芯片的datasheet 电阻式触摸屏就介绍到这里。

33.1.2电容式触摸屏

现在几乎所有智能手机,包括平板电脑都是采用电容屏作为触摸屏,电容屏是利用人体感应进行触点检测控制,不需要直接接触或只需要轻微接触,通过检测感应电流来定位触摸坐标。 ALIENTEK 4.3/7TFTLCD模块自带的触摸屏采用的是电容式触摸屏,下面简单介绍下电容式触摸屏的原理。 电容式触摸屏主要分为两种: 1、  表面电容式电容触摸屏。 表面电容式触摸屏技术是利用ITO(铟锡氧化物,是一种透明的导电材料)导电膜,通过电场感应方式感测屏幕表面的触摸行为进行。但是表面电容式触摸屏有一些局限性,它只能识别一个手指或者一次触摸。 2、  投射式电容触摸屏。 投射电容式触摸屏是传感器利用触摸屏电极发射出静电场线。一般用于投射电容传感技术的电容类型有两种:自我电容和交互电容。  自我电容又称绝对电容,是最广为采用的一种方法,自我电容通常是指扫描电极与地构成的电容。在玻璃表面有用ITO制成的横向与纵向的扫描电极,这些电极和地之间就构成一个电容的两极。当用手或触摸笔触摸的时候就会并联一个电容到电路中去,从而使在该条扫描线上的总体的电容量有所改变。在扫描的时候,控制IC依次扫描纵向和横向电极,并根据扫描前后的电容变化来确定触摸点坐标位置。笔记本电脑触摸输入板就是采用的这种方式,笔记本电脑的输入板采用X*Y的传感电极阵列形成一个传感格子,当手指靠近触摸输入板时,在手指和传感电极之间产生一个小量电荷。采用特定的运算法则处理来自行、列传感器的信号来确定手指的位置。  交互电容又叫做跨越电容,它是在玻璃表面的横向和纵向的ITO电极的交叉处形成电容。交互电容的扫描方式就是扫描每个交叉处的电容变化,来判定触摸点的位置。当触摸的时候就会影响到相邻电极的耦合,从而改变交叉处的电容量,交互电容的扫面方法可以侦测到每个交叉点的电容值和触摸后电容变化,因而它需要的扫描时间与自我电容的扫描方式相比要长一些,需要扫描检测X*Y根电极。目前智能手机/平板电脑等的触摸屏,都是采用交互电容技术。 ALIENTEK所选择的电容触摸屏,也是采用的是投射式电容屏(交互电容类型),所以后面仅以投射式电容屏作为介绍。 透射式电容触摸屏采用纵横两列电极组成感应矩阵,来感应触摸。以两个交叉的电极矩阵,即: X轴电极和Y轴电极,来检测每一格感应单元的电容变化,如图33.1.2.1所示:
 33.1.2.1 投射式电容屏电极矩阵示意图 示意图中的电极,实际是透明的,这里是为了方便大家理解。图中,XY轴的透明电极电容屏的精度、分辨率与XY轴的通道数有关,通道数越多,精度越高。以上就是电容触摸屏的基本原理,接下来看看电容触摸屏的优缺点: 电容触摸屏的优点:手感好、无需校准、支持多点触摸、透光性好。 电容触摸屏的缺点:成本高、精度不高、抗干扰能力差。 这里特别提醒大家电容触摸屏对工作环境的要求是比较高的,在潮湿、多尘、高低温环境下面,都是不适合使用电容屏的。  电容触摸屏一般都需要一个驱动IC来检测电容触摸,且一般是通过IIC接口输出触摸数据的。ALIENTEK 7 TFTLCD模块的电容触摸屏,采用的是15*10的驱动结构(10个感应通道,15个驱动通道),采用的是GT811做为驱动ICALIENTEK 4.3 TFTLCD模块有两种成触摸屏:1,使用OTT2001A作为驱动IC,采用13*8的驱动结构(8个感应通道,13个驱动通道);2,使用GT9147作为驱动IC,采用17*10的驱动结构(10个感应通道,17个驱动通道)。 这两个模块都只支持最多5点触摸,在本例程,仅支持ALIENTEK 4.3TFTLCD电容触摸屏模块,所以这里介绍仅OTT2001AGT9147GT811的驱动方法同这两款IC是类似的,大家可以参考着学习即可。 OTT2001A是台湾旭曜科技生产的一颗电容触摸屏驱动IC,最多支持208个通道。支持SPI/IIC接口,在ALIENTEK 4.3 TFTLCD电容触摸屏上,OTT2001A只用了104个通道,采用IIC接口。IIC接口模式下,该驱动ICSTM32F4的连接仅需要4根线:SDASCLRSTINTSDASCLIIC通信用的,RST是复位脚(低电平有效),INT是中断输出信号,关于IIC我们就不详细介绍了,请参考第二十九章。 OTT2001A的器件地址为0X59(不含最低位,换算成读写命令则是读:0XB3,写:0XB2), 接下来,介绍一下OTT2001A的几个重要的寄存器。 1,  手势ID寄存器 手势ID寄存器(00H)用于告诉MCU,哪些点有效,哪些点无效,从而读取对应的数据,该寄存器各位描述如表33.1.2.1所示: 手势ID寄存器(00H BIT8 BIT6 BIT5 BIT4
保留 保留 保留 0,(X1,Y1)无效
1,(X1,Y1)
有效
BIT3 BIT2 BIT1 BIT0
0,(X4,Y4)无效
1,(X4,Y4)
有效
0,(X3,Y3)无效
1,(X3,Y3)
有效
0,(X2,Y2)无效
1,(X2,Y2)
有效
0,(X1,Y1)无效
1,(X1,Y1)
有效
33.1.2.1 手势ID寄存器 OTT2001A支持最多5点触摸,所以表中只有5个位用来表示对应点坐标是否有效,其余位为保留位(读为0),通过读取该寄存器,我们可以知道哪些点有数据,哪些点无数据,如果读到的全是0,则说明没有任何触摸。 2,  传感器控制寄存器(ODH 传感器控制寄存器(ODH),该寄存器也是8位,仅最高位有效,其他位都是保留,当最高位为1的时候,打开传感器(开始检测),当最高位设置为0的时候,关闭传感器(停止检测)。 3,  坐标数据寄存器(共20个) 坐标数据寄存器总共有20个,每个坐标占用4个寄存器,坐标寄存器与坐标的对应关系如表33.1.2.2所示: 寄存器编号 01H 02H 03H 04H 坐标1 X1[15:8] X1[7:0] Y1[15:8] Y1[7:0] 寄存器编号 05H 06H 07H 08H 坐标2 X2[15:8] X2[7:0] Y2[15:8] Y2[7:0] 寄存器编号 10H 11H 12H 13H 坐标3 X3[15:8] X3[7:0] Y3[15:8] Y3[7:0] 寄存器编号 14H 15H 16H 17H 坐标4 X4[15:8] X4[7:0] Y4[15:8] Y4[7:0] 寄存器编号 18H 19H 1AH 1BH 坐标5 X5[15:8] X5[7:0] Y5[15:8] Y5[7:0]33.1.2.2 坐标寄存器与坐标对应表 从表中可以看出,每个坐标的值,可以通过4个寄存器读出,比如读取坐标1X1Y1),我们则可以读取01H~04H,就可以知道当前坐标1的具体数值了,这里我们也可以只发送寄存器01,然后连续读取4个字节,也可以正常读取坐标1,寄存器地址会自动增加,从而提高读取速度。 OTT2001A相关寄存器的介绍就介绍到这里,更详细的资料,请参考:OTT2001A IIC协议指导.pdf这个文档。OTT2001A只需要经过简单的初始化就可以正常使用了,初始化流程:复位à延时100msà释放复位à设置传感器控制寄存器的最高位位1,开启传感器检查。就可以正常使用了。 另外,OTT2001A有两个地方需要特别注意一下: 1,              OTT2001A的寄存器是8位的,但是发送的时候要发送16位(高八位有效),才可以正常使用。 2,              OTT2001A的输出坐标,默认是以:X坐标最大值是2700Y坐标最大值是1500的分辨率输出的,也就是输出范围为:X0~2700Y0~1500MCU在读取到坐标后,必须根据LCD分辨率做一个换算,才能得到真实的LCD坐标。 下面我们简单介绍下GT9147,该芯片是深圳汇顶科技研发的一颗电容触摸屏驱动IC,支持100Hz触点扫描频率,支持5点触摸,支持18*10个检测通道,适合小于4.5寸的电容触摸屏使用。 OTT2001A一样,GT9147MCU连接也是通过4根线:SDASCLRSTINT。不过,GT9147IIC地址,可以是0X14或者0X5D,当复位结束后的5ms内,如果INT是高电平,则使用0X14作为地址,否则使用0X5D作为地址,具体的设置过程,请看:GT9147数据手册.pdf这个文档。本章我们使用0X14作为器件地址(不含最低位,换算成读写命令则是读:0X29,写:0X28),接下来,介绍一下GT9147的几个重要的寄存器。 1,控制命令寄存器(0X8040 该寄存器可以写入不同值,实现不同的控制,我们一般使用02这两个值,写入2,即可软复位GT9147,在硬复位之后,一般要往该寄存器写2,实行软复位。然后,写入0,即可正常读取坐标数据(并且会结束软复位)。 2,配置寄存器组(0X8047~0X8100 这里共186个寄存器,用于配置GT9147的各个参数,这些配置一般由厂家提供给我们(一个数组),所以我们只需要将厂家给我们的配置,写入到这些寄存器里面,即可完成GT9147的配置。由于GT9147可以保存配置信息(可写入内部FLASH,从而不需要每次上电都更新配置),我们有几点注意的地方提醒大家:10X8047寄存器用于指示配置文件版本号,程序写入的版本号,必须大于等于GT9147本地保存的版本号,才可以更新配置。20X80FF寄存器用于存储校验和,使得0X8047~0X80FF之间所有数据之和为030X8100用于控制是否将配置保存在本地,写0,则不保存配置,写1则保存配置。 3,产品ID寄存器(0X8140~0X8143 这里总共由4个寄存器组成,用于保存产品ID,对于GT9147,这4个寄存器读出来就是:9147四个字符(ASCII码格式)。因此,我们可以通过这4个寄存器的值,来判断驱动IC的型号,从而判断是OTT2001A还是GT9147,以便执行不同的初始化。 4,状态寄存器(0X814E 该寄存器各位描述如表33.1.2.3所示: 寄存器 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 0X814E buffer
状态 大点 接近
有效
按键 有效触点个数33.1.2.3 状态寄存器各位描述        这里,我们仅关心最高位和最低4位,最高位用于表示buffer状态,如果有数据(坐标/按键),buffer就会是1,最低4位用于表示有效触点的个数,范围是:0~50,表示没有触摸,5表示有5点触摸。这和前面OTT2001A的表示方法稍微有点区别,OTT2001A是每个位表示一个触点,这里是有多少有效触点值就是多少。最后,该寄存器在每次读取后,如果bit7有效,则必须写0,清除这个位,否则不会输出下一次数据!!这个要特别注意!!! 5,坐标数据寄存器(共30个) 这里共分成5组(5个点),每组6个寄存器存储数据,以触点1的坐标数据寄存器组为例,如表33.1.2.4所示: 寄存器 bit7~0 寄存器 bit7~0 0X8150 触点1 x坐标低8 0X8151 触点1 x坐标低高位 0X8152 触点1 y坐标低8 0X8153 触点1 y坐标低高位 0X8154 触点1 触摸尺寸低8 0X8155 触点1 触摸尺寸高833.1.2.4 触点1坐标寄存器组描述        我们一般只用到触点的xy坐标,所以只需要读取0X8150~0X8153的数据,组合即可得到触点坐标。其他4组分别是:0X81580X81600X81680X8170等开头的16个寄存器组成,分别针对触点2~4的坐标。同样GT9147也支持寄存器地址自增,我们只需要发送寄存器组的首地址,然后连续读取即可,GT9147会自动地址自增,从而提高读取速度。 GT9147相关寄存器的介绍就介绍到这里,更详细的资料,请参考:GT9147编程指南.pdf这个文档。 GT9147只需要经过简单的初始化就可以正常使用了,初始化流程:硬复位à延时10msà结束硬复位à设置IIC地址à延时100msà软复位à更新配置(需要时)à结束软复位。此时GT9147即可正常使用了。        然后,我们不停的查询0X814E寄存器,判断是否有有效触点,如果有,则读取坐标数据寄存器,得到触点坐标,特别注意,如果0X814E读到的值最高位为1,就必须对该位写0,否则无法读到下一次坐标数据。        电容式触摸屏部分,就介绍到这里。

33.2 硬件设计

本章实验功能简介:开机的时候先初始化LCD,读取LCD ID,随后,根据LCD ID判断是电阻触摸屏还是电容触摸屏,如果是电阻触摸屏,则先读取24C02的数据判断触摸屏是否已经校准过,如果没有校准,则执行校准程序,校准过后再进入电阻触摸屏测试程序,如果已经校准了,就直接进入电阻触摸屏测试程序。 如果是电容触摸屏,则先读取芯片ID,判断是不是GT9147,如果是则执行GT9147初始化代码,如果不是,则执行OTT2001A的初始化代码,初始化电容触摸屏,随后进入电容触摸屏测试程序(电容触摸屏无需校准!!)。 电阻触摸屏测试程序和电容触摸屏测试程序基本一样,只是电容触摸屏支持最多5点同时触摸,电阻触摸屏只支持一点触摸,其他一模一样。测试界面的右上角会有一个清空的操作区域(RST),点击这个地方就会将输入全部清除,恢复白板状态。使用电阻触摸屏的时候,可以通过按KEY0来实现强制触摸屏校准,只要按下KEY0就会进入强制校准程序。 所要用到的硬件资源如下: 1)  指示灯DS0 2)  KEY0按键 3) TFTLCD模块(带电阻/电容式触摸屏) 4)  24C02 所有这些资源与STM32F4的连接图,在前面都已经介绍了,这里我们只针对TFTLCD模块与STM32F4的连接端口再说明一下,TFTLCD模块的触摸屏(电阻触摸屏)总共有5跟线与STM32F4连接,连接电路图如图33.2.1所示:  33.2.1触摸屏与STM32F4的连接图 从图中可以看出, T_MOSIT_MISOT_SCKT_CST_PEN分别连接在STM32F4的:PF11PB2PB0PC13PB1上。     如果是电容式触摸屏,我们的接口和电阻式触摸屏一样(上图右侧接口),只是没有用到五根线了,而是四根线,分别是:T_PEN(CT_INT)T_CS(CT_RST)T_CLK(CT_SCL)T_MOSI(CT_SDA)。其中:CT_INTCT_RSTCT_SCLCT_SDA分别是OTT2001A/GT9147的:中断输出信号、复位信号,IICSCLSDA信号。这里,我们用查询的方式读取OTT2001A/GT9147的数据,对于OTT2001A没有用到中断信号(CT_INT),所以同STM32F4的连接,只需要3根线即可,不过GT9147还需要用到CT_INTIIC地址设定,所以需要4根线连接。

33.3 软件设计

 软件设计部分请直接下载pdf和实验学习。

33.4 下载验证

在代码编译成功之后,我们通过下载代码到ALIENTEK探索者STM32F4开发板上,电阻触摸屏得到如图33.4.1所示界面(左侧画图界面,右侧是校准界面):  33.4.1电阻触摸屏测试程序运行效果 左侧的图片,表示已经校准过了,并且可以在屏幕触摸画图了。右侧的图片则是校准界面程序界面,用于校准触摸屏用(可以按KEY0进入校准)。 如果是电容触摸屏,测试界面如图33.4.2所示:   33.4.2 电容触摸屏测试界面        左侧是单点触摸效果图,右侧是多点触摸(图为3点,最大支持5点)效果图。
   实验详细手册和源码下载地址:http://www.openedv.com/posts/list/41586.htm  正点原子探索者STM32F407开发板购买地址http://item.taobao.com/item.htm?id=41855882779
  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
合肥-文盲
1楼-- · 2019-07-20 23:44
坐个沙发  这两天研究XPT2046驱动,看的有点烦,关键没看懂
haoyang877
2楼-- · 2019-07-21 02:10
 精彩回答 2  元偷偷看……
bt8023cpt
3楼-- · 2019-07-21 02:50
原来是淘宝客

一周热门 更多>