本文共有三个内容:一、电阻接触屏的原理;二、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 点阵,实践是有差错的)
啊,个人觉得杂乱无章的,不知道今后还能不能看懂了~~~→