微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 四 ARM9(S3C2440)的ADC和触摸屏控制——理论知识

四 ARM9(S3C2440)的ADC和触摸屏控制——理论知识

时间:11-27 来源:互联网 点击:
概述

10 位CMOS ADC(模/数转换器)是一个8 通道模拟输入的再循环类型设备。其转换模拟输入信号为10 位二
进制数字编码,最大转换率为2.5MHz A/D 转换器时钟下的500 KSPS。A/D 转换器支持片上采样-保持功能和掉电
模式的操作。
触摸屏接口可以控制/选择触摸屏X、Y 方向的引脚(XP,XM,YP,YM)的变换。触摸屏接口包括触摸屏引
脚控制逻辑和带中断发生逻辑的ADC 接口逻辑。

触摸屏接口模式
1. 普通转换模式
单转换模式是最合适的通用ADC 转换。此模式可以通过设置ADCCON(ADC 控制寄存器)初始化并且通过读写
ADCDAT0(ADC 数据寄存器0)就能够完成。
2. 分离的X/Y 方向转换模式
触摸屏控制器可以工作在两个转换模式之一。方向转换模式如下方法操作。X 方向模式写X 方向转换数据到
ADCDAT0,故触摸屏接口产生中断源给中断控制器。Y 方向模式写Y 方向转换数据到ADCDAT1,故触摸屏接口产
生中断源给中断控制器。
3. 自动(顺序)X/Y 方向转换模式
自动(顺序)X/Y 方向转换模式操作如下。触摸屏控制器顺序变换触摸X 方向和Y 方向。在自动方向转变模式中触摸
控制器在写入X 测量数值到ADCDAT0 和写入Y 测量数值到ADCDAT1 后,触摸屏接口产生中断源给中断控制器。
4. 等待中断模式
当笔尖落下时触摸屏控制器产生中断(INT_TC)信号。等待中断模式设置值为rADCTSC=0xd3; // XP_PU,XP_Dis,
XM_Dis,YP_Dis,YM_En
触摸屏控制器产生中断信号(INT_TC)后,必须清除等待中断模式。(XY_PST 设置到无操作模式)
待机模式
当ADCCON [2]被设置为1时激活待机模式。此模式中,停止A/D 转换操作并且ADCDAT0、ADCDAT1 寄存
器包含的是先前转换的数据。

寄存器的功能可以看一下数据手册

下面是结合FL2440开发板的触摸屏操作实例:

触摸屏工作流程以及程序设计流程:
一、触摸屏初始化:
1、设置触摸屏接口为中断等待模式(ADCTSC寄存器),等待触摸笔按下
2、清除源挂起寄存器(SRCPND)、中断挂起寄存器(INTPND)、子源挂起寄存器

(SUBSRCPND)
3、程序入口函数,关中断屏蔽寄存器和子中断屏蔽寄存器(INTMSK,INTSUBMSK),中断

模式和中断优先级默认即可
二、触摸屏中断服务子程序:
一)触摸笔按下中断
4、如果中断发生,设置x,y坐标为自动转换模式
5、启动AD转换,然后检测AD转换是否启动
6、检测AD转换是否结束,若结束,获取x,y坐标的值
7、对几个寄存器写1清零,防止反复发生中断(这里的中断是笔尖按下中断)
二)触摸笔抬起中断
8、设置触摸屏即可为等待中断模式,等待触摸笔抬起(ADCTSC,关键是要设置触摸

笔抬起中断信号)
9、如果发生中断,不做任何操作,只打印出一句触摸笔抬起中断信息
10、触摸笔抬起之后,把得到的x,y坐标值发送给PC机,显示出具体数值
三)再次设置触摸屏为等待中断模式,等待下次触摸屏被按下

#include"2440addr.h"
#include"def.h"
//void Touch_Screen_Off(void);
int key=0,xdata,ydata;
void __irq ADC_ISR(void) ;
void ledcontrol();
void Touch_Screen_Init(void)
{
rADCDLY=50000;//Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
// Enable Prescaler=39,Prescaler A/D converter freq. = 50 MHz/(39+1) = 1.25MHz
//Conversion time = 1/(1.25MHz / 5cycles) = 1/250 kHz = 4 us
//AIN0,Normal,Disable read start,No operation

rADCCON = (1<14)|(39<6)|(0<3)|(0<2)|(0<1)|(0);
//YM=GND,YP=AIN5,XM=Hi-z,XP=AIN7,XP pullup En,Normal ADC,Waiting for interrupt mode

rADCTSC = (0<8)|(1<7)|(1<6)|(0<5)|(1<4)|(0<3)|(0<2)|(3);

pISR_ADC= (unsigned)ADC_ISR; //中断服务函数地址赋给中断指针


ClearSubPending(BIT_SUB_TC);//清子挂起寄存器
ClearSubPending(BIT_SUB_ADC);
ClearPending(BIT_ADC);//清挂起寄存器
EnableSubIrq(BIT_SUB_TC); //使能子中断
EnableIrq(BIT_ADC);//使能中断
}

void __irq ADC_ISR(void)
{

U32 saveAdcdly;
if(rADCDAT0&0x8000)//顺序X 方向、Y 方向测量
{
rADCTSC&=0xff;// Set stylus down interrupt bit
}

rADCTSC=(1<3)|(1<2);//Pull-up disable, Seq. X,Y postion measure.
saveAdcdly=rADCDLY;
rADCDLY=40000;//Normal conversion mode delay about (1/50M)*40000=0.8ms

rADCCON|=0x1;//start ADC

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

while(!(rSRCPND & (BIT_ADC)));//check if ADC is finished with interrupt bit

xdata=(rADCDAT0&0x3ff);//读取x坐标数据
ydata=(rADCDAT1&0x3ff);//读取y坐标数据

//YH 0627, To check Stylus Up Interrupt.
rSUBSRCPND|=BIT_SUB_TC;//清除相应的寄存器
ClearPending(BIT_ADC);
rINTSUBMSK=~(BIT_SUB_TC);
rINTMSK=~(BIT_ADC);

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top