【STM32F429开发板用户手册】第44章 STM32F429的LTDC应用之LCD电阻触摸和电容触摸

最新教程下载:http://www.armbbs.cn/forum.phpod=viewthread&tid=93255

第44章       STM32F429的LTDC应用之LCD电阻触摸和电容触摸

本章教程为大家讲解LTDC应用之LCD电阻触摸芯片STMPE811的4点和2点触摸校准和电容触摸芯片FT5X06、GT911和GT811的使用。

目录

第44章       STM32F429的LTDC应用之LCD电阻触摸和电容触摸

44.1 初学者重要提示

44.2 电阻触摸和电容触摸相关知识

44.3 电阻屏硬件设计

44.4 电容屏硬件设计

44.5 电阻触摸驱动设计

44.5.1        STMPE811的驱动实现

44.5.2        电阻触摸扫描函数TOUCH_Scan

44.5.3        电阻屏触摸校准原理(2点)

44.5.4        电阻屏触摸校准原理(4点)

44.5.5        电阻屏触摸校准的实现

44.5.6        电阻屏触摸ADC值转物理坐标

44.5.7        电阻触摸的使用方法

44.6 电容触摸驱动设计

44.6.1        电容屏触摸IC—FT5X06

44.6.2        电容屏触摸IC—GT911

44.6.3 电容触摸的使用方法

44.7 不同触摸IC的识别

44.8 LCD触摸移植和使用

44.9 实验例程设计框架

44.10          实验例程说明(MDK)

44.11          实验例程说明(IAR)

44.12   总结


 

44.1 初学者重要提示

  1.   学习本章节前,务必优先学习第40章,需要对LTDC的基础知识和HAL库的几个常用API有个认识。
  2.   LTDC驱动设计和相关问题在第41章有详细说明。
  3.   电阻触摸支持2点和4点校准,而电容屏无需校准。
  4.   电阻触摸校准解决的是触摸板的线性度问题,而飞点要另外处理,当前程序已经做了支持。总的来说,V6配套的电阻触摸方案已经比较成熟,可以放心用于项目。

44.2 电阻触摸和电容触摸相关知识

这部分知识点在第42章的2.2小节有详细说明,必看。

44.3 电阻屏硬件设计

电阻触摸STMPE811的原理图如下:

 

【STM32F429开发板用户手册】第44章 STM32F429的LTDC应用之LCD电阻触摸和电容触摸

通过STMPE811的原理图要了解以下几点:

  •   I2C的两根通信线I2C_SCL和I2C_SDA的上拉电阻在V7的主板上。
  •   原理图右侧的GPIO-0到GPIO-7可以作为扩展IO使用,支持输入和输出。其中GPIO-4到GPIO-7用于电阻触摸校准(使用那个IO是可以配置的)。
  •   对于X-,X+,Y-和Y+,只要不是X和Y进行组合,其它组合方式可以随意接,配套的触摸校准算法都可以正常识别。

44.4 电容屏硬件设计

电容触摸主要有三种:FT5X06,GT911和GT811,其中GT811已经停产。下面是FT5X06和GT911触摸板效果(触摸板和触摸芯片是一体的):

【STM32F429开发板用户手册】第44章 STM32F429的LTDC应用之LCD电阻触摸和电容触摸

触摸芯片已经集成到柔性PCB上,且已经校准好。用户使用的话,直接通过I2C方式读取数据即可。下面是电容触摸板引出的引脚:

【STM32F429开发板用户手册】第44章 STM32F429的LTDC应用之LCD电阻触摸和电容触摸

注意I2C_SDK和I2C_SCL的上拉电阻在V7主板上。

44.5 电阻触摸驱动设计

下面将电阻触摸程序设计中的相关问题逐一为大家做个说明。

44.5.1        STMPE811的驱动实现

电阻触摸要比电容触摸麻烦很多,因为电阻触摸要做校准,还要做滤波,否则采集回来的触摸值会抖动或者出现飞点,出现这种情况的主要原因是电阻触摸板的线性度不够好。开发板电阻屏使用的触摸芯片是STMPE811,这个芯片其实就是12位分辨率的ADC,用来采集电阻触摸板的X轴ADC值和Y轴ADC值,然后按照一定的线性关系将ADC值转换为实际的坐标值。其中这个线性关系是通过触摸校准建立起来的,每次采集的X轴和Y轴ADC就可以代入这个线性关系,从而获得实际的坐标值。

总的来说,STMPE811的驱动不难实现,可以结合STMPE811的数据手册:http://www.armbbs.cn/forum.phpod=viewthread&tid=23306 研究开发板提供的驱动配置。配置好后仅需要提供读取的X轴,Y轴的ADC值以及触摸按下状态(判断STMPE811的中断输出引脚就可以了,如果有触摸,这个引脚输出低电平,反之,输出高电平。通过判断这个引脚就可以选择是否读取X轴,Y轴的ADC值,避免不必要的操作)。这些函数在bsp_ts_stmpe811.c文件实现。而触摸值滤波,触摸扫描和触摸校准是在bsp_ts_touch.c文件里面实现。

下面是清除触摸中断标志函数和X轴,Y轴的ADC值读取函数,这些函数被bsp_touch.c文件所调用,而函数TOUCH_PenInt是在bsp_ts_touch.c文件,这里也贴出来。

下面将程序设计中的关键地方做个阐释:

  •   第9-16行,通过判断STMPE811的中断输出引脚的高低电平来判断触摸板是否被按下,如果有触摸,这个引脚输出低电平,反之,输出高电平。通过判断这个引脚就可以选择是否读取X轴,Y轴的ADC值,避免不必要的操作。
  •   第26-29行,清除触摸中断标志,检测到触摸屏未被按下时,要做清除。
  •   第39-84行,读取X轴ADC数值。
  •   第94-97行,读取Y轴ADC数值。

44.5.2        电阻触摸扫描函数TOUCH_Scan

接下来再来看bsp_touch.c文件中STMPE811触摸扫描函数TOUCH_Scan的实现:

下面将程序设计中的关键地方做个阐释:

  •   第9行,此函数要每1ms被调用一次。
  •   第21-37行,用于GT811,GT911和FT5X06的程序计数器。
  •   第46-52行,设置每2ms进行一次STMPE811检测。
  •   第55行,这个就是本章前面小节说的利用STMPE811的中断输出引脚的高低电平来判断触摸板是否被按下。
  •   第58-59行,读取X轴ADC数值和Y轴ADC数值。
  •   第61行,通过函数TOUCH_PressValid检测刚刚读取的X轴,Y轴数值是否在有效的范围内。

函数TOUCH_PressValid的具体实现如下,其中全局变量g_tTP.usMaxAdc = 4095,因为电阻触摸芯片STMPE811是12位ADC,最大触摸值就是2^12 – 1 = 4095。

  •   第64行,DOWN_VALID的宏定义是

#define DOWN_VALID             30

由于是每2ms进行一次检测,这里就表示延迟30ms后进行触摸数据采集。延迟30ms是为了消除触摸抖动。

  •   第70行,SAMPLE_COUNT 的宏定义是

#define SAMPLE_COUNT 20  

由于是每2ms进行一次检测,这里就表示采集够10组数据,即20ms后进行下一步操作。

  •   第75-76行,对X轴和Y轴的ADC数值都进行软件滤波。软件滤波函数TOUCH_DataFilter的实现方法是对10组数值由小到大进行排序,对第3个,第4个和第5个数值求和,然后求平均,将平均值作为最终的ADC数值。
  •   第78-86行,变量标识s_down = 0表示触摸之前是未按下状态,在此条件里面设置s_down = 1表示触摸已经按下,并通过函数TOUCH_TransX(这个函数比较关键,是通过触摸校准函数得到的一个线性关系)将当前的X轴和Y轴ADC数值转换成实际的坐标值,然后调用函数TOUCH_PutKey将当前的坐标信息存储到FIFO里面。
  •   第89-100行设置变量标识s_down = 1后会进入此条件里面,在这个条件里面通过函数TOUCH_MoveValid判断当前是否是有效的移动,如果是,就继续调用函数TOUCH_PutKey将当前的坐标信息存储到FIFO里面,如果不是,就设置全局变量g_tTP.usAdcNowX = 0。
  •   第111-128行,如果通过STMPE811的中断输出引脚检测到触摸未按下,然后判断变量s_count是否大于0,如果大于0的话,做减减运算,算是做了一个松手延迟,防止抖动。减到0的时候,将触摸未按下或者说触摸释放消息通过函数TOUCH_PutKey存储到FIFO里面。

44.5.3        电阻屏触摸校准原理(2点)

由于不同电阻触摸板的线性度参差不齐,不能直接采用比例关系将电阻触摸芯片STMPE811的返回

值转换成实际的坐标。比如我们操作的显示屏分辨率是800*480,电阻触摸芯片采用STMPE811(12位ADC,触摸值范围0-4095),获得当前的触摸值是(1024, 2048),按照比例关系转换成坐标值就是(1024*800/4096,2048*800/4096),即(200,400)。采用这种方法效果不好,容易出现点击不准确的问题。

鉴于此原因,需要通过触摸校准在ADC数值和显示屏分辨率之间建立一个新的线性关系,简单的说就是由比例关系y = ax升级为y = ax + b。如果有了新的触摸ADC数值,代入这个线性关系里面就可以得到当前实际的坐标值,触摸校准的作用就在这里了。

具体实现原理图如下:

在左上角和右下角分别设置两个坐标点(LcdX0,  LcdY0)和(LcdX1,  LcdY1),然后让用户去点击,会得到两组ADC数值(AdcX0,AdcY0)和(AdcX1,  AdcY1)。

【STM32F429开发板用户手册】第44章 STM32F429的LTDC应用之LCD电阻触摸和电容触摸

根据这四个坐标点,可以建立两组方程,一个X轴的,一个Y轴。

  •   将数值(AdcX0, LcdX0)和(AdcX1,  LcdX1)代入方程y = ax + b得到X轴方程 :

y = (x – AdcX0)*(LcdX1 – LcdX0)/(AdcX1 – AdcX0) + LcdX0。

  •   将数值(AdcY0, LcdY0)和(AdcY1,  LcdY1)代入方程y = ax + b得到Y轴方程

y = (x – AdcY0)*(LcdY1 – LcdY0)/(AdcY1 – AdcX0) + LcdY0。

 

后面采集到的ADC数值直接代入上面公式就可以得到校准后的物理坐标值(实际的分辨率坐标)。

44.5.4        电阻屏触摸校准原理(4点)

4点触摸校准实现,略复杂,实现原理如下(如果理解起来麻烦的话,会用就行,一般情况下2点校准就行):

在LCD的左上角,右上角,左下角和右下角分别标坐标点(LcdX1,  LcdY1),(LcdX4, LcdY4),(LcdX3,  LcdY3)和(LcdX2, LcdY2)。然后让用户去点击,会得到四组ADC数值(AdcX1, AdcY1),(AdcX4,  AdcY4),(AdcX3, AdcY3)和(AdcX2, AdcY2)。

【STM32F429开发板用户手册】第44章 STM32F429的LTDC应用之LCD电阻触摸和电容触摸

计算X轴:

1、将数值(AdcX1,AdcY1)和(AdcX2, AdcY2)代入方程y = ax + b得到一组方程

y = (x – AdcX1)*(AdcY2- AdcY1)/(AdcX2- AdcX1) + AdcY1

 

2、这里将AdcX2用AdcX3替换,那么坐标方程就变为

y = (x – AdcX1)*(AdcY2- AdcY1)/(AdcX3- AdcX1) + AdcY1。

 

3、同理,将AdcX1用AdcX4替换,那么坐标方程就变为

y = (x – AdcX4)*(AdcY2- AdcY1)/(AdcX3- AdcX4) + AdcY1。

那么将采集的X值代入上面两个方程会得到两个数值,假设数值是x1和x2。

 

4、再将(x1,  LcdX1))和(x2,  LcdX2)代入方程y = ax + b得到一组方程

y = (x – x1)*(LcdX2- LcdX1)/(x2- x1) + LcdX1。

 

将采集的X轴ADC数值再次代入这个方程就得到了最终的物理坐标(实际的分辨率坐标)。

 

计算Y轴:

1、将数值(AdcX1, AdcY1)和(AdcX2,  AdcY2)代入方程y = ax + b得到一组方程

y = (x – AdcX1)*(AdcY2- AdcY1)/(AdcX2- AdcX1) + AdcY1

 

2、这里将AdcY2用AdcY4替换,那么坐标方程就变为

y = (x – AdcX1)*(AdcY4- AdcY1)/(AdcX2- AdcX1) + AdcY1

 

3、同理,将AdcX1用AdcX3替换,那么坐标方程就变为

y = (x – AdcX3)*(AdcY2- AdcY1)/(AdcX2- AdcX3) + AdcY1

那么将采集的X值代入上面两个方程会得到两个数值,假设数值是x1和x2。

 

4、再将(x1, LcdY1))和(x2,  LcdY2)代入方程y = ax + b得到一组方程

y = (x – x1)*(LcdY2- LcdY1)/(x2- x1) + LcdY1。

 

将采集的Y轴ADC数值再次代入这个方程就得到了最终的物理坐标(实际的分辨率坐标)。

44.5.5        电阻屏触摸校准的实现

对2点和4点触摸校准原理有所了解后,再看代码部分就比较好理解了:

下面将程序设置中的关键地方做个阐释:

  •   第18-25行,用于标记是4点触摸校准还是2点触摸校准。
  •   第31行,显示触摸校准点,2点触摸校准的话,显示左上角和右下角的校准点位置。4点触摸校准的话,显示左上角,右上角,左下角和右下角的校准点位置。
  •   第33行,用于等待触摸笔释放,当校准完毕1个点后,等待释放时使用。
  •   第35-79行,读取500次X轴和Y轴的ADC数值,每10ms读取1次,每个触摸点的最大读取时间就是5秒。如果5秒内还没有触摸就会进入到第77行直接退出触摸校准。
  • 第41行检测到有按下的话,会连续读取5次,确保已经按下了,然后标记本次按下得到的ADC数值。根据执行的是4点触摸校准还是2点触摸校准,这个操作会执行4次或者2次。
  •   第84-100行,这里涉及到一个知识点,即X轴镜像,Y轴镜像和XY交换的处理办法,详情在此贴进行了说明:http://www.armbbs.cn/forum.phpod=viewthread&tid=93300 。
  •   第112行,将校准后的参数存储到EEPROM里面,下次开发板上电可以直接从EEPROM里面读取校准参数。

44.5.6        电阻屏触摸ADC值转物理坐标

电阻屏触摸ADC值转物理坐标的公式就是由前面5.3和5.4小节而来。

来源:嵌入式系统OS

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年7月6日
下一篇 2020年7月6日

相关推荐