EFM32片内外设--ADC之四线制触摸屏校正

目前Touch demo中的触摸屏校正算法,是采用了Carlos E. Vidales写的一种折算方法。基本原理是在屏上面取三个点分别是上部中间,中部右侧以及下部中间,然后做校正。具体的折算原理,请参考如下的链接:

英语原文:

http://www.embedded.com/design/configurable-systems/4023968/How-To-Calibrate-Touch-Screens

中文版:

http://www.eet-china.com/ART_8800302522_480101_TA_9c35bff5.HTM

 

例程中已经带了校正算法的源代码,如果像我一样,理解的还不是很透彻的话,至少先学会怎么使用这些函数吧。这个校正算法的推荐操作步骤如下:

1. 用全组数值调用setCalibrationMatrix()以设置显示屏驱动器,并提供原始存取数据。这样就不需要为存取数据构造特殊的函数。你只需要按照与程序一样的机制获取纵坐标。

2. 在坐标 (XD0,YD0)画出第一个目标。

3. 收集从触摸屏返回的数据,并存储在坐标(X0,Y0)。

4. 在坐标 (XD1,YD1)画出第二个目标。

5. 收集从触摸屏返回的数据,并存储在坐标(X1,Y1)。

6. 在坐标 (XD2,YD2)画出第三个目标。

7. 收集从触摸屏返回的数据,并存储在坐标(X2,Y2)。

8. 采用参考显示数据和其产生的触摸屏数据作为变量,调用setCalibrationMatrix()函数。

对应到代码的话,就是:

1:

/* Initialize touch screen calibration factor matrix with approx. values  */
  setCalibrationMatrix( (POINT*)&lcdCalibPoints,   /* Display coordinates   */
                        (POINT*)&touchCalibPoints, /* Touch coordinates     */
                        &calibFactors );      /* Calibration factor matrix  */

2~8:

/* Calibrate touch screen */
        else if ( buttons & BC_UIF_PB2 )
        {
          memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT );   /* Clear screen */
          drawCross( lcdCalibPoints[ 0 ].x, lcdCalibPoints[ 0 ].y, COLOR );
          TFT_DrawString(30, 35, "Tap green marker" );
          P[ 0 ] = getTouchTapSample10bit();

          memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT );   /* Clear screen */
          drawCross( lcdCalibPoints[ 1 ].x, lcdCalibPoints[ 1 ].y, COLOR );
          TFT_DrawString(40, 130, "Tap green marker" );
          P[ 1 ] = getTouchTapSample10bit();

          memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT );   /* Clear screen */
          drawCross( lcdCalibPoints[ 2 ].x, lcdCalibPoints[ 2 ].y, COLOR );
          TFT_DrawString(20, 180, "Tap green marker" );
          P[ 2 ] = getTouchTapSample10bit();

          setCalibrationMatrix( (POINT*)&lcdCalibPoints,/* Display coordinates*/
                                &P[0],                  /* Touch coordinates  */
                                &calibFactors );  /* Calibration factor matrix*/

          memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT );   /* Clear screen */
          TFT_DrawString(10, 100, "The touch screen is" );
          TFT_DrawString(30, 130, "now calibrated !" );
        }

 

9.如何应用:

touchSample = getTouchSample();

|--------> 

static POINT getTouchSample( void )
{
  POINT sample, normalizedSample;

  sample = getTouchSample10bit();
  getDisplayPoint( &normalizedSample, &sample, &calibFactors );
  return normalizedSample;
}

getTouchSample10bit() 函数是取回实际的ADC值,然后代进getDisplayPoint(),取得校正之后的值。

这样的话,就能取回正确的屏幕坐标了。。 ^_^ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值