18.3.1 触摸屏的分类触摸屏作为一种新型的输入设备,是目前最方便、最自然的一种人机交互方式。触摸屏应用范围非常广泛,在银行、办证大厅等公共信息场所,我们都可以看到触摸屏的应用实例。 触摸屏英文为TouchPanel,触摸屏相对键盘而言,操作更方便,适用人群更广,而且触摸屏具有坚固耐用、反应速度快、节省空间、易于交流等许多优点。 利用触摸屏,DSP嵌入式系统和用户之间的交流只需要用手指轻轻地碰触摸屏上面的图形或文字,即可实现人机交互,从而使人机交互更为直截了当,简化了以往复杂烦琐的人机交互方式,这种技术大大方便了那些不懂或者不熟练键盘输入的用户。 当面对一个触摸屏时,只需要用手指或专门的手写笔来触摸屏幕,触摸屏就会感知我们的触摸位置,并转换成坐标告诉CPU,这样CPU就知道我们现在在点击什么图片,在进行什么操作。 触摸屏一般分为4种:电阻式、电容式、红外式和超声波式。 1.电阻式触摸屏 该触摸屏利用压力引发电阻变化而进行控制。电阻式触摸屏的表面覆盖着一层和显示屏幕连接非常紧密的电阻薄膜,当手指或手写笔触摸屏幕时,电阻薄膜在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生相应信号,触摸屏控制器就会识别该信号并计算出坐标,送至CPU。 电阻式触摸屏一般分为四线制、五线制和八线制,显示越多,该触摸屏能达到的精度也就越高。在以下的应用实例中,我们会以四线制为例,讲述电阻式触摸屏的应用方法。 2.电容式触摸屏 该触摸屏是利用人体的电流感应引起电容变化而进行工作的。当手指触摸在屏上时,由于人体电场,用户和触摸屏表面形成一个耦合电容,对于高频电流来说,电容相当于导体,于是手指从接触点吸走一个很小的电流。这个电流分别从触摸屏四角上的传感器中流出,并且流经这4个传感器的电流与手指到四角的距离成正比,控制器通过对这4个电流比例的精确计算,得出触摸点的位置。 电容式触摸屏对于外界干扰以及每个用户手指情况的不同(干湿度、肤质等),有着不同程度的误差。 3.红外式触摸屏电阻式、电容式触摸屏都属于接触式触摸屏,也就是说,感应触摸点的传感器部分和触摸笔直接接触的。这样的设计,至少在物理上、机械上增加了磨损等因素。而下面将要介绍两种常见的非接触式触摸屏,也就是说,感应触摸点的传感器和触摸笔不是直接接触的。 首先介绍红外式触摸屏。红外式触摸屏是利用平面上横纵方向上布满了红外线矩阵来检测是否有触摸点,并计算出用户的触摸点位置。红外式触摸屏在触摸屏的4条边上排布了红外发射管和红外接收管,当没有触摸点产生时,红外线发送/接收正常;而一旦有触摸点产生,就阻断了红外线,于是红外接收器就会感知到触摸点的产生并定位出触摸点的位置。 由于不像电阻式、电容式触摸屏有直接的物理接触,红外式触摸屏减少了机械磨损,提高了使用寿命。但对外界光照条件依赖较大,由于太阳光中也含有红外线,所以,不同的光照条件,对其影响较大。 4.超声波触摸屏和红外式触摸屏一样,超声波触摸屏也是非接触式触摸屏。超声波触摸屏利用超声波遇到物体会反射的原理,在触摸屏上安装超声波发生器和接收器,若触摸屏上没有物体,也就是没有触摸点时,超声波接收良好;而一旦有手指或触摸笔产生了触摸点,超声波就会被阻断,于是超声波接收器就接到信号,识别相应的坐标。 由于超声波触摸屏,不需要像电容式、电阻式触摸屏那样在LCD上构建一个膜式平面,所以,超声波触摸屏透光度好,LCD清晰度高,而且减少了像触摸笔和触摸屏那样的物理接触,减少了机械磨损。 18.3.2 AD7843构架引脚图下面来介绍四线制电阻式触摸屏的应用实例。首先讲解四线制电阻式触摸屏的控制芯片——AD7843。 AD7843是美国AD公司出品的一款针对四线制电阻式触摸屏的A/D转换芯片,广泛应用于PDA(个人数字助理)、手持设备等领域。 AD7843的特性如下: 四线制触摸屏接口; 最大转换速度:125KSPS; 低功耗设计:1.37mW(采样速度为125KSPS、工作电压为3.6V); 单电源供电:2.2~5.25V; 高速SPI串行接口; 可编程的分辨率:8位和12位; 待机模式下最大1μA电流; 16引脚QSOP或TSSOP封装。 1.AD7843原理框图如图18-11所示,AD7843的X+、X-、Y+、Y-是四线制电阻的输入引线,经过内部多路选择开关之后,进入A/D转换部分,计算出阻值之后,数据通过SPI接口输出。 
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1102"> </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1100"> 采样保持 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1065"> </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1064"> BUSY </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1063"> DCLK </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1062"> DOUT </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1061"> DIN </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1060"> +VCC </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1059"> GND </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1058"> </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1057"> +VCC </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1056"> VREF </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1055"> IN4 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1054"> IN3 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1053"> Y- </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1052"> Y+ </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1051"> X- </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1050"> X+ </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1049"> SAR+ADC 控制逻辑 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1048"> DAC </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1047"> SPI接口 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1046"> 基准电压输入 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1045"> 4路变1 路多通 道开关 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1044"> 触摸笔 中断输入 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1043"> 触摸屏 四线输入 </DIV> |
图18-11 AD7843的内部原理框图 2.AD7843引脚分布图及引脚定义AD7843引脚分布图如图18-12所示。

图18-12 AD7843引脚分布图 AD7843各个引脚的用途说明如表18-3所示。 表18-3 AD7843各个引脚的用途说明 引 脚 号 | 名 称 | 用 途 | 1、10 | VCC | 电源输入端。输入范围为2.2~5.25V,这两个引脚可以直接接在一起 | 2 | X+ | X+位置输入。ADC输入通道1 | 3 | Y+ | Y+位置输入。ADC输入通道2 | 4 | X- | X-位置输入 | 5 | Y- | Y-位置输入 | 6 | GND | 模拟地 | 7 | IN3 | 辅助输入1。ADC输入通道3 | 8 | IN4 | 辅助输入2。ADC输入通道4 | 9 | VREF | 基准电压 | 11 | 
| 中断输出 | 12 | DOUT | SPI接口的数据输出线 | 13 | BUSY | “忙”输出 | 14 | DIN | SPI接口的数据输入线 | 15 | 
| SPI接口的使能线 | 16 | DCLK | SPI接口的时钟线 |
18.3.3 触摸屏的硬件设计前面两小节讲述了四线制电阻式触摸屏控制器AD7843的内部原理框图和引脚定义。下面讲述AD7843的外部电路设计。 AD7843外部电路连接示意图(即AD7843和四线制电阻式触摸屏的连接示意图)如图18-13所示,左边是四线制触摸屏,连接于AD7843的X+、X-、Y+和Y-。在AD7843的电源正极和电源地之间跨接一个0.1μF电容,用来消除电源线上的噪声干扰,而这些外界的干扰通常产生于LCD显示屏或者LCD背光电路(比如逆变器等)。 
图18-13 AD7843外部电路连接示意图 下面讲解AD7843和C6713的连接方式,如图18-14所示,这两个芯片之间是通过SPI协议连接和沟通的,其中,C6713用McBSP接口,设置为时钟停止模式,从而与SPI协议兼容。 
18.3.4 触摸屏的软件编写首先来看看AD7843的工作流程。 编写AD7843触摸屏控制器的底层驱动代码,应该实现如下的功能: (1)初始化并配置AD7843,使之正常工作。 (2)接收中断或查询,判断触摸屏是否有触摸点中断发出。 (3)根据A/D转换后的数据,经过消抖等过程,判读是否中断有效,并计算出触摸点的位置。 (4)将计算处理的触摸点的坐标发送给上层软件。 (5)校准触摸屏。 AD7843软件编写流程图如图18-15所示。

图18-15 AD7843软件编写流程图 AD7843是SPI接口的器件,与C6713通过McBSP来连接。当McBSP用于时钟停止模式时,即可兼容与SPI通信协议。AD7843命令寄存器的字位分布情况如图18-16所示,各字位详解如表18-4所示。 MSB LSB | S | A2 | A1 | A0 | MODE | SER/DFR | PD1 | PD0 |
图18-16 AD7843命令寄存器的字位分布情况 表18-4 AD7843命令寄存器各字位详解 字 位 | 名 称 | 说 明 | 7 | S | 开始标志位 | 6~4 | A2~A0 | 通道选择位 | 3 | MODE | 12位或者8位选择 | 2 | SER/DFR | 单端或微分基准选择位 | 1,0 | PD1、PD0 | 功耗管理(如表18-5所示) |
如表18-5所示的是PD1、PD0的表示意义。 表18-5 AD7843命令寄存器中PD1、PD0的含义 PD1 | PD0 | 
| 说 明 | 0 | 0 | 使能 | 两次通信间,AD7843处于节约模式 | 0 | 1 | 禁止 | 除了禁止 中断之外,其余与PD1=0、PD0=0效果一致 | 1 | 0 | 使能 | AD7843永远保持工作状态, 使能 | 1 | 1 | 禁止 | AD7843永远保持工作状态, 禁止 |
AD7843的SPI接口时序图如图18-17所示。 
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1096"> tBD </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1095"> tBTR </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1094"> tTR </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1093"> tCSH </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1097"> tBDVV </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1087"> tDV </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1088"> tDH </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1086"> tDS </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1085"> tCSS </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1077"> 数据输入 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1081"> DIN </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1092"> tDO </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1091"> tCP </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1090"> tCHS </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1089"> tCL </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1084"> </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1083"> BUSY </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1082"> DOUT </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1080"> DCLK </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1079"> 忙信号 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1078"> 数据输出 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1076"> 时钟 </DIV> |
<DIV class=shape style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt" v:shape="_x0000_s1075"> 片选使能 </DIV> |
图18-17 AD7843的SPI接口时序图 了解了AD7843的寄存器和SPI时序图之后,下面我们就来讲解AD7843的代码编程。 首先讲解最底层的驱动函数:读/写AD7843的子函数。 void Mcbsp_write() //写数据到AD7843的函数 { *(DXR11)= data0; } void Mcbsp_read() //从AD7843中读取数据 { *(DXR11)=0x0; data0=*(DRR11); } 了解了底层的驱动函数之后,再来看看获取X、Y坐标的子函数。 uint ad7843_x(void) { Mcbsp_write(0x90); //将S标志位置1,表示使能传输 return Touch_read(); } uint ad7843_ y(void) { Mcbsp_write (0xD0); //将S标志位置1,表示使能传输 return Touch_read(); } 取到X、Y值之后,并不是马上就能发送给上层程序,还要进行辨别、求平均等处理,因为各个触摸屏上的电阻不是均匀线性分布的。 下面的这个程序是采集10次数据,取出最大、最小值之后,求平均值的子函数。 uint average(uint value[8]) { uint max,min,i,ave=0,sum=0; max = value[0]; min = value[0]; for(i=0;i<10;i++) { if(max<value[i]) max=value[i]; if(min>value[i]) min=value[i]; sum+=value[i]; } ave=(sum-min-max)/8; return ave; } 在经过上述去除最大、最小值,并求出平均值之后,这个值,我们就认为是准确的结果,下面就可以发送给上层程序,进行下一步操作了。 18.3.5 AD7843使用注意事项AD7843其实是一款A/D芯片,所以,对于这一款芯片的使用要特别注意PCB布线、EMC等内容;否则,AD7843的工作性能会大打折扣。 在PCB布线上要注意下面几点: (1)模拟地和数字地应该分开布线,以防止互相干扰。而为了保证数字地和模拟地在电平上的统一,应该连接起来,连接的方法可以是一点连接或者用电感、磁珠隔离。 (2)多加滤波、去耦电容。 (3)远离干扰源(LCD的背光、大功率器件),有条件时可加装金属屏蔽壳。
|