一、电阻式触摸屏工作原理原理
1,电阻式触摸屏实物
触摸屏附着在显示器的表面,与显示器相配合使用,如果能测量出触摸点在屏幕上的坐标位置,则可根据显示屏上对应坐标点的显示内容或图符获知触摸者的意图。触摸屏按其技术原理可分为五类:矢量压力传感式、电阻式、电容式、红外线式、表面声波式,其中电阻式触摸屏在嵌入式系统中用的较多。
为了防止触摸屏和LCD混淆,来张实物图,这就是我们要了解在四线触摸屏,咋一看就是一片一玻璃,下面我们一点一点分析,看它是如何工作的
2,电阻式触摸屏结构
如上图所示,电阻触摸屏是一块4层的透明的复合薄膜屏,触摸屏由两层塑料薄膜组成,各薄膜层上均涂有一层导电金属(通常是氧化铟锡),中间的空气间隙将二者分开。如下图所示,外面两层白色的,上面我软薄膜,下面白色为玻璃基板,中间两层分别为X、Y两个透明电极层。由上图可知,电阻触摸屏在最上面的触摸屏是软的,所以也称为软屏(相对于电容触摸屏为硬屏)
2,电阻式触摸屏如何得到坐标点
下面这个示意图更比较明确:如果有点按下,如下,X+为VDD,X-为GND,Y+为AD转化,Y-为高阻状态。这样可以测出触点X轴的AD值,同样也可以测出这点Y轴的AD值。
如果上面不太明白的话,再来一个比较简易理解的。等效电路如下所示,电阻式触摸屏工作的核心为:当在X方向的电极对上施加一确定的电压,而Y方向电极对上不加电压时,在X平行电压场中,触点处的电压值可以在Y+(或Y-)电极上反映出来,通过测量Y+电极对地的电压大小,便可得知触点的X坐标值。同理,当在Y电极对上加电压,而X电极对上不加电压时,通过测量X+电极的电压,便可得知触点的Y坐标。得到(X,Y)就可以得到一个点的坐标值了。
通过上面我们了解了电阻式触摸屏工作原理,坐标位置是如何取得的。
二. 在S3C2440中的触摸屏接口
转换速率:当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(放X坐标)和ADCDAT1(放Y坐标).并产生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)。
数据转换完毕后,也会产生中断。
三 寄存器
1 . ADCTSC 寄存器
2 . ADCDLY
3.ADCCON与ADCDAT0,1看另一篇文章。
代码如下:
#defineGLOBAL_CLK1
#include
#include
#include
#include
#include
#include
#include
#include
#include
volatile
void
{
U32
if
{
Uart_Printf("\nStylus
rADCTSC
}
else
{
Uart_Printf("\nStylus
}
rADCTSC
saveAdcdly
rADCDLY
rADCCON
while
while
while
xdata
ydata
//Check
rSUBSRCPND
ClearPending(BIT_ADC);
rINTSUBMSK
rINTMSK
rADCTSC
rADCTSC
while
{
if
{
Uart_Printf("Stylus
break;
}
}
Uart_Printf("count=%d
rADCTSC
rSUBSRCPND
rINTSUBMSK
ClearPending(BIT_ADC);
}
void
{
rADCDLY
rADCCON
Uart_Printf("\n[ADC
rADCTSC
pISR_ADC
rINTMSK
rINTSUBMSK
Uart_Printf("\nType
Uart_Printf("\nStylus
Uart_Getch();
rINTSUBMSK
rINTMSK
Uart_Printf("[Touch
}
void
{
MMU_Init();//初始化内存,实现内存地址重定向
AdcTs_Test();
while(1);
}