一、环境介绍单片机采用STM32F103ZET6
编程软件:keil5
编程语言:C语言
编程风格:寄存器开发。
芯片:XPT2046 -标准SPI接口时序
二、XPT2046芯片介绍2.1功能XPT2046是一款12位ADC芯片,可以作为普通ADC芯片使用,但一般用在电阻式触摸屏上,方便定位触摸屏坐标。
图XPT2046内部原理图
图2:电阻式触摸屏-四根引线连接到XPT2046的YN\XN\YP\XP。
(XPT2046支持笔中断输出——低电平有效,此引脚可以配置到单片机的中断引脚,也可以通过轮询判断触摸屏是否被按下来判断此引脚的状态)
可以单独买一个触摸屏和XPT2046,还可以自己做画板,触摸按键(用一张纸在最下面画个模型就行),还有很多其他的小玩意。
图3:带电阻触摸屏的液晶屏(上盖哪层膜是用来触摸的)
2.2特点1。工作电压范围为2.2V~5.25V2数字I/支持1.5V~5.25V O 3。内置2.5V参考电压源4。电源电压测量(0V~6)5。内置温度测量功能6。触摸压力测量7。SPI三线式控制通信接口8。自动关断功能9。封装:QFN-16、 TSSOP-16和VFBGA-48和TSC204: 010 06ak4182a与10完全兼容。XPT2046在125KHz转换速率和2.7V电压下的功耗仅为750w。XP204611。由于其低功耗和高速度,它被广泛用于由电池供电的小型手持设备,如PDA和移动电话。12.XPT2046提供三种封装:TSSOP-16、 QFN-16和VFBGA。温度范围为-40 ~ 85。
2.3工作原理XPT2046是典型的逐次逼近型模数转换器(SAR ADC),包括采样/保持、模数转换、串行数据输出等功能。同时,该芯片集成了2.5V内部基准电压源和温度检测电路,工作时使用外部时钟。XPT2046可以采用单电源供电,电源电压范围为2.7V-5.5v,基准电压直接决定ADC的输入范围。基准电压可以是内部基准电压,也可以从外部直接输入1V ~ VCC范围内的基准电压(要求外部基准电压源的输出阻抗较低)。X、Y、Z、VBAT、Temp和AUX模拟信号在进入ADC之前由片内控制寄存器选择,可配置为单端或差分模式。选择VBAT、Temp、AUX时,可配置为单端模式;当作为触摸屏使用时,可配置差分模式,可有效消除驱动开关寄生电阻和外界干扰带来的测量误差,提高转换精度。
典型应用:
单端工作模式
当SER/DFR设为高电平时,XPT2046工作于单端模式。单端模式的应用原理如下图所示。单端模式很简单。采样过程完成后,驱动开关可以在转换过程中关闭,从而降低功耗。然而,这种模式的缺点是精度直接受到基准电压源精度的限制。同时,由于内部驱动开关的导通电阻,导通电阻和触摸屏电阻之间的分压也会带来测量误差。
(图中的A2 A1 A0,以及上面提到的SER/DFR都是XPT2046的配置命令。具体使用方法后面再讲。)
差分工作模式
当SER/DFR设置为低电平时,XPT2046工作在差分模式。差模的优点是REF和-REF的输入分别直接连接到YP和YN,可以消除驱动开关导通电阻引起的坐标测量误差。缺点:无论在采样还是转换过程中,都需要打开驱动开关。与单端模式相比,功耗增加。如果不考虑功耗,当前选择差分工作模式。
(图中的A2 A1 A0,以及上面提到的SER/DFR都是XPT2046的配置命令。具体使用方法后面再讲。)
2.3 XPT2046数据采集和转换一次的时序介绍2.3 xpt 2046数据接口是串行接口,处理器和转换器之间的通信需要8个时钟周期。可以使用SPI、SSI、Microwire和其他同步串行接口。一次完整的转换需要24个串行同步时钟(DCLK)。
前八个时钟用于通过DIN引脚输入控制字节。当转换器获得有关下一次转换的足够信息时,它会根据获得的信息设置输入多路复用器和基准源输入,并进入采样模式。如有必要,它将启动触摸屏驱动程序。三个多时钟周期后,控制字节置1,转换器进入转换状态。此时,输入采样保持器进入保持状态,触摸面板驱动器停止工作(单端工作模式)。
接下来的12个时钟周期将完成真正的模数转换。如果是测量比值转换模式(SER/DFR——=0),转换过程中驱动器会一直工作,第13个时钟输出转换结果的最后一位。剩余的3个多时钟周期将用于完成转换器忽略的最后一个字节(DOUT设为低电平)。
时序图如下:
时序图中的控制命令字节:
7位(MSB),6位,5位,4位,3位,2位,1位,0 (LSB),sa2a1a0modeser/dfrpd1pd0控制字节。每个位的含义如下:
名称功能描述7S起始位。1表示新控制字节到达,0表示忽略引脚PIN上的数据6-4A2-A0通道选择位。上面已经介绍了3模12位/8位转换分辨率选择位。选择8位作为1的转换分辨率,选择12位作为0.2 2用户/DFR单端输入模式/差分输入模式选择位的分辨率。1是单端输入模式,0是差分输入模式1-0PD1-PD0低功耗模式选择位。如果是11,则设备一直处于供电状态;如果为00,则器件在两次转换之间处于低功耗模式。注:差分模式仅用于X坐标、Y坐标和触摸压力的测量,其他测量需要单端模式。
根据上表的介绍,可以得到0xD0和0x90两个命令来选择12位分辨率,测量差分模式下的X和Y坐标。
XPT2046还有其他模式,如温度测量,笔中断开关(默认开启),16时钟周期转换,15时钟周期转换,不再介绍。根据前面的介绍,在触摸屏上测量XY坐标的功能已经满足。
2.4 SPI时序介绍这里的XPT2046支持标准三线式SPI接口。SPI时序的介绍已在上一篇文章中介绍过。
这里:STM32介绍:SPI总线介绍,读写W25Q64(FLASH)(硬件仿真序列)_ DS小龙哥专栏-CSDN博客_w25q64
2.5物理坐标与屏幕坐标的转换触摸屏在液晶屏上正常使用时,肯定需要将采集到的原始X、Y值转换成液晶屏的屏幕坐标才能使用。
换算方法有很多种,这里采用最简单的角度系数计算法。
比如我用的液晶屏是3.5寸,分辨率320*480。
1.得到触摸屏左上角和右下角的坐标x=3831,y=3934 x=155,y=168。
2.转换坐标值X坐标:3831 ~ 155-3676 ~ 0 Y坐标:3934 ~ 168-3766 ~ 0
3.计算斜率。x坐标的斜率:3676/320=11.4875 y坐标:3766/480=7.84583。
4.得到实际像素坐标X坐标:320-(实时采集的当前X模拟量-155)/11.4875 y坐标:480-(实时采集的当前Y模拟量-168)/7.84583。
这里做减法的原因:因为我测试用的触摸屏采集的X和Y值与液晶屏的屏幕坐标值相反。
三、样本代码由SPI模拟时序驱动,可以移植到其他平台。
3.1 xpt 2046。c #包括xpt 2046 _ touch。h 结构xpt 2046 _触摸xpt 2046 _触摸;void xpt 2046 _ touch init(请参阅){ RCC-APB 2 en |=1 CRL |=0x 00000830;gpio f-CRH=0 xfffff 000 f;gpiof-CRH |=0x 00003830;gpio b-ODR |=0x 3=4;//丢弃最低四位S7-1200可编程控制器://取消选中返回数据;}u8 xpt 2046 _ readxy(请参阅){ if(XPT2046_PEN==0) //判断触摸屏是否按下{ xpt 2046 _ touch。0x 0=xpt 2046 _ read数据(0 xd 0);xpt 2046 _ touch。y0=xpt 2046 _读取数据(0x 90);xpt 2046 _ touch。x=320-(xpt 2046 _ touch。0x 0-155)/11.4875;xpt 2046 _ touch。y=480-(xpt 2046 _ touch。y 0-168)/7,84583;返回1;}返回0;} 3.2 xpt 2046。h # ifndef xpt 2046 _ touch _ h #定义xpt 2046 _ touch _ h #包括'STM 32 F10 x . h #包括'sys。h包括'delay.h //触摸屏引脚定义#定义xpt 2046 _ MoSi pfout(9)#定义xpt 2046 _ miso pbin(2)#定义xpt 2046 _ sck pbout(1)#定义xpt 2046 _ cs pfout(11)#定义xpt 2046 _ pen pf(10)//函数声明S7-1200可编程控制器:请参见xpt 2046 _ SPI _ write one byte(u8 cmd);S7-1200可编程控制器://存放触摸屏信息的结构体struct xpt 2046 _ touch { u16 x 0];//物理坐标x u16和0;//物理坐标y或16x//像素坐标x或16y//像素坐标y };外部结构xpt 2046 _ touch xpt 2046 _ touch # endif
标签:坐标模式触摸屏