回答

收藏

emwin的触屏校正

#竞赛 #竞赛 4415 人阅读 | 0 人回复 | 2013-08-21

   使用emwin有一段时间了。刚开始接触的时候,就被它那华丽的界面所震住。以前一直想在stm32f103上跑,但是ram太小,跑不起来。最近终于自己移植emwin到f4上。但是有一点让我很不爽,就是触屏不太给力。刚开始我在网上找了一些例程进行研究,发现都不太理想。最终自己找到了一个算法(参考别人的,自己借了一些修改)
  算法如下:
          /*
*********************************************************************************************************
*        函 数 名: TOUCH_DataFilter
*        功能说明: 读取一个坐标值(x或者y)
*             连续读取XPT2046_READ_TIMES次数据,对这些数据升序排列,
*             然后去掉最低和最高XPT2046_LOST_VAL个数,取平均值
*********************************************************************************************************
*/
/* 读取次数 */
#define XPT2046_READ_TIMES    5
/* 丢弃值  */       
#define XPT2046_LOST_VAL      1                 
uint16_t TOUCH_DataFilter(uint8_t CMD)
{
        uint16_t i, j;
        uint16_t buf[XPT2046_READ_TIMES];
        uint16_t usSum;
        uint16_t usTemp;

        /* 读取READ_TIMES次数据*/
        for(i=0; i < XPT2046_READ_TIMES; i++)
        {
               
                        buf[i] =ADS_Read(CMD);       
               
        }
       
        /* 升序排列 */                                     
        for(i = 0; i < XPT2046_READ_TIMES - 1; i++)
        {
                for(j = i + 1; j < XPT2046_READ_TIMES; j++)
                {
                        if(buf[i] > buf[j])
                        {
                                usTemp = buf[i];
                                buf[i] = buf[j];
                                buf[j] = usTemp;
                        }
                }
        }
                  
        usSum = 0;

        /*求和 */
        for(i = XPT2046_LOST_VAL; i < XPT2046_READ_TIMES - XPT2046_LOST_VAL; i++)
        {
                usSum += buf[i];
        }
        /*求平均 */
        usTemp = usSum / (XPT2046_READ_TIMES - 2 * XPT2046_LOST_VAL);

        return usTemp;
}

/*
*********************************************************************************************************
*        函 数 名: TOUCH_ReadAdcXY
*        功能说明: 连续2次读取触摸屏IC,且这两次的偏差不能超过
*             ADC_ERR_RANGE,满足条件,则认为读数正确,否则读数错误.          
*             该函数能大大提高准确度
*********************************************************************************************************
*/
/* 误差范围 */  
uint8_t ADC_ERR_RANGE = 5;
uint8_t TOUCH_ReadAdcXY(int16_t *_usX, int16_t *_usY)
{
        uint16_t iX1, iY1;
        uint16_t iX2, iY2;
        uint16_t iX, iY;

        iX1 = TOUCH_DataFilter(CMD_RDY);
        iY1 = TOUCH_DataFilter(CMD_RDX);
        iX2 = TOUCH_DataFilter(CMD_RDY);
        iY2 = TOUCH_DataFilter(CMD_RDX);
       
        iX = TOUCH_Abs(iX1 - iX2);
        iY = TOUCH_Abs(iY1 - iY2);
       
        /* 前后两次采样在+-ERR_RANGE内 */  
    if ((iX <= ADC_ERR_RANGE) && (iY <= ADC_ERR_RANGE))
    {      
               
                if(g_ucGPIX == 1)
                {
                        *_usY = (iX1 + iX2) / 2;
                *_usX = (iY1 + iY2) / 2;               
                }
                else
                {
                        *_usX = (iX1 + iX2) / 2;
                *_usY = (iY1 + iY2) / 2;       
                }
       

        return 1;
    }
        else
        {
                return 0;
        }          
}

    算法很简洁,使用起来很方便。
    此外,在emwin的例程包里,还有一个是在程序中校准参数的例子。它能够很好的校正触屏。可以在程序开始的时候来进行校准。
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条