电阻式触摸屏是一种传感器,它将矩形区域中触摸点(X,Y)的物理位置转换为代表X坐标和Y坐标的电压。目前,SHARP和其他很多公司生产的LCD模块都采用了电阻式触摸屏,这种屏幕可以用四线、五线、七线或八线来产生屏幕偏置电压,并同时读回(read back)触摸点的电压。
过去,为了将电阻式触摸屏上的触摸点坐标读入微控制器,需要使用一个专用的触摸屏控制器芯片,或者利用一个复杂的外部开关网络来连接微控制器的片上(on-chip)模数转换器(ADC)。夏普公司的LH75400/01/10/11系列和LH7A404等微控制器都带有一个内建触摸屏偏置电路的片上ADC,允许触摸屏传感器和微控制器之间进行无胶(glue-less)接口。该ADC控制所有的触摸屏偏置电压,并在无需CPU干预的情况下记录全部测量结果。
SHARP微控制器采用了一种逐次逼近寄存器(Successive Approximation Register, SAR)类型的转换器。
1. SAR结构
虽然SAR的实施方案很多,但它的偏压结构很简单,参见图1。

图1 简化的N位SAR结构
该结构将模拟输入电压(VIN)保存在一个跟踪/保持器中,N-bit寄存器被设置为中间值(即100...0,其中最高位被设置为1),以执行二进制查找算法,迫使数模转换器(DAC)的输出(VDAC)变为VREF的二分之一,这里VREF为ADC的参考电压。之后,再执行一个比较操作,以检查VIN究竟是小于还是大于VDAC:
• 如果VIN小于VDAC,比较器输出逻辑LOW,N位寄存器的最高位清0。
• 如果VIN大于VDAC,比较器输出逻辑HIGH(或1),N位寄存器的最高位保持为1。
其后,SAR的控制逻辑移动到下一位,将该位的逻辑强制置于HIGH,再去执行下一次比较。SAR控制逻辑将重复上述顺序操作,直到最后一位。当转换完成时,寄存器中就出现一个N位数码字符。图2显示了一个4位转换过程的例子,图中Y轴和粗线表示DAC的输出电压。

图2 4位SAR ADC转换
在本例中:
• 第一次比较显示VIN小于VDAC,因此位[3]被置0。随后DAC被设置为0b0100并执行第二次比较。
• 在第二次比较中,VIN大于VDAC,因此位[2]保持为1。随后,DAC被设置为0b0110并执行第三次比较。
• 在第三次比较中,位[1]被置0。DAC随后被设置为0b0101,并执行最后一次比较。
• 在最后一次比较中,由于VIN大于VDAC,位[0]保持为1。
2. SHARP ADC的应用
为了将电阻式触摸屏上的触摸点坐标读入微控制器,需要使用一个专用的触摸屏控制器芯片,或者利用复杂的外部开关网络来连接微控制器的片上模数转换器。SHARP ADC模块包括:测量结果FIFO的ADC核、正输入多路复用器、负输入多路复用器、正参考多路复用器、负参考多路复用器、测量序列发生器,以及一个偏置与控制网络。
除了LH7A404外,所有微控制器模块的I/O管脚均穿过GPI MUX。多路复用器允许用户将每个管脚配置为通用数字输入或模拟管脚。将ADC模块I/O管脚配置为数字输入时,GPI MUX会把一个数字输入缓冲器连接到这个管脚;而将其配置为模拟管脚时,GPI MUX则把它与数字输入缓冲器断开,同时将缓冲器接地。在低功耗应用中,为了尽量减少漏电流,既可以将所有未使用的ADC I/O管脚都接地,也可以将未使用的ADC I/O管脚编程为模拟管脚。本文假设ADC模块中所有需要的I/O管脚都已被设置为模拟管脚。
对于LH75400/01/10/11系列器件,ADC的正输入多路复用器可以对所有8个ADC管脚(AN0~AN4、AN6、AN8和AN9)中的任何一个进行采样;对于LH7A404,ADC的正输入多路复用器可以对所有10个ADC管脚的任何一个进行采样。为了节省LH75400/01/10/11的管脚,SHARP只引出了10个管脚中的8个,因此LH75400/01/10/11系列的模拟管脚序号不是完全连续的。在所有的芯片上,负输入多路复用器可以选择负参考输入或VSSA_ADC作为ADC的负输入,正参考多路复用器可以选择片上参考或三个外部管脚之一作为正参考,负参考多路复用器则可选择VSSA_ADC或三个其它外部管脚作为负参考。这些多路复用器将模拟输入连接到SAR ADC的内核。
通过低阻模拟开关,ADC的偏置与控制网络可以将模拟管脚切换到VDDA_ADC或VSSA_ADC。另外,偏置与控制网络也可以将弱上拉电阻切换到AN0和AN4管脚。图3为偏置与控制网络结构图。需要注意的是,LH7A404的11到1多路复用器还有另外两个模拟输入。

图3 LH75400/01/10/11 ADC的偏置与控制网络
启动测量后,测量序列发生器将控制整个过程,包括需要激活哪些模拟开关来偏置触摸屏、什么时候激活这些开关、使用哪些管脚作为ADC内核的模拟输入、采样间隔为多长等等。A2DCLK时钟信号决定序列发生器和ADC内核的时基。A2DCLK频率通过电源配置寄存器进行编程。
测量序列发生器是一个状态机,它向偏置与控制网络、多路复用器和模拟内核发送信息。序列发生器发送的信息称为控制字(control word),长度为32位。由于ADC的片上数据总线只有16位,所以控制字被分开保存在控制高位字寄存器(control high word register)和控制低位字寄存器(control low word register)中。要查看序列发生器发送给ADC其余部分信号的当前状态,可以让程序读取控制高位字寄存器和控制低位字寄存器。
控制高位字寄存器中包含了正负输入多路复用器、正参考多路复用器和测量建立时间的当前设置,控制低位字寄存器中则含有负参考多路复用器和偏置与控制网络的控制位当前状态。
测量序列发生器状态机在开始时为IDLE(空闲)状态。在空闲状态期间,控制高位字包含了空闲高字节值,控制低字包含空闲低字节值,这意味着空闲低字节设置的是偏置与控制网络中的开关状态。当触摸屏被触摸而触发测量时,状态机将等待空闲高位字寄存器中空闲时间字段所设定的A2DCLK周期数。之后,如果ADC仍然检测到触摸屏上有触摸动作,序列发生器将前进到GET_DATA状态。
在GET_DATA状态,测量序列发生器从控制区数组中取出控制字,控制区是一个包含16个控制高位字数值和16个控制低位字数值的数组。序列发生器使用索引号0到15来访问控制区。电源配置寄存器的NOC字段设定为序列发生器将要从控制区读取的总次数减1。
序列发生器进入GET_DATA状态时,控制区索引号为0。序列发生器从控制区高位字加载控制高位字,并从控制区低位字加载控制低位字,控制低位字中的新值使偏置与控制网络中的开关切换到编程设定的状态。新的控制字加载完成之后,序列发生器进入WAIT_CONV状态。在WAIT_CONV状态,序列发生器将等待控制区高位字建立时间字段中编程设定的A2DCLK周期数,这给触摸屏的电压、偏置和控制开关设置提供了稳定时间。随后,ADC内核执行一次测量操作,测量结束时,ADC内核发出信号,示意测量序列发生器读取转换结果。测量序列发生器前进到END_OF_SEQ状态,读取转换结果,保存到结果FIFO,并将控制区索引号加1。
这个以读出新控制字为开始、保存测量结果为结束的过程重复执行,直到序列发生器进行了电源配置寄存器NOC字段所设定的测量次数为止。当序列所有测量完成之后,序列发生器将设置中断状态寄存器中的EOSINTR_UM位。
测量序列发生器可以编程为检测到触摸屏被触摸时触发,在这种模式下,只要屏幕上检测到触摸动作,序列发生器便会自动重新触发。测量序列发生器也可以设定为由软件命令触发或连续触发。
3. 连接与编程
(1)基本ADC设置
无论要测量哪一种类型的触摸屏,都应当配置测量序列发生器,执行下列步骤:
• 行触摸检测;
• 测量X;
• 测量Y;
• 重复进行触摸检测。
其中有一个假设,即如果测量序列开始时你正摸着屏幕,测量序列结束时还在触摸,就认为整个测量X和Y期间都在触摸屏幕。
为了测量是否触摸了屏幕,需要对偏置与控制网络进行编程,将一个弱上拉电阻连接到AN0管脚,并将一个强下拉电阻连接到AN4管脚(对五线和七线触摸屏)或AN3管脚(对四线和八线触摸屏),将参考输入多路复用器设为使用片上的2.0V参考。 将正输入多路复用器编程为测量AN0,负输入与负参考相同。例如,如果选择的测量阈值为三分之一满量程,那么当AN0上的电压为2.0V÷3=0.66V时将会检测到一次触摸。在3.3V范围内,它有足够的噪声余量。
用户可能遇到的问题是,上拉电阻将触摸屏上拉到VDDA_ADC的过程可能非常缓慢,解决的方法是,在测量触摸状态之前,用偏置与控制网络中的强上拉位2对AN0管脚预先充电。此时如果触摸面板受到触摸,测量序列发生器在下一步骤中切换进来的强下拉将很快把AN0拉下来;如果没有触摸面板,那么在触摸检测测量期间,弱上拉将把AN0管脚保持在VDDA_ADC。
(2)四线触摸屏的连接与编程
四线触摸屏的编程步骤如下:
• 将所有的可写ADC寄存器编程为0;
• 在FIFO状态寄存器FEMPTY(2)位为0时,通过对结果寄存器进行读数,冲洗FIFO结果;
• 对芯片寄存器进行编程;
• 使用注册码或中断驱动型算法。
(3)五线触摸屏的连接与编程
五线触摸屏的编程步骤如下:
?将所有的可写ADC寄存器编程为0;
?在FIFO状态寄存器FEMPTY(2)位为0时,通过对结果寄存器进行读数,冲洗FIFO结果;
?对芯片寄存器进行编程;
?使用注册码或中断驱动型算法。
(4)七线触摸屏的连接与编程
七线触摸屏的编程步骤如下:
• 将所有的可写ADC寄存器编程为0;
• 在FIFO状态寄存器FEMPTY(2)位为0时,通过对结果寄存器进行读数,冲洗FIFO结果;
• 对芯片寄存器进行编程;
• 使用注册码或中断驱动型算法。
(5)八线触摸屏的连接与编程
八线触摸屏的编程步骤如下:
• 将所有的可写ADC寄存器编程为0;
• 在FIFO状态寄存器FEMPTY(2)位为0时,通过对结果寄存器进行读数,冲洗FIFO结果;
• 对芯片寄存器进行编程;
• 使用注册码或中断驱动型算法。
(6)将结果FIFO值转换为电压和屏幕坐标
通过以下功能,可以将结果FIFO回归为16位数字:
• 最高位的10个位为ADC结果;
• 测量时,最后4个位为控制区阵列的索引;
• 位4和位5备用;
• 隔离转换结果时,将从结果FIFO读取的数值转化为正好6的倍数;
• 为了将一个测得的FIFO值转换为电压值,先将右移的测量结果乘以参考电压(全量程电压),再除以0X3FF(全量程转换)。
• 为了将一个X轴坐标测量结果转换为屏幕坐标,先将右移结果寄存器的值乘以屏幕宽度,再除以0X3FF。
• 为了将一个Y轴坐标测量结果转换为屏幕坐标,先将右移结果寄存器的值乘以屏幕高度,再除以0X3FF。
• 将触摸屏测量结果转换为LCD像素坐标时,会出现一些问题,其中有些是由ADC引起的,有些是由于触摸屏与LCD之间的物理连接引起的。
4. 系统优化
系统一旦运行,就必须不断调整,使系统性能达到最佳。
(1)A2DCLK频率、IDLE时间及设置时间程序
调整A2DCLK频率、空闲(IDLE)时间和设置时间的目的,是在测量精度、误测触发预防/触摸灵敏度、能耗之间进行权衡。A2DCLK频率可以在200KHz与2MHz之间,否则,ADC就不能正常工作。
为了使测量精度最大化,使误测触发最小化,程序应该尽可能像A2DCLK一样慢,像设置时间和空闲时间一样长。
另一方面,在测量触摸屏的最大能耗时,ADC应该偏置于阻性层,一边偏压为0V,另一边偏压为VDD_ADC。由于在整个设置时间内,屏幕始终处于偏压状态,最小化的设置时间和最大化的A2DCLK可以使屏幕的偏压状态尽可能短。
为了使触摸到触发某一测量之间的时间尽可能短,应该使空闲时间尽可能短。
(2)提高信噪比
电阻触摸屏可能是一个很好的噪声收集器。当用户将某一物体拖过屏幕的时候,就能观察到噪声的存在,这时即使钢笔处于完全静止状态,也能观察到屏幕晃动。
由于触摸屏正好位于LCD的顶部,因此会受到LCD定时信号和背光/前光转换器噪声的影响。同时,由于触摸屏外表面大部分暴露于外界,环境噪声的影响也非常重要。必须牢记的是,对于一个参考电压为3.3V的10位ADC来说,只能考虑3.2mV以下的噪声,测量误差的增加不能超过1个最小有效位(Least Significant Bit,LSB)。
如果出现噪声问题,可以在偏压电路中增加电容和磁珠。由于偏压线路和测量线路是相互分离的,5线、7线和8线触摸屏允许在严重噪声环境中,为ADC的输入端加入动态滤波器。但是,测量线路应用的滤波越多,所需要的设置时间就可能越长。
本文假设对于每一个坐标对,在X轴和Y轴方向分别进行4次测量。由于每一次测量都会耗能,如果环境不是太嘈杂,或者不需要极高的测量精度,最好将X轴和Y轴的测量次数降低为1。