基于STM32的触摸屏学习笔记

发布者:炫酷骑士最新更新时间:2017-09-22 来源: eefocus关键字:STM32  触摸屏 手机看文章 扫描二维码
随时随地手机看文章

本文共有三个内容:一、电阻触摸屏的原理;二、XPT2046的控制字与数字接口;三、程序源码讲解(参考正点原子的代码)
一、电阻触摸屏的原理,上图:


图上的文字介绍了触摸的原理,下面总结一下触摸的原理:

触摸屏工作主要是两个电阻屏(上下两层)在工作,如上图,当某一层电级加上电压时,会在该网络上形成电压梯度。如果有外力使得上下两层在某一点接触,则在未加电压的那一层可以测得接触点的电压,从而得出接触点的坐标(X或Y)。举个例子:当我们在上层的电极间(Y+和Y-)加上电压,则会在上层形成电压梯度(这里读者可以想想AD转换的原理),当有外力使得上下两层在某一点接触时,在底层X层就可以测得接触点处的电压(每个点电压都不同),再根据测得电压和电极电压的关系与距离成正比关系(看上图的关系式)就可以得到该点的Y坐标。然后,将电压切换到下层电极(X+和X-)上,并在顶层Y层上测量接触点的电压,从而得到X坐标。

原理说完了,不知道读者注没注意到上一段中提到 ‘要测得接触点的电压’,怎么测得电压还转换为数字呢?那就需要一个AD转换器,AD转换器在哪儿?下面就来介绍一下本文中的触摸屏控制芯片-XPT2046:4导线控制器;内含12位分辨率,125KHz转换速率逐步逼近型A/D转换器;支持从1.5V~5.25V的低电压IO接口。通过两次AD转换查出被按的屏幕位置。除此之外,该芯片还有内部自带2.5V参考电压作为辅助输入,温度测量和电池监测模式,电池监测的范围可以从0V~6V,功耗小等等。XPT2046引脚图如下:


二、XPT2046的控制字与数字接口:



再来看XPT2046的数字接口(传输格式):


下面详细解释下XPT2046的转换时序:

1、为完成一次电压切换和AD转换,前8个时钟通过DIN引脚往XPT2046发8位控制字节(控制字);

2、转换器收到有关下次转换的足够信息之后,接着根据获得的信息设置输入多路选择器和参考源输入,并进入采样模式;

3、3个多时钟周期后,控制字节设置完成,转换器进入转换状态;

4、接着12个时钟周期你将完成真正的AD转换;

5、如果是度量比例转换方式(控制字节的第2位)=0,驱动器将一直工作,第13个时钟将输出转换结果的最后一位,剩下3个时钟完成转换器忽略的最后字节。

一次完整的转换需要24个串行同步时钟(DCLK)来完成。

三、程序源码讲解(参考正点原子的代码)

首先我们要知道触摸屏控制器XPT2046的哪些引脚与STM32的IO相连。在上文的XPT2046引脚图中,11,12,13,14,15,16引脚,13引脚(转换状态信号)不用;第二,我们这里不用笔中断(引脚11),而是将笔中断引脚接到了STM32的F10上。

注意:拿万用表测F10引脚,不触摸时输出3.3几V,触摸屏幕时,此引脚会输出低电平(0V)。其实我之前用的是示波器测的,不触摸时输出3.3几V,当触摸时,F10的输出电压会在几百mV到2V之间,不知道咋回事,折腾半天。可能是我不会使示波器。感兴趣的读者可以去测一测

1、通过模拟SPI时序往XPT2046中写一个字节void TP_Write_Byte(u8 num)


和通过模拟SPI时序从XPT2046中读取adc值(AD转换结果)u16 TP_Read_AD(u8 CMD),


这里说一下,形参CMD是命令控制字,详情第二讲。。这里我们可以CMD_RDX=0xD0和CMD_RDY=0x90传入CMD中,就是读取X方向的AD值时,把控制字的A2~A0配置为101,读取Y方向的AD值时,把控制字的A2~A0配置为001,都是选择12位模式,差分输入,低功率模式。

注意:这里提一下为什么要用差分输入模式:手册说,配置为差分输入模式可有效消除由于驱动开关的寄生电阻及外部的干扰带来的测量误差,提高转换精度。

      一般来说我们要调用多次u16 TP_Read_AD(u8 CMD)这个函数,因为一次转换往往与真实值存在较大误差,故我们设定一个次数:READ_TIMES,多次转换。然后斩头去尾留中间,再取平均值,这样得到的AD转换结果就相当精确了。看函数u16 TP_Read_XOY(u8 xy)。


2、还有u8 TP_Read_XY(u16 *x,u16 *y)就是同时读取X、Y的AD转换值,是上一个函数u16 TP_Read_XOY(u8 xy)的升级版~

而u8 TP_Read_XY2(u16 *x,u16 *y)是连续两次读取X和Y的AD转换值,并将有效的AD值存入*x和*y指向的内存中,这样得到的AD值就很准确了,再通过相应的比例计算就可以转换为实际坐标了。。


———————————————————————          华丽分割线        ———————————————————————————

上面一直在讲AD值的精确获取。。。下面就要把获得的精确AD值转换为实际坐标。譬如我们点了一下触摸屏,返回的AD值为(1600,1200),即触点X方向的AD值为1600,Y方向的AD值为1200,下面就是介绍如何把像1600和1200这种AD值转换为实际坐标。

在转换为实际坐标之前要讲一下一个非常重要的知识点------触摸屏校正,为什么要校正,博主在这里就不给大家列举了,请读者自己查阅相关资料~

校正原理(借鉴了一些网络上的优秀文章):

因为我们再实际中无法确定TFT屏的原点,那么我们只能在TFT屏上先确定4个点,如图:


这4个点的坐标是我们知道的,然后用笔去触摸这4个点,记录下这4个点的AD值,分别为:(AD_X1,AD_Y1),(AD_X2,AD_Y2),(AD_X3,AD_Y3),(AD_X4,AD_Y4),根据这四个点,我们计算出四个校准参数(下文会详细介绍):xfac,yfac,xoff,yoff,我们把得到的所有物理坐标都按这个关系式来计算:

LCDx=xfac*Px+xoff
LCDy=yfac*PY+yoff

其中(LCDx,LCDy)是在LCD上的实际坐标(像素坐标),(Px,Py)是从触摸屏读到的物理坐标。剩下4个参数,下文会介绍
校正代码:


图上画红圈的,请读者注意tp_dev.sta状态位的变化,下面就进入第二个红圈:tp_dev.scan(1)触摸扫描函数中看看,这里scan是函数指针:


这里应该从校准函数中说,应该能好理解。→_→在校准函数中,不断扫描TP_Scan()函数,如果这时候你触摸了一下屏幕,PEN所对应STM32的引脚将会从高电平跳变为低电平,详情看上文第二讲的注意→_→。即Ttp_dev.sta=1100,0000(根据上图第一个方框得出)。不满足校准函数中的if((tp_dev.sta&0xc0)==TP_CATH_PRES),故不会进行下面的画点。如果之前并没有按下触摸屏,这时同样是不满足上面if的。如果之前按下后松下了,这时Ttp_dev.sta=0111,1111,这时满足校准函数中的if((tp_dev.sta&0xc0)==TP_CATH_PRES),然后在校准函数中标记下触摸已经被处理了(清除tp_dev.sta),清除第一个点,画第二个点,清除第二个点,画第三个点,清除第三个点,画第四个点,清除第四个点。也就是,触摸屏幕有两个状态:按下和松开。当按下时,程序执行的是将按下的AD值坐标存到两个数组中即上图中的TP_Read_XY2(&tp_dev.x[0],&tp_dev.y[0]);当松开时,清除原来的点,并画一个新点。这样触摸4次。

在校准函数中,由于之前重复触摸了4下屏幕,触摸的4个点的AD值被存入到了pos_temp[4][2]数组中,然后算出(x1,y1),
(x2,y2)之间的距离d1和(x3,y3),(x4,y4)之间的距离d2,把这两个水平距离相除得到一个比值fac1;再计算出(x1,y1),(x3,y3)之间的距离d3和(x2,y2),(x4,y4)之间的距离d4,把这两竖直方向的距离相除,得到一个比值fac2.如果0.95

xfac、yfac:每个AD点对应的像素点数目。(液晶理论宽度-40)/(x2-x1) 即液晶理论宽度点阵值/AD测量值

xoff、yoff:测量误差值。[液晶理论宽度点阵值 - 每AD值对应多少点阵*(AD测量值)]/2 = 测量误差值(理论值为 20 点阵,实际是有误差的)


关键字:STM32  触摸屏 引用地址:基于STM32的触摸屏学习笔记

上一篇:基于STM32的红外遥控重点解析
下一篇:STM32 CAN总线标识符过滤器难点解析

推荐阅读最新更新时间:2024-03-16 15:37

RS485通信基础理论与STM32测试
1.优劣 优势:RS485的可靠传输距离远,接线简单成为了相对于RS232的最大优势。 不足:RS485总线是一种常规的通信总线,它不能够做总线的自动仲裁,也就是不能够同时发送数据以避免总线竞争,所以整个系统的通信效率必然较低,数据冗余量较大,对于速度要求高的应用场所不适应用RS485总线。同时由于RS485总线上通常只有一台主机,所以这种总线方式是典型的集中—分散型控制系统。一旦主机出现故障,会使整个系统的通信限于瘫痪状态,因此做好主机的在线备份是一个重要措施。 2. 硬件层协议 通讯协议主要是实现两个设备之间的数据交换功能,通讯协议分硬件层协议和软件层协议。硬件层协议决定数据如何传输问题,比如要在设备1向设备2发送0x
[单片机]
RS485通信基础理论与<font color='red'>STM32</font>测试
STM32中使用HAL库重定向printf()函数
函数添加头文件 #include stdio.h 添加函数 // 重定向函数1 int fputc(int ch,FILE *f) { uint8_t temp ={ch}; HAL_UART_Transmit(&UartHandle,temp,1,2); //UartHandle是串口的句柄 } //重定向函数2 PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&UARTHandle, (uint8_t *)&ch, 1, 0xFFFF); return ch; } 在keil中勾选使用C库 之后就可以 使用printf()函数,像C语言一样输出打印信息,支持 %
[单片机]
<font color='red'>STM32</font>中使用HAL库重定向printf()函数
STM32 NVIC学习
阅读nvic:系统中断管理。 我的理解——管理系统内部的中断,负责打开和关闭中断。 基础应用1,中断的初始化函数,包括设置中断向量表位置,和开启所需的中断两部分。所有程序中必须的。 用法: void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure;//中断管理恢复默认参数 #ifdef VECT_TAB_RAM //如果C/C++ Compiler\Preprocessor\Defined symbols中的定义了VECT_TAB_RAM(见程序库更改内容的表格) NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
[单片机]
关于USART很多人都容易忽视的一个问题
Ⅰ、 写在前面 今天这篇文章分享的知识点比较少,但比较重要,是大部分人在实际项目开发中都容易忽视,且容易犯下的低级错误。 本文讲述在项目开发中,或在学习中经常遇到USART发送字符串,对方没有接收完成(最后一两字节),也就是最后字节数据丢失了。具体可以看下面章节实验。 关于本文的更多详情请往下看。 Ⅱ、实例工程 为了方便大家学习,提供实验源代码工程给大家参考。 STM32F10x_USART(验证USART发送字符串): https://yunpan.cn/ckInh8YTwWHVP 访问密码 81f9 提供下载的实例实现的功能比较简单,主要是用于验证不同情况下,发送字符的不同。 实例实现功能可以从
[单片机]
关于USART很多人都容易忽视的一个问题
STM32的ADC DMA USART综合学习
学习STM32的ADC转换,在开发板上写程序调试。 四个任务: 1.AD以中断方式(单次)采集一路 2.AD以中断方式连续采集四路 3. AD 以DMA方式采集一路,DMA深度为一级 4. AD 以DMA方式采集四路,每路DMA深度为28级,并滤波,说明滤波原理。 总结: 第一个任务 :ADC以中断方式采集一路ADC,通过配置ADC_InitStructure结构体中的ADC_ScanConvMode,它规定模数转换工作在扫描模式(多通道)还是单次模式(单通道), ADC_InitStructure.ADC_ScanConvMode=DISABLE,为单通道单次模式。 ADC_ContinuousConvMode,
[单片机]
STM32-编码器的软件解码
编码器的输出AB两相的波形如下图所示,其原理不赘述。 软件解码方案有两种 1.查表法 有波形可以知道,波形有四种状态组成: 当AB相波形经历00—10—11—01的状态就表示一个正向步进。反之则表示反向步进。 读引脚电平的代码就不贴上了,只贴波形处理代码: #define FILTER_MAX 3 // 电平滤波次数 //AB电平状态表 const unsigned char TrueTabA = {1,0,0,1} ; const unsigned char TrueTabB = {1,1,0,0} ; typedef struct { unsigned char AVal;
[单片机]
STM32-编码器的软件解码
stm32 fsmc 功能讲解
LCD有如下控制线: CS:Chip Select 片选,低电平有效 RS:Register Select 寄存器选择 WR:Write 写信号,低电平有效 RD:Read 读信号,低电平有效 RESET:重启信号,低电平有效 DB0-DB15:数据线 假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多): 如果情况如下: DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。 CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效) RS为1(表示DB0-15上传递的是要被写到寄存器的值),如果为0,表示传递的是数据。 WR为0,RD为1(表示是写动
[单片机]
常说的四线、五线、八线触摸屏
这些触摸屏指的都是电阻式的触摸屏。区分可从触摸屏引出线上看出。 四线触摸屏工作原理 四线电阻式触摸屏是是电阻式家族中应用最广、最普及的一种。其结构由下线路(玻璃或薄膜材料)导电ITO层和上线路(薄膜材料)导电ITO层组成。中间有细微绝缘点隔开,当触摸屏表面无压力时,上下线路成开路状态。一旦有压力施加到触摸屏上,上下线路导通,控制器通过下线路导电ITO层在X坐标方向上施加驱动电压,通过上线路导电ITO层上的探针,侦测X方向上的电压,由此推算出触点的X坐标。通过控制器改变施加电压的方向,同理可测出触点的Y坐标,从而明确触点的位置。 五线电阻式触摸屏 五线触摸屏的结构与四线电阻式类似,也有下线路(玻璃或薄膜材料)导电ITO层和上线路
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved