TFT-LCD屏幕触摸校准

news2024/11/19 3:20:37

TFT-LCD屏幕触摸校准

触摸屏幕分类

1.电阻屏

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

2.电容屏

电容屏是利用人体的电流感应进行工作的。当触摸电容屏时,由于人体电场,用户手指和工作面形成一个耦合电容,因为工作面上接有高频信号,于是手指吸收走一个很小的电流,这个电流分别从屏的四个角上的电极中流出,且理论上流经四个电极的电流与手指头到四角的距离成比例,控制器通过对四个电流比例的精密计算,得出位置。可以达到99%的精确度,具备小于3ms的响应速度。

电阻屏与电容屏的区别

1.电阻屏在触模时需要轻触压按,而电容屏即使很轻微的手指触碰就能激活。

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

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

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

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

触摸芯片XPT2046

XPT2046是个ADC转换芯片,对屏幕被触摸时的点进行采样,然后转换为数字量,再通过SPI接口与STM32单片机通信

在这里插入图片描述

芯片基本工作原理

XPT2046 是一种典型的逐次逼近型模数转换器(SAR ADC),包含了采样/保持、模数转换、串口数据输出等功能。同时芯片集成有一个 2.5V的内部参考电压源、温度检测电路,工作时使用外部时钟。XPT2046 可以单电源供电,电源电压范围为 2.7V~5.5V。参考电压值直接决定ADC的输入范围,参考电压可以使用内部参考电压,也可以从外部直接输入 1V~VCC范围内的参考电压(要求外部参考电压源输出阻抗低)。X、Y、Z、VBAT、Temp和AUX模拟信号经过片内的控制寄存器选择后进入ADC,ADC可以配置为单端或差分模式。选择VBAT、Temp和AUX时可以配置为单端模式;作为触摸屏应用时,可以配置为差分模式,这可有效消除由于驱动开关的寄生电阻及外部的干扰带来的测量误差,提高转换准确度

时序图

在这里插入图片描述

CS为片选信号,为低表示芯片被选中

DCLK为时钟信号,由STM32产生

DIN为输入引脚,连接到STM32的MOSI引脚,STM32为主机,主机输出,从机输入;通信开始时STM32需要先发送一个字节(8位)来设置芯片,这里需要8个时钟

BUSY为忙信号,当DIN输入一个字节来设置芯片后,BUSY线会被拉高,表示芯片在进行设置或转换数据,待数据转换完毕,则BUSY线被拉低,这里需要1个时钟

DOUT为输出引脚 ,因为是12位的ADC芯片,所以转换后的数据有12位,对照着时钟线频率,可以先给7个时钟,读出7位数据,再给5个时钟,读出剩下的5位,再给3个时钟,数据后面的Zero Filled自动填零

DIN输入的控制字节

在这里插入图片描述

起始位——第一位,即 S 位。控制字的首位必须是 1,即 S=1。在 XPT2046 的 DIN 引脚检测到起始位前,所有的输入将被忽略。

地址——接下来的 3 位(A2、A1 和 A0)选择多路选择器的现行通道,触摸屏驱动和参考源输入;因为这个芯片不但能采集屏幕,还能采集温度,采集电池,所以要设置通道,设置为采集屏幕的

在这里插入图片描述

根据手册上的这个表格,看到想要设置Y轴则A2、A1、A0分别为0、0、1,要设置X轴则A2、A1、A0分别为1、0、1

MODE——模式选择位,用于设置 ADC 的分辨率。MODE=0,下一次的转换将是 12 位模式;MODE=1,下一次的转换将是 8 位模式;选择12位模式,所以该位为0

SER/ DFR位控制参考源模式,选择单端模式(SER/DFR=1),或者差分模式(SER/DFR=0)。在X坐标、Y坐标和触摸压力测量中,为达到最佳性能,首选差分工作模式;所以该位为0

注意:差分模式仅用于 X 坐标、Y 坐标和触摸压力的测量,其它测量要求采用单端模式

PD0 和 PD1——设置掉电和内部参考电压配置的关系。根据下表,一般设置为00

在这里插入图片描述

综上,控制字节为

读X轴坐标——11010000——0xD0

读Y轴坐标——10010000——0x90

CubeMx配置

需要注意XPT2046芯片的输入引脚DIN,是在时钟信号DCLK上升沿锁存数据的,在手册中有说到

在这里插入图片描述

因为SPI有4种模式,而在上升沿采集数据的是模式0和模式3,所以在配置与XPT2046通信的SPI时,要配置成模式0或者模式3

在这里插入图片描述

XPT2046芯片与STM32引脚连接

XPT2046STM32
CSSPI2_NSS
DCLKSPI2_SCK
DINSPI2_MOSI
DOUTSPI2_MISO

因为用到了SPI2,所以CubeMX中选择初始化SPI2

在这里插入图片描述

配置界面

选择全双工主机模式

波特率分频系数选择256,然后波特率速率就为70.312KBits/s,通信速率可以设置得小一点,因为XPT2046在接收到设置命令后转换数据是需要时间的,如果分频系数最小,通信速率最快,则通信时偶尔会不稳定,在保证稳定的前提下将速率设低点,其他没问题后生成keil工程

在这里插入图片描述

如果Baud Rate(波特率)不是70.312KBits/s,那是因为时钟配置中将APB1的时钟设置为了36M,将时钟配置中APB1分频设置为4分频,则APB1变为了18M,则可以得到70.312KBits/s

tips:SPI2挂载到了APB1总线上

在这里插入图片描述

触摸校准原理

需要触摸校准的原因:

1、2.8寸的TFT屏幕的分辨率为240x320,而触摸屏的ADC值为0-4096,由于是线性变化的,所以两者之间存在比列关系,需要计算出比例因素xFactor和yFactor

解释:屏幕显示是2.8寸,分辨率是240x320的,作显示时操作的是分辨率的坐标值,但屏幕同时有触摸功能,触摸功能也是2.8寸(同一块屏幕),作触摸时读取的值不是分辨率的坐标值,而是ADC值,这个ADC值在屏幕宽度上是0 ~ 4096,在高度上也是0 ~ 4096的,所以ADC值与屏幕分辨率存在线性关系

在这里插入图片描述

触摸时的ADC值 * 比例因素xFactor = 屏幕X轴坐标

触摸时的ADC值 * 比例因素yFactor = 屏幕Y轴坐标

2、TFT屏幕的坐标原点(0,0),并非与触摸屏的原点完全对应,有一定的偏移量,需要计算出偏移量xOffset与yOffset

在这里插入图片描述

校准后,根据比例因素与偏移量计算出TFT屏幕坐标LCD_X和LCD_Y

LCD_X = (ADC_X * xFactor ) - xOffset

LCD_Y = (ADC_Y * yFactor ) - yOffset

进行屏幕校准,计算比例因素xFactor、yFactor和偏移量xOffset与yOffset的大概思路

1、首先在屏幕上取4个角和1个中心点,假设4个点与屏幕的距离都是20,则周围的4个点的坐标分别是

(x1,y1)= (20,20)

(x2,y2)=(20,LCD_Height-20)

(x3,y3)=(LCD_Width-20,LCD_Height-20)

(x4,y4)=(LCD_Width-20,20)

(x5,y5)=(LCD_Width/2,LCD_Height/2)

其中位置1 - 4用于计算比例因子与偏移量,位置5用于校验触摸校准是否正确

在这里插入图片描述

2、在屏幕上依次显示5个十字光标,它们的坐标就是上面4个角和1个中心点的坐标,等待用户进行触摸,然后依次获取5个位置的ADC坐标值,分别记为ADC_x1至ADC_x5,ADC_y1至ADC_y5

在这里插入图片描述

3、在上一步通过触摸5个点,获取到了它们的ADC值,但因为触摸是有误差的,如果直接用这些ADC值,则最后算出来的比例因素和偏移量都是不太准确的,所以要将4个触摸点整合成对角的两个点,减少触摸误差

说明:要计算的是左上角和右下角的坐标,通过周围4个触摸点的坐标来计算

左上角的X坐标 = (触摸点0的X坐标 + 触摸点1的X坐标)/ 2

左上角的Y坐标 = (触摸点0的Y坐标 + 触摸点3的Y坐标)/ 2

右下角的X坐标 = (触摸点2的X坐标 + 触摸点3的X坐标)/ 2

右下角的Y坐标 = (触摸点1的Y坐标 + 触摸点2的Y坐标)/ 2

这样就得到了左上角的(x,y)坐标,和右下角的(x,y)坐标

4、取上一步得到的左上角坐标和右下角坐标的平均值,与中间触摸点的坐标进行对比,超过一定范围则认为触摸校准失败,不超过则成功

5、根据对角坐标和屏幕分辨率,计算出计算比例因素xFactor、yFactor和偏移量xOffset与yOffset

6、将校准参数存储在外部Flash当中

部分程序

用SPI2读取触摸屏的ADC值,参数_ucXPT2046_CMD为0xD0时是读取X轴坐标,为0x90时是读取Y轴坐标

/**
* @name   Touch_Read_ADC
* @brief  读取触摸屏的ADC值
* @param  _ucXPT2046_CMD:触摸IC命令
* @retval None
*/
static uint16_t Touch_Read_ADC(uint8_t _ucXPT2046_CMD)
{
  uint8_t i,j;
  uint16_t usValue_Buf[TOUCH_READ_TIMERS],usTemp;
  uint32_t uiSumValue = 0;

  //通过SPI接口循环读取TOUCH_READ_TIMES次数的ADC值(5次)
  for(i=0;i<TOUCH_READ_TIMERS;i++)
  {
    //选择触摸芯片,CS输出低电平
    CLR_SPI_TOUCH_CS;

    /* 
    在差分模式下,XPT2046转换需要24个时钟,8个时钟输入命令,延时一会, 
    之后1个时钟去除忙信号,接着输出12位转换结果,剩下3个时钟是忽略位
    */

    //发送控制命令
    SPI_Touch_WriteByte(_ucXPT2046_CMD);
    //延时一会,等待ADC转换
    for(j=0;j<100;j++);
    //读取数据
    usValue_Buf[i] = SPI_Touch_ReadByte();    //获取前面7位(一个周期),其中最高位无效
    usValue_Buf[i] &= (~BIT7);                //最高位清零
    usValue_Buf[i] <<= 8;                     //左移至最高字节
    usValue_Buf[i] += SPI_Touch_ReadByte();   //获取后面5个字节,其中低3位无效
    usValue_Buf[i] >>= 3;                     //右移3位,得到12位有效数据
    //禁用触摸芯片,CS输出高电平
    SET_SPI_TOUCH_CS;
  }

  //采样值从大到小排序,冒泡排序
  for(i=0;i<(TOUCH_READ_TIMERS-1);i++)          //趟数:4次
  {
    for(j=i+1;j<TOUCH_READ_TIMERS;j++)        //比较次数
    {
      if(usValue_Buf[i]<usValue_Buf[j])
      {
        usTemp = usValue_Buf[i];
        usValue_Buf[i] = usValue_Buf[j];
        usValue_Buf[j] = usTemp;
      }
    }
  }

  //去掉最大最小值,求和
  for(i=1;i<(TOUCH_READ_TIMERS-1);i++)
  {
    uiSumValue += usValue_Buf[i];
  }

  //返回平均值
  return uiSumValue/(TOUCH_READ_TIMERS-2);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通达信量化接口需要被程序化执行吗?

其实通达信量化接口其实是量化交易模型的需要被执行的一种方式&#xff0c;但如果你交易者的策略模型采用比较中低频的交易执行方式&#xff0c;比如每天只交易一次&#xff0c;甚至每周或每月才轮动一次。那么小编认为通达信量化接口建议是否程序化执行也是一个非常重要的指标…

UI自动化测试-selenium元素定位

在使用Selenium和WebDriver进行UI自动化测试时&#xff0c;我们首先需要对元素定位&#xff0c;那么如何来定位元素呢&#xff1f; HTML 在进行元素定位之前&#xff0c;我们要对html代码有所了解。 <div classs_form><div classs_form_wrapper><div idlg>…

菜鸟程序员,被无良HR欺骗,因祸得福,竟“意外”拿下美团offer

前因后果 先讲述一下自己这次被无良HR欺骗坑惨的经历吧&#xff0c;面试的是一家上海某电商公司&#xff0c;给的薪资是不错。面试的时候&#xff0c;找我要了工资流水&#xff0c;然后给了我口头offer&#xff0c;就让我回去等了邮件了。回去之后就觉得offer没啥问题&#xff…

tomcat工作任务训练

文章目录1.安装jdk1.8 tomcat9.0 发布java项目部署java环境部署tomcat启动tomcat&#xff0c;测试访问上传项目安装数据库&#xff0c;建库建户web页面配置jpress测试写文章&#xff0c;上传附件2.tomcat多实例安装 比如 8080 8081 8082 发布3个论坛项目 war包也给你了tomcat多…

(memcpy memmove memcmp memset)内存操作函数详解

目录 &#x1f355;注意&#xff1a;内存操作函数隶属于头文件&#xff0c;因此在使用任何内存操作函数之前都必须引用 &#x1f95e;memcpy函数 &#x1f35e;memcpy函数的初步认识及使用 &#x1f373;样例示范&#xff1a; &#x1f9c8;代码呈现&#xff1a; &#x1f9c…

浏览器原理二三事

目录 1. 如何理解 JavaScript 是单线程的 2. 进程与线程 2.1 在浏览器中&#xff0c;如何理解进程和线程的关系&#xff1f; 2.2 浏览器的五种进程 2.2.1 浏览器主进程&#xff08;Browser 进程&#xff09; 2.2.2 浏览器渲染进程&#xff08;Renderer 进程&#xff09; …

论文投稿指南——中文核心期刊推荐(航空、航天2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

Linux——【磁盘管理和LVM卷组管理】

前言&#xff1a; Linux 磁盘管理好坏直接关系到整个系统的性能问题&#xff0c;目前市场上的磁盘分类有&#xff1a;IDE磁盘&#xff08;多用于PC机&#xff09;、SATA磁盘、SAS磁盘、SSD磁盘等这么几种分类&#xff0c;企业中服务器大多为后面的两种&#xff0c;SATA磁盘多用…

二叉树11:完全二叉树的节点个数

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;222. 完全二叉树的节点个数 题目&#xff1a; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数…

24行代码简单实现qq空间自动点赞

什么是Auto.js&#xff1f; Auto.js是基于JavaScript语言运行在Android平台上的工具。它依赖于无障碍服务。 它可以做什么&#xff1f; 解放双手&#xff0c;让手机自动打游戏、自动签到、自动领红包等等等等 它有什么优点&#xff1f; 不需要root权限&#xff08;Android…

Python pandas有几千个库函数,你用过几个?(3)

上一篇链接&#xff1a; Python pandas有好几百个库函数&#xff0c;你都用过吗&#xff08;2&#xff09;_Hann Yang的博客-CSDN博客 R(read_)&#xff1a; Function26~45 Types[Function][25:45] [read_clipboard, read_csv, read_excel, read_feather, read_fwf, read_gb…

目标检测算法——mmdetection下面的deformable-detr运行

1、环境 包版本mmcv-full1.4.2mmdet2.19.1torch1.10.0cu113torchvision0.11.1cu1132、文档 mmet官方文档 mmcv官方文档 源码下载 3、数据集 自定义数据集 4、修改代码 4.1、生成文件 打开mmdetection-master/tools下面执行train.py文件 其中配置文件--config在 mmdetec…

STM32中断使用NVIC

抢占优先级和响应优先级 值越小优先级越高&#xff0c;抢占优先级高就可以的打断抢占优先级低的&#xff1b;但同一个抢占优先级&#xff0c;高响应优先级并不能打断低响应优先级&#xff1b;当然中断同时发生的响应优先级高的先执行。简单理解为&#xff1a;抢占优先级能控制…

RV1126笔记十七:吸烟行为检测及部署<五>

若该文为原创文章,转载请注明原文出处。 ubuntu16.04上搭建转化成RKNN环境并把onnx转成RKNN模型(ubuntu16.04) onnx模型转rknn模型需要用到py3.8,所以搭建环境在转换,下面全部操作都是虚拟机下进行。 注意:转模型用py3.6, 训练用py3.8 一、miniconda安装 1、下载地址…

论文投稿指南——中文核心期刊推荐(自然科学总论)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

基于python的AD-census立体匹配算法实现

文章目录前言一、AD-census是什么&#xff1f;1.代价计算2.代价聚合3.视差优化4.视差后处理二、基于python的AD-census立体匹配算法实现前言 AD-Census算法来自于中国学者Xing Mei等在ICCV2011发表的论文《On Building an Accurate Stereo Matching System on Graphics Hardwar…

多类型随机图形生成方法及应用研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Linux-5 基础命令

Linux-5 基础命令 查看类命令 此类命令仅能查看文件中的内容 ls是用来查看目录中的内容cat是用来查看文件中的内容 查看文件 cat 选项 -n&#xff1a;显示文件内容的行数-A&#xff1a;显示文件中的特殊字符&#xff08;如果从Windows拷贝配置文件到Linux&#xff0c;很容易出…

化学试剂Biotin-PEG-COOH,Biotin-PEG-acid,生物素-聚乙二醇-羧基

英文名称&#xff1a;Biotin-PEG-COOH&#xff0c;Biotin-PEG-acid 中文名称&#xff1a;生物素-聚乙二醇-羧基 生物素-PEG-COOH是一种含有生物素和羧酸的线性杂双功能PEG试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。生物素能以高特异性和亲和力与亲和素和链霉亲…

C++:STL:常用容器(上):string

1&#xff1a;string容器 1.1 string基本概念 本质&#xff1a; string是C风格的字符串&#xff0c;而string本质是一个类 string和char* 区别 1&#xff1a;char* 是一个指针 2&#xff1a;string是一个类&#xff0c;类内部封装了 char* 管理这个字符串&#xff0c;是一个 …