mini2440硬件篇之ADC触摸屏

1.1. ADC知识

ADCAnalog to Digital Converter),可以接收8个通道的模拟信号输入,并将它们转换为10位的二进制。在2.5MHzA/D转换时钟下,最大转化速率可达500KSPSSPSsamples 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

/*******************************************************************
 * Copyright (C),2011-2012, XXX.
 * FileName: touch.c 
 * Author:HuangYinqing
 * Version:1.0
 * Date::2012-04-22
 * Description:触摸屏驱动(中断方式).
 * Function List:
 * History:
 ******************************************************************/
#ifndef __TOUCH_H__
#define __TOUCH_H__

#define ADC_FREQ 	2500000					//==ADC转换频率2.5M
#define ADC_PRS		(50000000/ADC_FREQ-1)	//==ADC预分频值
#define ADC_DELAY	50000					//==(1/50M)*50000=1 ms 

#define DBG_TOUCH_LEVEL		1

/*函数声明*/
void TouchInit(void);

#endif

touch.c

/*******************************************************************
 * Copyright (C),2011-2012, XXX.
 * FileName: touch.c 
 * Author:HuangYinqing
 * Version:1.0
 * Date::2012-04-22
 * Description:触摸屏驱动(中断方式).
 * Function List:
 * History:
 ******************************************************************/
#include "common.h"
#include "core.h"
#include "touch.h"


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

/********************************************************************
函数功能:触摸屏中断函数。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
static void __irq TouchIntHandler(void)
{
    static unsigned long ulSaveAdcdly;

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

	/*转换完成中断*/
	if( rSUBSRCPND & BIT_SUB_ADC)
	{
		rSUBSRCPND |= BIT_SUB_ADC;//清除子中断

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

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

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

		rADCTSC = 0xd3;    //Waiting for interrupt
		rADCTSC = rADCTSC|(1<<8); // Detect stylus up interrupt signal.
	}

	/*笔按下中断*/
	if( rSUBSRCPND & (BIT_SUB_TC) )
	{
		rSUBSRCPND |= BIT_SUB_TC;//清除子中断

		if( (!(rADCDAT0 & 0x8000)) && (!(rADCDAT1 & 0x8000)) )//笔是否按下
		{
			DbgPrintX( DBG_TOUCH_LEVEL, "\rStylus down\n" );
			
			//自动连续X,Y坐标转换,xp不上拉
			rADCTSC = (1<<3 ) | (1<<2);
			ulSaveAdcdly = rADCDLY;           
			rADCDLY = 40000;                //延时  (1/50M)*40000=0.8ms

			//开始AD转换
			rADCCON |= 0x1;
			while( rADCCON & 0x1 );        //==检查启动是否完成
		}
	    else 
		{
			DbgPrintX( DBG_TOUCH_LEVEL, "\rStylus up\n" );
			rADCDLY = ulSaveAdcdly;
			//等待下次笔按下
			//设置触摸屏为等待中断模式,等待触摸屏被按下
			rADCTSC=0xd3;
		}
	}
}

   
/********************************************************************
函数功能:触摸屏初始化。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/ 
void TouchInit(void)
{
	rADCDLY = ADC_DELAY;                	//==(1/50M)*50000=1 ms
	rADCCON = ( ADC_PRS<<6 ) | (1<<14 );	//ADC频率2.5M

    //==设置触摸屏为等待中断模式,等待触摸屏被按下
    rADCTSC=0xd3;

	pISR_ADC=(unsigned int)TouchIntHandler;   //定义中断服务程序
	rINTMSK &= ~(BIT_ADC);      
	rINTSUBMSK &= ~(BIT_SUB_TC);       
	rINTSUBMSK &= ~(BIT_SUB_ADC);        
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值