概述:
ADC通过把输入的模拟信号进行采集,经过量化和编码后转换为对应的二进制数值,并输出。主要参数有:分辨率(位数)、量程、采样速率。通常高档单片机、嵌入式处理器都会把ADC集成在芯片内部。但是集成在芯片内部的ADC一般采样速率会比较低,高速ADC一般都是自己做一片芯片。用到过的有ADC9288可达到100MSa/S、ADC8D1010可达到1GSa/S的采样率【这里两款ADC都已经把采样和转换集成在一起】。
触摸屏是一张和屏幕大小一样透明的东西,和显示屏是分开的。通常有电阻屏、电容屏、红外屏和超声屏。电阻屏触摸需要按下,使得屏的上下短接,检测电压求坐标。电容屏是靠人体感应到静电的流通,电流由屏的四个角落提供,各个角所提供的电流和距离成正比,可依此计算坐标。红外屏和超声屏是靠障碍物的遮挡计算出障碍物的坐标。
S3C2440A ADC和触摸屏的概述:
S3C2440A的触摸屏是电阻式。
ADC功能框图如下:
可选作为ADC的输入信号有A[3:0]共8个模拟信号输入。
也可以用几个输入脚分时复用做触摸屏接口,具体看电路图设计部分。
寄存器简单描述
ADC控制寄存器ADCCON:
转换结束标志;
预分频允许与否,以及预分频数值;
输入通道选择;
模式选择;
读开始下一次ADC允许与否;
开始ADC转换;
ADC触摸屏控制寄存器ADCTSC:
YP、YM、XP、XM输出设置;
X/Y位置自动连续转换与否;
上拉开关允许与否(XP);
手动测量X/Y位置;
ADC开始或区间延时寄存器ADCDLY:
ADC从触针向下动作到开始转换的时间长(X转换时长、Y转换时长)=DELAY*时钟;【时钟为1/EXTCLK or 1/PCLK】
ADC转换数据寄存器ADCDAT0、ADCDAT1:
等待中断模式:触针向下还是抬起;
自动连续X位置和Y位置转换;
手动X位置和Y位置测量;
X位置转换值(包括普通ADC转换值)、Y位置转换值;
电路图设计
AIN0作为ADC的模拟输入,最简单的功能:
触摸屏接口:
TSXM、TSXP接触摸屏的X极,TSYM、TSYP接触摸屏的Y极。当X极两端TSXM、TSXP接电压值时,检测TSYM或者TSYP(此时两个管脚做ADC输入用)的电压,计算出X的坐标;换过来,当Y极两端TSYM、TSYP接电压值时,检测TSXM或者TSXP(此时两个管脚做ADC输入用)的电压,计算出Y的坐标。
实验程序设计及分析
设定ADC转换速率,之后启用ADC功能,判断转换是否开始并转换结束,返回ADC采集到的数据。
int ReadAdc(int ch)
{
int i;
static int prevCh=-1;
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel
if(prevCh!=ch)
{
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel
for(i=0;i<LOOP;i++); //delay to set up the next channel
prevCh=ch;
}
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
return ( (int)rADCDAT0 & 0x3ff );
}
ADC实现触摸屏接口功能:
设定转换时间、设定转换速率、设定触摸屏控制寄存器;剩下的功能是实现触摸屏中断,暂不分析。
void Test_Touchpanel(void)
{
rADCDLY=50000; //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value
rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
pISR_ADC = (int)AdcTsAuto;
rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear
rINTSUBMSK=~(BIT_SUB_TC);
rINTSUBMSK|=BIT_SUB_TC;
rINTMSK|=BIT_ADC;
}
|