ADC和TP接口
《嵌入式Linux应用完全开发手册》第2篇第14章总结归纳
本章目标
- 了解S3C2410/S3C2440 ADC和触摸屏的结构
- 了解电阻触摸屏的工作原理和等效电路图
- 了解S3C2410/S3C2440触摸屏控制器的多种工作方式
- 掌握S3C2410/S3C2440 ADC和触摸屏的编程方法
ADC和触摸屏硬件介绍和使用
S3C2410/S3C2440 ADC和触摸屏接口概述
S3C2410/S3C2440 的CMOS模数转换器(ADC,Analog to Digital Converter)可以接收8个通道的模拟信号输入,并将它们转换为10位的二进制数据。在2.5MHz的A/D转换时钟下,最大的转换速率可达500KSPS(samples per second,每秒采样的次数)。
S3C2410/S3C2440 都提供触摸屏的接口,不过有所不同。S3C2410的触摸屏接口向外提供4个控制信号引脚(nYPON、YMON、nXPON、XMON)和2个模拟信号输入引脚(AIN[7]、AIN[5])。这6个引脚通过4个晶体管与触摸屏的4个引脚相连。而S3C2440提供了与触摸屏直接相连的4个引脚,不在需要外接晶体管。
S3C2410/S3C2440 ADC和触摸屏接口有如下特性:
- 分辨率:10位
- 微分线性度误差:±1.0LSB
- 积分线性度误差:±2.0LSB
- 最大转换功率:500KSPS
- 低功耗
- 供电电压:3.3V
- 输入模拟电压范围:0-3.3V
- 片上采样保持功能
- 普通转换模式
- 分离的x/y轴坐标转换模式
- 自动(连续)x/y轴坐标转换模式
- 等待中断模式
ADC和触摸屏接口结构如图所示:
从上图可以知道,ADC和触摸屏接口中只有一个A/D转换器可以通过设置寄存器来选择对哪路模拟信号(多达8路)进行采样。图中有两个中断信号:INT_ADC、INT_TC,前者表示A/D转化器已经转换完毕,后者表示触摸屏被按下了。
对于S3C2410,在使用触摸屏时,AIN[7]和AIN[5]被用来测量XP、YP的电平,只剩下AIN[6]、AIN[4:0]共6个引脚被用于一般的ADC输入。对于S3C2440,在使用触摸屏时,引脚XP、XM、YP和YM被用于和触摸屏直接相连,只剩下AIN[3:0]共4个引脚用于一般的ADC输入;当不使用触摸屏时,XP、XM、YP和YM这4个引脚也可以用于一般的ADC输入。
S3C2410与触摸屏的连接比S3C2440复杂,需要增加几个外接晶体管,如下图所示:
S3C2410/S3C2440 ADC接口的使用方法
ADC的启动方式有两种:手工启动、读结果时就自动启动下一次转换。也有两种方法获知当前转换是否已经结束:查询状态位、转换结束时就发出中断。
ADC的操作只涉及3个寄存器:ADCCON、ADCTSC、ADCDAT0。下面介绍它们的用法,有关触摸屏的数据位将在下面的小节介绍。
ADCCON寄存器
名称 | 位 | 说明 |
---|---|---|
ECFLG | [15] | 只读,A/D转换结束标志。 0:正在转换。1:转换结束。 |
PRSCEN | [14] | 决定A/D转换器的时钟是否分频。 0:不使用。1:使用。 |
PRSCVL | [13:6] | 预分频系数,取值0-255:A/D时钟 = PCLK/(PRSCVL + 1)。 注意:A/D时钟必须小于PCLK的1/5。 |
SEL_MUX | [5:3] | 选择进行A/D转换的通道。 对于S3C2410,取值如下: 000:AIN 0; 001:AIN 1;010:AIN 2;011:AIN 3; 100:AIN 4;101:AIN 5;110:AIN 6;111:AIN 7(XP); 对于S3C2440,取值如下: 000:AIN 0; 001:AIN 1;010:AIN 2;011:AIN 3; 100:YM;101:YP;110:XM;111:XP; |
STDBM | [2] | 选择静态模式(Standby Mode)。 0:正常模式;1:静态模式。 |
READ_START | [1] | 读转换数据时是否启动下一次转换。 0:不启动;1:启动; |
ENABLE_START | [0] | 启动A/D转换(当READ_START为1时,此位无效)。 0:无作用;1:启动A/D转换(转换真正开始时,此位被清零)。 |
ADCDAT0寄存器
名称 | 位 | 说明 |
---|---|---|
UPDOWN | [15] | 对于触摸屏,使用“等待中断模式”时, 0:触摸屏被按下;1:触摸屏没有被按下。 |
AUTO_PST | [14] | 决定是否使用自动(连续)x/y轴坐标转换模式。 0:正常转换;1:自动(连续)x/y坐标轴转换。 |
XY_PST | [13:12] | 手动x/y轴坐标转换模式。 00:无操作;01:x轴坐标转换; 10:y轴坐标转换;11:等待中断模式。 |
Reserved | [11:10] | 保留 |
XPDATA(普通ADC转换数据) | [9:0] | x轴坐标转换数据值(或普通ADC转换数据值) 数值范围:0-0x3FF |
ADC的使用分4个步骤:
- 设置ADCCON寄存器,选择信号输入通道,设置A/D转换器的时钟。
使能A/D转化器时钟的预分频功能时,A/D时钟的计算公式如下:1
2A/D时钟 = PCLK / (PRSCVL + 1)
注:A/D时钟最大为 2.5MHz,并且应该小于PCLK的1/5。 - 设置ADCTSC寄存器,使用设为普通转换模式,不使用触摸屏功能。
ADCTSC寄存器多用于触摸屏,对于普通ADC,使用它的默认值即可,或设置其位[2]为0。ADCTSC寄存器的格式在下面的小节介绍。 - 设置ADCCON寄存器,启用A/D转换。
如果设置READ_START位,则读转换数据(读ADCDAT0寄存器)时即启动下一次转换;否则,可以通过设置ENABLE_START位来启动A/D转换。 - 转换结束时,读取ADCDAT0寄存器获得数值。
如果使用查询方式,则可以不断读取ADCCON寄存器的ECFLG位来确定转换是否结束;否则可以使用INT_ADC中断,发生INT_ADC中断时表示转换结束。
触摸屏原理及接口
电阻触摸屏的原理
触摸屏已经在现实生活中大量使用,种类也有很多,比如超声波触摸屏、红外触摸屏、电容触摸屏、电阻触摸屏等。电阻触摸屏由于造价低廉,在电气上可以直接接入用户的系统而得到大量使用。电阻触摸屏有几种类型,比如“四线”、“五线”、“八线”。线越多,精度就越高,温度漂移也越少,但是基本的操作是一样的。它本质是个电阻分压器,将矩形区域中的触摸点(x,y)的物理位置转换为代表x坐标和y坐标的电压。
S3C2410/S3C2440的触摸屏接口可以驱动四线电阻触摸屏,四线电阻触摸屏的等效电路如下图所示:
图中粗黑线表示相互绝缘的两层导电层,当按压时,它们在触点外相连;不同的触点在x,y方向上的分压值不一样,将这两个电压值经过A/D转换后即可得到x,y坐标。下面根据等效电路图说明触摸屏的工作过程。
- 平时触摸屏没有被按下时,等效电路如图14.5所示。
S4、S5闭合,S1、S2、S3断开,即YM接地、XP上拉、XP作为模拟输入(对CPU而言)、YP作为模拟输入(对CPU而言)、XM高阻。
平时触摸屏没有按下时,由于上拉电阻的关系,Y_ADC为高电平;当x轴和y轴受挤压而接触导通之后,Y_ADC的电压由于联通到y轴接地而变为低电平,此此低电平可作为中断触发信号来通知CPU发生“Pen Down”事件。在S3C2410/S3C2440中,称为等待中断模式。 - 采样X_ADC电压,得到x坐标,等效电路如图14.6所示。
S1、S3闭合,S2、S4、S5断开,即XP接上电源、XM接地、YP作为模拟输入(对CPU而言)、YM高阻、XP禁止上拉。这时,YP即X_ADC就是x轴的分压点,进行A/D转化后得到x坐标。 - 采样Y_ADC电压,得到y坐标,等效电路如图14.7所示。
S2、S4闭合,S1、S3、S5断开,即YP接上电源、YM接地、XP作为模拟输入(对CPU而言)、XM高阻、XP禁止上拉。这时,XP即Y_ADC就是y轴的分压点,进行A/D转换后得到y坐标。
S3C2410/S3C2440触摸屏接口
与上面描述的触摸屏工作过程的3个步骤对应,触摸屏控制器也有4种工作模式。
- 等待中断模式(Waiting for Interrupt Mode)
设置ADCTSC寄存器为0xD3即可令触摸屏控制器处于这种模式。这时,它在等待触摸屏按下。当触摸屏被按下时,触摸屏控制器将发出INT_TC中断信号,这时触摸屏控制器要转入以下两种工作模式中的一种,以读取x、y坐标。
对于S3C2410,当触摸屏按下或松开的时候,都产生INT_TC中断信号。
对于S3C2440,可以设置ADCTSC寄存器的位[8]为0或1时,表示等待Pen Down中断或Pen Up中断。 - 分离的x/y轴坐标转换模式
这分别对应上述触摸屏工作过程的第2、3步骤。设置ADCTSC寄存器为0x69进入x轴坐标转换模式,x坐标值转换完毕后被写入ADCDAT0,然后发出INT_ADC中断;相似的,设置ADCTSC寄存器为0x9A进入y轴坐标转换模式,y坐标轴转换完毕后被写入ADCDAT1,然后发出INT_ADC中断。 - 自动(连续)x/y轴坐标转换模式
上述触摸屏工作过程的第2、3步骤可以合成一个步骤,设置ADCTSC寄存器值为0x0C,进入自动(连续)x/y轴坐标转换模式,触摸屏控制器就会自动转换x、y坐标值,并分别写入ADCDAT0、ADCDAT1寄存器中,然后发出INT_ADC中断。 - 普通转换模式
不使用触摸屏时,触摸屏控制器处于这种模式。在这种模式下,可以通过设置ADCCON寄存器启动普通的A/D转换,转换完成时数据被写入ADCDAT0寄存器中。
ADCTSC寄存器被用来选择触摸屏的工作模式,下面介绍ADCTSC寄存器。名称 位 说明 Reserved/UD_SEN [8] 对于S3C2410,此位必须为0。
对于S3C2440,此位表示将检测哪类中断(触点按下、触点松开)。
0:按下;1:松开。YM_SEN [7] 对于S3C2410,用于选择YMON的输出值。
0:YMON输出0(YM:高阻);1:YMON输出1(YM:GND)
对于S3C2440,YM使能开关。
0:YM驱动禁止(高阻);1:YM驱动使能(接地)YP_SEN [6] 对于S3C2410,用于选择nYPON的输出值。
0:nYPON输出0(YP:外部电压);1:nYPON输出1(YM接AIN[5])
对于S3C2440,YP使能开关。
0:YP驱动禁止(接外部电压);1:YP驱动使能(接模拟输入)XM_SEN [5] 对于S3C2410,用于选择XMON的输出值。
0:XMON输出0(XM:高阻);1:XMON输出1(XM:GND)
对于S3C2440,XM使能开关。
0:XM驱动禁止(高阻);1:XM驱动使能(接地)XP_SEN [4] 对于S3C2410,用于选择nXPON的输出值。
0:nXPON输出0(XP:外部电压);1:nXPON输出1(XM接AIN[7])
对于S3C2440,XP使能开关。
0:XP驱动禁止(接外部电压);1:XP驱动使能(接模拟输入)PULL_UP [3] XP上拉使能。
0:使能上拉;1:禁止上拉AUTO_PST [2] 是否使用自动(连续)x/y轴坐标转换模式。
0:普通转换模式 1:自动(连续)x/y轴坐标转换模式XY_PST [1:0] 手动测量x、y轴坐标。
00:无操作模式;01:测量x轴坐标;
10:测量y轴坐标;11:等待中断模式
注:
①处于等待中断模式时,XP_SEN必须设为1(XP接模拟输入),PULL_UP必须设为0(使能上拉)。
②AUTO_PST设为1时,必须处于自动(连续)x/y轴坐标转换模式下。
对于S3C2410,当触摸控制器处于等待中断模式时,触摸屏被按下时,可以不断发出INT_TC中断信号,以便进入自动(连续)x/y轴转换模式转换x、y坐标。发出中断信号的间隔可以通过ADCDLY寄存器来设置。
对于S3C2440,当CPU处于休眠模式下,触摸屏被按下时可以不断发出INT_TC中断信号以唤醒CPU。发出中断信号的间隔可以通过ADCDLY寄存器来设置。
另外,对于普通转换模式、分离的x/y轴坐标转换模式、自动(连续)x/y轴坐标转换模式,都可以通过ADCDLY来设置采样的延时时间。
ADCDLY寄存器格式如下表所示,在等待中断模式时,延时时钟为X-tal(3.68MHz),其他情况为PCLK。
名称 | 位 | 说明 |
---|---|---|
DELAY | [15:0] | 采样的延时值,或发出中断的间隔值 |
ADCDAT1寄存器的格式如下表所示。它与ADCDAT0寄存器格式相似,ADCDAT1寄存器中保存y坐标值;而ADCDAT0寄存器中保存普通A/D转换的值或x坐标值。
名称 | 位 | 说明 |
---|---|---|
UPDOWN | [15] | 对于触摸屏,使用“等待中断模式”时如下。 0:触摸屏被按下;1:触摸屏没有被按下 |
AUTO_PST | [14] | 决定是否使用自动(连续)x/y坐标转换模式。 0:正常转换;1:自动(连续)x/y轴坐标转换 |
XY_PST | [13:12] | 手动x/y轴坐标转换模式 00:无操作;01:x轴坐标转换 10:y轴坐标转换 11:等待中断模式 |
Reserved | [11:10] | 保留 |
YPDATA | [9:0] | x轴坐标转换数据值 |
ADC和触摸屏操作实例
硬件设计
模拟输入引脚AIN0、AIN1外接可调电阻器,电路图如下图所示:
图中的两个电阻器是可调电阻器,程序通过AIN0、AIN1这两个通道采集、转换电压值。
触摸屏的接口是标准的,它的电路图如图14.4所示。
程序设计
测试ADC时,程序不断测量AIN0、AIN1的电压,并在串口上显示出来。测试触摸屏时,只是测试触笔按下、松开的事件,并且把按下时采集到的x、y坐标打印出来,它们只是原始的数据。
主要文件为adc_ts.c。主要接口为adc_ts.c中的Test_Adc、Test_Ts函数。
测试ADC的代码详解
ADC主入口函数Test_Adc
1 | /* |
第12、13行先调用ReadAdc函数发起A/D转换,返回10位转换值(最大值为1023);然后计算实际电压值(S3C2410/S3C2440模拟信号最大电压3.3V)。
ReadAdc 函数:设置、启动ADC,获取转换结果
1 | /* |
程序流程与前面介绍的ADC的4个步骤一一对应。
- 第10行选择模拟通道,使能预分频功能,设置A/D转化器的时钟。
本程序中,PCLK为50MHz,所以A/D转换器的时钟为50MHz/(49 + 1) = 1MHz,小于最大A/D时钟2.5MHz。 - 第13行清除ADCTSC寄存器位[2],设为普通转换模式,ADCTSC寄存器格式上文有表格描述。
- 第16行设置ADCCON寄存器位[0],启动A/D转换。
ADC的启动有两种方式,如果使用“读启动”方式(此时ADCCON寄存器位[1]被设为1),则读一下ADCDAT0寄存器即可启动;如果使用手动方式,设置ADCCON寄存器位[0]即可启动。 - 第22行循环检测ADCCON的位[15],直到它为1为止,这表示A/D转换结束。
也可以使用中断方式,当A/D转换结束时,ADC会发出INT_ADC中断信号。 - 最后,第25行读取ADCDAT0即可得到转换的数据(低10位为有效数据)。
测试触摸屏的代码详解
触摸屏的操作稍微复杂,下面将程序流程图和触摸屏控制的状态转换图合并在一起,以便代码分析。
触摸屏的主入口函数Test_Ts
Test_Ts函数进行初始化、开启ADC中断之后,就不再参与触摸屏的操作,这都通过中断服务程序来完成。
1 | /* |
第6行设置ADC中断的处理函数,第7-9行开启ADC中断。ADC中断有两类:INT_TC和INT_ADC,前者表示触摸屏被按下或松开,后者表示A/D转换结束。
第12行使能预分频功能,设置A/D转化器的时钟为PCLK/(49 + 1);本程序中,PCLK为50MHz,所以A/D转换器的时钟为50MHz/(49 + 1) = 1MHz,小于最大A/D时钟2.5MHz。
第18行设置延时时间。
第20行调用wait_down_int()宏,令触摸屏控制器进入“等待中断模式”,等待触摸屏被按下。
第22行等待串口的输入,以退出测试。等待期间通过中断来驱动触摸屏的操作。
第25-28行屏蔽ADC中断。
wait_down_int、wait_up_int、mode_auto_xy都是宏定义,它们用于设置触摸屏进入“等待Pen Down中断模式”、“等待Pen Up中断模式”、“自动(连续)x/y轴坐标转换模式”。
需要注意以下几点:
- 对于S3C2410,ADCTSC的位[8]属于保留位,只能设为0;当处于“等待中断模式”时,无论是“Pen Down”中断还是“Pen Up”中断都可以检测到。
- 对于S3C2440,ADCTSC的位[8]为0、1时分别表示等待Pen Down中断或者Pen Up中断。
- 要进入“自动(连续)x/y坐标轴坐标转换模式”,XP、XM、YP、YM的状态不必理会,触摸屏在采样时会自动控制它们。
上述宏定义如下:
1 | /* |
触摸屏中断处理函数:转换触摸屏的工作模式
执行Test_Ts函数之后,触摸屏控制器处于“等待Pen Down中断模式”。这时,如果按下触摸屏,则发生INT_TC中断,进入AdcTsIntHandle中断处理函数。它很简单,只是判断当前中断时INT_TC还是INT_ADC,然后分别调用他们的中断服务程序。
1 | /* |
INT_TC的中断服务程序Isr_Tc代码如下:
1 | /* |
第7行首先判断是“Pen Down”还是“Pen Up”中断,如果是“Pen Up”中断,表示触摸完成,在第9行通过wait_down_int()宏令触摸屏控制器进入“等待Pen Down中断模式”,等待下一次操作。
如果是“Pen Down”中断,则在第13行通过mode_auto_xy()宏令触摸屏控制器进入“自动(连续)x/y轴坐标转换模式”,然后在20行启动A/D转换。也可以使用“分离的x/y轴坐标转换模式”手动的分别转换x坐标、y坐标。
第24-26行清除INT_TC中断。
在ADC中断处理函数中获取x、y坐标
在“自动(连续)x/y轴坐标转换模式”下,x、y坐标都转换完毕后,产生INT_ADC中断,进入AdcTsIntHandle中断处理函数,它进而调用INT_ADC的中断服务程序Isr_Adc,代码如下:
1 | /* |
首先,第9行从ADCDAT0、ADCDAT1寄存器中读出x、y的值,并打印出来。然后,通过第13(S3C2410)、18(S3C2440)行进入“等待Pen Up中断模式”,等待触摸屏松开。S3C2410的触摸屏控制器既等待Pen Down中断,又等待Pen Up中断;S3C2440的触摸屏控制器可以分开设置:等待被按下或(和)等待被松开。
最后,第22-24行清除ADC中断。