×
单片机 > 单片机程序设计 > 详情

mini2440硬件篇之ADC触摸屏

发布时间:2020-06-06 发布时间:
|

1.1. ADC知识

ADC(Analog to Digital Converter),可以接收8个通道的模拟信号输入,并将它们转换为10位的二进制。在2.5MHz的A/D转换时钟下,最大转化速率可达500KSPS(SPS:samples per second,每秒采样次数)。

1.2. 触摸屏硬件知识

触摸屏是当今最流行的一种人机交互接口,它被广泛地应用于手机等消费类电子产品中,目前这种技术有向PC机方向发展的趋势。基于原理的不同,触摸屏可以分为电阻式、电容式、表面声波式等。电阻式是应用较广的一种触摸屏,它的原理是通过测量横向和纵向的电阻值来获得触点的坐标。

1.3. 电阻式触摸屏工作原理原理 

触摸屏附着在显示器的表面,与显示器相配合使用,如果能测量出触摸点在屏幕上的坐标位置,则可根据显示屏上对应坐标点的显示内容或图符获知触摸者的意图。触摸屏按其技术原理可分为五类:矢量压力传感式、电阻式、电容式、红外线式、表面声波式,其中电阻式触摸屏在嵌入式系统中用的较多。电阻触摸屏是一块4层的透明的复合薄膜屏,如图2所示,最下面是玻璃或有机玻璃构成的基层,最上面是一层外表面经过硬化处理从而光滑防刮的塑料层,中间是两层金属导电层,分别在基层之上和塑料层内表面,在两导电层之间有许多细小的透明隔离点把它们隔开。当手指触摸屏幕时,两导电层在触摸点处接触。 

触摸屏的两个金属导电层是触摸屏的两个工作面,在每个工作面的两端各涂有一条银胶,称为该工作面的一对电极,若在一个工作面的电极对上施加电压,则在该工作面上就会形成均匀连续的平行电压分布。如图4所示,当在X方向的电极对上施加一确定的电压,而Y方向电极对上不加电压时,在X平行电压场中,触点处的电压值可以在Y+(或Y-)电极上反映出来,通过测量Y+电极对地的电压大小,便可得知触点的X坐标值。同理,当在Y电极对上加电压,而X电极对上不加电压时,通过测量X+电极的电压,便可得知触点的Y坐标。电阻式触摸屏有四线和五线两种。四线式触摸屏的X工作面和Y工作面分别加在两个导电层上,共有四根引出线,分别连到触摸屏的X电极对和Y电极对上。五线式触摸屏把X工作面和Y工作面都加在玻璃基层的导电涂层上,但工作时,仍是分时加电压的,即让两个方向的电压场分时工作在同一工作面上,而外导电层则仅仅用来充当导体和电压测量电极。因此,五线式触摸屏的引出线需为5根。 


1.4.  S3C2440触摸屏接口

SOC S3C2440的触摸屏接口是与ADC接口结合在一起的,框图如下:


转换速率:当PCLK=50MHz时,分频设为49,则10位的转换计算如下:

When the GCLK frequency is 50MHz and the prescaler value is 49,

A/D converter freq. = 50MHz/(49+1) = 1MHz

Conversion time = 1/(1MHz / 5cycles) = 1/200KHz = 5 us

This A/D converter was designed to operate at maximum 2.5MHz clock, so the conversion rate can go up to 500 KSPS.

触摸屏接口的模式有以下几种:

普通ADC转换模式

独立X/Y位置转换模式

自动X/Y位置转换模式

等待中断模式

我们主要接受触摸屏接口的等待中断模式和自动X/Y位置转换模式(驱动程序中会用到):

自动转换模式操作流程如下:触摸屏控制器自动转换X,Y的触摸位置,当转换完毕后将数据分别存放在寄存器ADCDAT0和ADCDAT1.并产生INT_ADC中断通知转换完毕。

等待中断模式:

Touch Screen Controller generates interrupt (INT_TC) signal when the Stylus is down. Waiting for Interrupt Modesetting value is rADCTSC=0xd3;  // XP_PU, XP_Dis, XM_Dis, YP_Dis, YM_En.

当触摸后,触摸屏控制器产生INT_TC中断,四个引脚设置应该为:

引脚

XP

XM

YP

YM

状态

PULL UP/XP Disable

Disable (初始值即是)

Disable

Enable

设置

1

0

1

1

当中断产生后,X/Y的位置数据可以选择独立X/Y位置转换模式,和自动X/Y位置转换模式进行读取,采用自动X/Y位置转换模式进行读取需要对我们已经设置的TSC寄存器进行更改,在原有的基础上或上S3C2410_ADCTSC_PULL_UP_DISABLE | S3C2410_ADCTSC_AUTO_PST | S3C2410_ADCTSC_XY_PST(0)。

数据转换完毕后,也会产生中断。

2. 芯片手册

3. mini2440电路图

4. S3C2440寄存器

ADCCON ADC控制寄存器

主要设置分频,通道选择,有8路(AIN0~AIN3 YM YP XM XP),启动A/D转换等。

ADCTSC 触摸屏控制寄存器

设置工作模式,普通ADC转换模式、独立X/Y位置转换模式、自动X/Y位置转换模式、等待中断模式。

ADCDLY 延迟寄存器

可以设置开始中断到真正开始A/D转换这段时间的延时长度,它的时钟源频率为3.68MHz。

ADCDAT0/ADCDAT1

X轴坐标值写入寄存器ADCDAT0的低10位中,Y轴坐标写入寄存器ADCDAT1的低10位中。

ADCUPDN 抬起/落下

触笔抬起/落下中断状态寄存器ADCUPDN的低2位能够判断触笔在何种状态下引起的中断。

touch.h


[cpp] view plain copy

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

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: touch.c  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:触摸屏驱动(中断方式). 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #ifndef __TOUCH_H__  

  12. #define __TOUCH_H__  

  13.   

  14. #define ADC_FREQ    2500000                 //==ADC转换频率2.5M  

  15. #define ADC_PRS     (50000000/ADC_FREQ-1)   //==ADC预分频值  

  16. #define ADC_DELAY   50000                   //==(1/50M)*50000=1 ms   

  17.   

  18. #define DBG_TOUCH_LEVEL     1  

  19.   

  20. /*函数声明*/  

  21. void TouchInit(void);  

  22.   

  23. #endif  


touch.c



[cpp] view plain copy

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

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: touch.c  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:触摸屏驱动(中断方式). 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #include "common.h"  

  12. #include "core.h"  

  13. #include "touch.h"  

  14.   

  15.   

  16. int xdata, ydata;   //==坐标数据  

  17.   

  18. /******************************************************************** 

  19. 函数功能:触摸屏中断函数。 

  20. 入口参数:无。 

  21. 返    回:无。 

  22. 备    注:无。 

  23. ********************************************************************/  

  24. static void __irq TouchIntHandler(void)  

  25. {  

  26.     static unsigned long ulSaveAdcdly;  

  27.   

  28.     rSRCPND |= BIT_ADC;         //清除这两个中断才能产生新的中断  

  29.     rINTPND |= BIT_ADC;  

  30.   

  31.     /*转换完成中断*/  

  32.     if( rSUBSRCPND & BIT_SUB_ADC)  

  33.     {  

  34.         rSUBSRCPND |= BIT_SUB_ADC;//清除子中断  

  35.   

  36.         while(!(rADCCON & 0x8000));        //check if EC(End of Conversion) flag is high, This line is necessary~!!  

  37.   

  38.         xdata = (rADCDAT0 & 0x3ff);  

  39.         ydata = (rADCDAT1 & 0x3ff);        //[0..9]做转换后的数据A  

  40.   

  41.         DbgPrintX( DBG_TOUCH_LEVEL, "\rx:%d;y:%d\n", xdata, ydata );  

  42.   

  43.         rADCTSC = 0xd3;    //Waiting for interrupt  

  44.         rADCTSC = rADCTSC|(1<<8); // Detect stylus up interrupt signal.  

  45.     }  

  46.   

  47.     /*笔按下中断*/  

  48.     if( rSUBSRCPND & (BIT_SUB_TC) )  

  49.     {  

  50.         rSUBSRCPND |= BIT_SUB_TC;//清除子中断  

  51.   

  52.         if( (!(rADCDAT0 & 0x8000)) && (!(rADCDAT1 & 0x8000)) )//笔是否按下  

  53.         {  

  54.             DbgPrintX( DBG_TOUCH_LEVEL, "\rStylus down\n" );  

  55.               

  56.             //自动连续X,Y坐标转换,xp不上拉  

  57.             rADCTSC = (1<<3 ) | (1<<2);  

  58.             ulSaveAdcdly = rADCDLY;             

  59.             rADCDLY = 40000;                //延时  (1/50M)*40000=0.8ms  

  60.   

  61.             //开始AD转换  

  62.             rADCCON |= 0x1;  

  63.             while( rADCCON & 0x1 );        //==检查启动是否完成  

  64.         }  

  65.         else   

  66.         {  

  67.             DbgPrintX( DBG_TOUCH_LEVEL, "\rStylus up\n" );  

  68.             rADCDLY = ulSaveAdcdly;  

  69.             //等待下次笔按下  

  70.             //设置触摸屏为等待中断模式,等待触摸屏被按下  

  71.             rADCTSC=0xd3;  

  72.         }  

  73.     }  

  74. }  

  75.   

  76.      

  77. /******************************************************************** 

  78. 函数功能:触摸屏初始化。 

  79. 入口参数:无。 

  80. 返    回:无。 

  81. 备    注:无。 

  82. ********************************************************************/   

  83. void TouchInit(void)  

  84. {  

  85.     rADCDLY = ADC_DELAY;                    //==(1/50M)*50000=1 ms  

  86.     rADCCON = ( ADC_PRS<<6 ) | (1<<14 );    //ADC频率2.5M  

  87.   

  88.     //==设置触摸屏为等待中断模式,等待触摸屏被按下  

  89.     rADCTSC=0xd3;  

  90.   

  91.     pISR_ADC=(unsigned int)TouchIntHandler;   //定义中断服务程序  

  92.     rINTMSK &= ~(BIT_ADC);        

  93.     rINTSUBMSK &= ~(BIT_SUB_TC);         

  94.     rINTSUBMSK &= ~(BIT_SUB_ADC);          

  95. }  




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机的抗干扰措施有哪些