电阻屏校准开裂了还能通过校准来调校坐标吗?

1289人阅读
STM32(7)
生理信号采集(8)
& & & & 由于电阻式触摸屏就是一种传感器它利用压力感应进行控制将矩形区域中触摸点的物理位置转换为代表&坐标和&坐标的电压。这里先引入两个概念,物理坐标和逻辑坐标。物理坐标指触摸屏上点的实际位置,通常以液晶上点的个数来度量。逻辑坐标指这点被触摸时转换后的坐标值。如图,我们假定液晶最左下角为坐标轴原点,在液晶上任取一点(十字线交叉中心),在方向距离个点,在方向距离个点,则这点的物理坐标为(,)。如果我们触摸这一点时得到的向转换值为,向转换值为,则这点的逻辑坐标为(,)。
& & & &常用的电阻式触摸屏矫正方法有两点校准法和三点校准法。本文这里介绍的是结合了不同的电阻式触摸屏矫正法的优化算法:五点校正法。其中主要的原理是使用点矫正法的比例运算以及三点矫正法的基准点运算。五点校正法优势在于可以更加精确的计算出和方向的比例缩放系数,同时提供了中心基准点,对于一些线性电阻系数比较差电阻式触摸屏有很好的校正功能。
& & & &校正相关的变量主要有
& & & &x[5]&,&y[5]&五点定位的物理坐标
& & & &xl[5]&,&yl[5]&五点定位的逻辑坐标
& & & &KX&,&KY&横纵方向伸缩系数
& & & &XLC&,&YLC&中心基点逻辑坐标
& & & &XC&,&YC&中心基点物理坐标(数值采用显示屏的物理长宽分辨率的一半)
& & & &触摸屏常和点阵式液晶显示屏叠加在一起配套使用构成一个矩形的实际物理平面而由用户触摸的触摸点集合经过&转换器得到具体显示坐标的集合这个集合构成了一个逻辑平面。&由于存在误差这两个平面并不重合校准的作用就是要将逻辑平面映射到物理平面上即得到触点在液晶屏上的位置坐标。&校准算法的中心思想也就是要建立这样一个映射函数现有的校准算法大多是基于线性校准即首先假定物理平面和逻辑平面之间的误差是线性误差由旋转和偏移形成。
& & & & 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像素相对应的物理坐标值,方便对触屏响应程序做区域判别。
以下是校正程序:
/****************************************************************************
称:void LCD_Adjustd(void)
能:校正电阻屏系数
* 入口参数: null
* 出口参数:无
* 调用方法:LCD_Adjustd();
****************************************************************************/
u8 LCD_Adjustd(void)
EXTI_InitTypeDef EXTI_InitS
EXTI_InitStructure.EXTI_Line
= EXTI_Line7;
EXTI_InitStructure.EXTI_Mode
= EXTI_Mode_I //为中断请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_F//Falling下降沿 Rising上升
EXTI_InitStructure.EXTI_LineCmd = DISABLE;
EXTI_Init(&EXTI_InitStructure);
//显示停止刷屏
TIM_Cmd(TIM3, DISABLE);
//使能TIMx外设
LCD_Clear(White );
LCD_printString(110,20, &Adjustd Begin& ,Black);
delay_ms(5000);
// 定第一个点
LCD_Draw_Target(20, 20, Red);
while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7));
while( (1-GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7)))
x[0] = Read_XY(CMD_RDX);
y[0] = Read_XY(CMD_RDY);
LCD_ShowNum(150,80,x[0],Black);
LCD_ShowNum(150,110,y[0],Black);
delay_ms(200);
LCD_Color_Fill(150,80,200,120, White);
// 定第二个点
LCD_Draw_Target(300, 20, Red);
LCD_Draw_Target(20, 20, White);
while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7));
while( (1-GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7)))
x[1] = Read_XY(CMD_RDX);
y[1] = Read_XY(CMD_RDY);
LCD_ShowNum(150,80,x[1],Black);
LCD_ShowNum(150,110,y[1],Black);
delay_ms(200);
LCD_Color_Fill(150,80,200,120, White);
if(abs(y[1]-y[0]) &60)
LCD_Clear(White );
LCD_printString(110,20, &Adjustd Fail& ,Black);
delay_ms(5000);
LCD_Clear(White );
// 定第三个点
LCD_Draw_Target(20, 220, Red);
LCD_Draw_Target(300, 20, White);
while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7));
while( (1-GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7)))
x[2] = Read_XY(CMD_RDX);
y[2] = Read_XY(CMD_RDY);
LCD_ShowNum(150,80,x[2],Black);
LCD_ShowNum(150,110,y[2],Black);
delay_ms(200);
LCD_Color_Fill(150,80,200,120, White);
if(abs(x[2]-x[0]) &80)
LCD_Clear(White );
LCD_printString(110,20, &Adjustd Fail& ,Black);
delay_ms(5000);
LCD_Clear(White );
// 定第四个点
LCD_Draw_Target(300, 220, Red);
LCD_Draw_Target(20, 220, White);
while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7));
while( (1-GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7)))
x[3] = Read_XY(CMD_RDX);
y[3] = Read_XY(CMD_RDY);
LCD_ShowNum(150,80,x[3],Black);
LCD_ShowNum(150,110,y[3],Black);
delay_ms(200);
LCD_Color_Fill(150,80,200,120, White);
if((abs(y[2]-y[3]) &60) || (abs(x[1]-x[3]) &80))
LCD_Clear(White );
LCD_printString(110,20, &Adjustd Fail& ,Black);
delay_ms(5000);
LCD_Clear(White );
// 定第五个点
LCD_Draw_Target(160, 120, Red);
LCD_Draw_Target(300, 220, White);
while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7));
while( (1-GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7)))
x[4] = Read_XY(CMD_RDX);
y[4] = Read_XY(CMD_RDY);
delay_ms(200);
//计算校正系数
= ((abs(y[0]-y[2])/280+abs(y[1]-y[3])/280)/2);
= ((abs(x[0]-x[1])/200+abs(x[2]-x[3])/200)/2);
= (((float)(y[0]-y[2])/280+(float)(y[1]-y[3])/280)/2);
= (((float)(x[0]-x[1])/200+(float)(x[2]-x[3])/200)/2);
// 定点完成
LCD_Clear(White );
LCD_printString(110,20, &Adjustd Done& ,Black);
delay_ms(5000);
LCD_Color_Fill(110,20,200,35, White);
LCD_printString(110,20, &Testing& ,Black);
EXTI_InitStructure.EXTI_Line
= EXTI_Line7;
EXTI_InitStructure.EXTI_Mode
= EXTI_Mode_I //为中断请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_F//Falling下降沿 Rising上升
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_ClearITPendingBit(EXTI_Line7);
//清除线路挂起位
//显示开始刷屏
TIM_Cmd(TIM3, ENABLE);
//使能TIMx外设
Add_Button();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:19668次
排名:千里之外
原创:23篇
(5)(1)(10)(1)(2)(2)(2)谁知道数字万用表dt9205 的可调电阻电阻在哪里啊?我需要把万用表dt9205和其他电压测量工具校准.但找不到可调电阻,谁知道啊,如果有详细说明图最好.II请节约空间,不要乱发!ii首先是找不到说明书,最重要的是找不到微调即可调电阻,并不是不会用》。dormant原始 - 初学弟子 一级给的资料也没讲清微调在什么地方啊!
9205是固定电阻是已测试好的是电压档所对应接触点连接的电阻及它们所连接的共用电阻都是定值电阻
为您推荐:
其他类似问题
DCA直流电流 DCV直流电压 ACV交流电压 ACA交流电流 电阻当然是测电阻的啦 F是测电容的~~~其实数字式万用表使用方法跟指针式万用表没有太大区别。电压、电流、电阻档跟指针式操作一样,使用更方便一些。不必操心正负极接错,只是极性不同时,显示的数字前显示-(负)而已。电容、电感档按使用说明书使用就行。数字表不适合测量变化的量值,因为...
上面一般都有文字说明的啊
扫描下载二维码算法(17)
嵌入式(73)
驱动(12)
关于触摸屏校准算法的分析
介绍一种比较简单的四线电阻触摸屏校准算法,本算法已在实际工程中使用,效果不错,大家放心使用!
一、准备工作
1、设分辨率为,(比如:)
2、坐标为逻辑坐标用表示,触摸屏坐标为物理坐标(值)用表示
3、触摸按下点逻辑坐标为最终所求坐标
4、原理为利用触摸按下点的物理坐标求出按下点的逻辑坐标,即将触摸屏坐标转换为坐标
二、实现过程:
1、在上依次显示个已知逻辑坐标的点、、、、。
2、从开始每显示一个点,就触摸相应的点一次,然后依次采集记录个物理坐标点,
&&&设其依次为、、、、。
3、由、的横坐标求平均值可得,由、的横坐标求平均值可得;
&&&由、的纵坐标求平均值可得,由、的纵坐标求平均值可得。
&&&(注:求平均值是为了让采集到的物理坐标更准确)
4、由()()()()能求出触摸屏的个极限物理坐标、、、,&&&将其代入()()即可求出按下点的逻辑坐标(、为采集到的按下点物理坐标)。
5、故可见关键在于求出触摸屏的极限物理坐标(即最左、最右、最上、最下边缘的采样值)
6、校准的实质就是重新确定触摸屏的极限物理坐标、、、。
7、点用来判断触摸按下是否为有效。利用、、、可计算出,将此计算值与实际采样值比较,差别较小则本次触摸校准有效,反正无效;无效则需重复上述过程直到有效为止。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:169131次
积分:2551
积分:2551
排名:第11600名
原创:74篇
转载:69篇
评论:46条
(2)(3)(4)(7)(17)(5)(1)(10)(2)(6)(7)(1)(6)(1)(3)(4)(2)(15)(16)(4)(28)

我要回帖

更多关于 电阻屏校准 的文章

 

随机推荐