STM32f103的电阻触摸屏的五点校正算法

2017-09-12 15:27:31来源: eefocus 关键字:STM32f103  电阻触摸屏  五点校正算法

由于电阻式触摸屏就是一种传感器,它利用压力感应进行控制,将矩形区域中触摸点(X,Y)的物理位置转换为代表 X坐标和 Y 坐标的电压。这里先引入两个概念,物理坐标和逻辑坐标。物理坐标指触摸屏上点的实际位置,通常以液晶上点的个数来度量。逻辑坐标指这点被触摸时A/D 转换后的坐标值。如图1,我们假定液晶最左下角为坐标轴原点A ,在液晶上任取一点B (十字线交叉中心),B 在X 方向距离A 10 个点,在Y 方向距离A20 个点,则这点的物理坐标为(10,20)。如果我们触摸这一点时得到的X 向A/D 转换值为100,Y 向A/D 转换值为200,则这点的逻辑坐标为(100,200)。

常用的电阻式触摸屏矫正方法有两点校准法和三点校准法。本文这里介绍的是结合了不同的电阻式触摸屏矫正法的优化算法:五点校正法。其中主要的原理是使用4点矫正法的比例运算以及三点矫正法的基准点运算。五点校正法优势在于可以更加精确的计算出X和Y方向的比例缩放系数,同时提供了中心基准点,对于一些线性电阻系数比较差电阻式触摸屏有很好的校正功能。

       校正相关的变量主要有:

       x[5] , y[5] 五点定位的物理坐标

       xl[5] , yl[5] 五点定位的逻辑坐标

       KX , KY 横纵方向伸缩系数

       XLC , YLC 中心基点逻辑坐标

       XC , YC 中心基点物理坐标(数值采用LCD显示屏的物理长宽分辨率的一半)

触摸屏常和点阵式液晶显示(LCD)屏叠加在一起配套使用,构成一个矩形的实际物理平面; 而由用户触摸的触摸点集合经过 A/D 转换器,得到具体显示坐标的集合,这个集合构成了一个逻辑平面。 由于存在误差,这两个平面并不重合,校准的作用就是要将逻辑平面映射到物理平面上,即得到触点在液晶屏上的位置坐标。 校准算法的中心思想也就是要建立这样一个映射函数现有的校准算法大多是基于线性校准, 即首先假定物理平面和逻辑平面之间的误差是线性误差,由旋转和偏移形成。





        x[5] , y[5] 五点定位的物理坐标是已知的,其中4点分别设置在LCD的角落,一点设置在LCD正中心,作为基准矫正点。校正关键点和距离布局如图。校正步骤如下:
        1. 通过先后点击LCD的4个角落的矫正点,获取4个角落的逻辑坐标值。
        2. 计算 s1’ = xl[2] - xl[1] 、 s3’ = xl[3] - xl[4] 、 s2’ = yl[3] - yl[2] 、 s4’ = yl[4] - yl[1]
            计算 s1 = x[2] - x[1] 、 s3 = x[3] - x[4] 、 s2 = y[3] - y[2] 、 s4 = y[4] - y[1],一般取点可以人为的设定s1 = s3 和 s2 = s4,以方便运算。
            计算 KX = ( s1’ + s3’ )/2/s1 、KY = ( s2’ + s4’ )/2/s2
        3. 点击LCD正中心,获取中心点的逻辑坐标,作为矫正的基准点。
        4. 完成以上步骤则校正完成。下次点击触摸屏的时候获取的逻辑值XL和YL,可根据公式转换成物理值:
            X = ( XL - XLC ) / KX + XC 
            Y = ( YL - YLC ) / KY + YC
        换算出来的X , Y即是和LCD像素相对应的物理坐标值,方便对触屏响应程序做区域判别。


以下是校正程序:


  1. /**************************************************************************** 

  2. * 名    称:void LCD_Adjustd(void) 

  3. * 功    能:校正电阻屏系数 

  4. * 入口参数: null 

  5. * 出口参数:无 

  6. * 说    明:null 

  7. * 调用方法:LCD_Adjustd(); 

  8. ****************************************************************************/  

  9. u8 LCD_Adjustd(void)  

  10. {  

  11.     EXTI_InitTypeDef EXTI_InitStructure;  

  12.       

  13.     EXTI_InitStructure.EXTI_Line    = EXTI_Line7;  

  14.     EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;  //为中断请求  

  15.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//Falling下降沿 Rising上升  

  16.     EXTI_InitStructure.EXTI_LineCmd = DISABLE;  

  17.     EXTI_Init(&EXTI_InitStructure);  

  18.     //显示停止刷屏  

  19.     TIM_Cmd(TIM3, DISABLE);  //使能TIMx外设  

  20.       

  21.     LCD_Clear(White );  

  22.     LCD_printString(110,20, "Adjustd Begin" ,Black);  

  23.     delay_ms(5000);  

  24.     // 定第一个点  

  25.     LCD_Draw_Target(20, 20, Red);  

  26.     while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7));  

  27.     while( (1-GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7)))  

  28.     {  

  29.         x[0] = Read_XY(CMD_RDX);  

  30.         y[0] = Read_XY(CMD_RDY);   

  31.         LCD_ShowNum(150,80,x[0],Black);  

  32.         LCD_ShowNum(150,110,y[0],Black);  

  33.         delay_ms(200);  

  34.         LCD_Color_Fill(150,80,200,120, White);  

  35.     }  

  36.     // 定第二个点  

  37.     LCD_Draw_Target(300, 20, Red);  

  38.     LCD_Draw_Target(20, 20, White);  

  39.     while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7));  

  40.     while( (1-GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7)))  

  41.     {  

  42.         x[1] = Read_XY(CMD_RDX);  

  43.         y[1] = Read_XY(CMD_RDY);   

  44.         LCD_ShowNum(150,80,x[1],Black);  

  45.         LCD_ShowNum(150,110,y[1],Black);  

  46.         delay_ms(200);  

  47.         LCD_Color_Fill(150,80,200,120, White);  

  48.     }  

  49.     if(abs(y[1]-y[0]) >60)  

  50.     {  

  51.         LCD_Clear(White );  

  52.         LCD_printString(110,20, "Adjustd Fail" ,Black);  

  53.         delay_ms(5000);  

  54.         LCD_Clear(White );  

  55.         return 1;  

  56.     }  

  57.     // 定第三个点  

  58.     LCD_Draw_Target(20, 220, Red);  

  59.     LCD_Draw_Target(300, 20, White);  

  60.     while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7));  

  61.     while( (1-GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7)))  

  62.     {  

  63.         x[2] = Read_XY(CMD_RDX);  

  64.         y[2] = Read_XY(CMD_RDY);   

  65.         LCD_ShowNum(150,80,x[2],Black);  

  66.         LCD_ShowNum(150,110,y[2],Black);  

  67.         delay_ms(200);  

  68.         LCD_Color_Fill(150,80,200,120, White);  

  69.     }  

  70.     if(abs(x[2]-x[0]) >80)  

  71.     {  

  72.         LCD_Clear(White );  

  73.         LCD_printString(110,20, "Adjustd Fail" ,Black);  

  74.         delay_ms(5000);  

  75.         LCD_Clear(White );  

  76.         return 1;  

  77.     }  

  78.     // 定第四个点  

  79.     LCD_Draw_Target(300, 220, Red);  

  80.     LCD_Draw_Target(20, 220, White);  

  81.     while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7));  

  82. while( (1-GPIO_ReadInputD

[1] [2]

关键字:STM32f103  电阻触摸屏  五点校正算法

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2017091234385.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32f103的触摸屏的设置与使用
下一篇:电容触摸MSP430电路与LED驱动电路设计详解

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利
推荐阅读
全部
STM32f103
电阻触摸屏
五点校正算法

小广播

独家专题更多

东芝在线展会——芯科技智社会创未来
东芝在线展会——芯科技智社会创未来
2017东芝PCIM在线展会
2017东芝PCIM在线展会
TI车载信息娱乐系统的音视频解决方案
TI车载信息娱乐系统的音视频解决方案
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2017 EEWORLD.com.cn, Inc. All rights reserved