作者:刘旭晖 Raymond转载请注明出处
Email:[email protected]
BLOG:http://blog.csdn.net/colorant/
主页:http://sites.google.com/site/rgbbones/
电阻式触摸屏的Controller从原理上,简单的说就是一个可切换通道的AD转换器,常见的有类似TSC2046这一系列的独立芯片,也有Buildin在MPU里的集成模块。这里记录的主要是这类触摸屏驱动的调试中我所遇到过的一些问题,因为具体硬件平台和环境不同,有些问题,现象和原因可能不一定与你的实际情况相同,仅供参考。
数据线上无法得到正确的数据
读取的测量数据变化不定,几乎没有规律
Tsc2046控制器在接收到8个bit的测量指令后,需要一段的时间完成测量和AD转换工作,这期间在其busy线上会输出高电平,直到电平拉低后在数据线上才会输出数据。 而这期间,其片选信号从spec上看,应该要保持有效,所以在使用SPI接口时候,需要采用比如32位传送的方式,使得在传完8位指令后,继续保持片选和时钟,已接收后续的测量结果数据,因为这期间无法测量busy信号,假定其为某一恒定时间,位移得到所需测量结果。分析数据不稳定的原因在于这段busy等待时间在不同的测量情况下,长度可能不一定是确定的,导致无法准确判断应该提取SDO口上的哪段数据作为测量结果。
所以主要矛盾在于我所使用的CPU的SPI口的片选和时钟信号无法与数据线分开独立自由控制。
采用GPIO口模拟SPI时序,从而可以自己控制clk和片选信号,因此此时可以测量busy线的信号,从而准确的得知何时tsc2046开始完成测量并输出测量结果。
busy线长期处于忙等待状态
送完指令,等待busy拉低的过程中,busy信号始终为高
仔细分析spec,发现在busy状态下,tsc2046依然需要clk来完成AD转换工作,所以在等待busy信号的时候,要同时继续保持CLK信号
每读一次busy信号的同时,继续用GPIO口模拟一个周期的CLK信号。
不断产生pendown中断
在第一次触摸屏幕,pendown中断产生,并完成测量后,即使放开触摸屏,依然连续不断的有pendown中断信号产生,反复进入测量过程。
测量触摸屏X+ pin 上的电平发现,即使在等待中断的过程中,X+ pin 也始终为低电平,而理论上,此时该pin应该为高电平,由于Y- pin 接地,在触摸屏被按下的时候,X+ pin 电压被拉低,从而产生pendown中断。
反复调试发现该pin电压为低的原因在于在上一次测量中,最后一次测量的是Z1,在触摸屏放开的时候,测量Z1的过程中,X+为低电平。而后回到等待中断状态的时候,X+ pin 由于外部电容的原因,被上拉电阻重新拉高为高电平需要一段的时间,在此之前,如果打开中断,就会误判,错误的收到中断信号
有几种办法可以解决:
减小外部电容
将中断由电平触发改为下降沿触发
在完成测量之后,打开中断之前,延迟一段时间。等待X+ Pin回到高电平状态
改变电容涉及到硬件电路改变,而改变触发方式则因为目前使用的中断线无法改成边沿触发,不可行,所以目前是用最后一种方式。
可以尝试改变测量顺序,先测Z1再测X,Y看是否这样可以避免最后一种方式所需的延迟。减小cpu占用率。
采集的数据有剧烈抖动
触摸屏压下以后,即使保持位置不动,所取得的XY坐标也会不时发生较大范围的跳动,幅度达到十几个到几十个像素
通常触摸屏的抖动是不可避免的,毕竟是一个模拟信号的AD转换的过程,但是正常抖动应该在几个像素以下。大范围的坐标抖动,说明AD转换采样取得的电压值有较大变化。理论上大致会有两类原因造成:
AD转换的参考电压跳动
取样PIN脚输入电压跳动
因此,外推一下,不外乎是:
参考电压或取样PIN脚电压受到干扰
取样时刻,对应PIN脚的电压值还未稳定
触摸屏本身质量原因(如贴合存在空隙等),触压时电阻值变化较大,造成输出电压的抖动
具体解决时就要具体分析跳动的现象和规律了
通常如果是内置触摸屏控制模块的MPU,取样PIN脚数据受到干扰的可能性较大,因为这时候,电阻式触摸屏的4个PIN脚的走线相对独立的触摸屏控制芯片来说,可能会比较长,周边的其它信号线可能也比较多。要注意保护好信号。
后两者对应的措施包括延迟消抖,合理安排采样时间,间隔。 改进触摸屏本身等。
最后,抖动有时候是不能完全消除的,可以通过数据平滑的措施在一定程度上减弱抖动带来的干扰。
CPU占用率超高
触摸笔压下后,CPU占用率迅速攀高到一个不合理的地步,松开后降低
通常这种情况都是由于使用了不合理的查询手段来获取采样数据,例如忙等待AD转换的结束,采样频率过快等等
理论上,所有这类IO设备都应该采用中断驱动的方式来获取数据。很遗憾的是,有些内置的触摸屏控制模块,转换结束后并不产生中断信号,只是设置一个状态寄存器,需要由软件查询得到。这种情况下,如果转换完成时间不定,又没有较高精度的定时中断源,只能牺牲相应速度,在每次查询间隔之间睡眠一段足够长的时间,让出CPU。 通常来说,在jiffies值为10ms间隔的系统上,最快每秒查询50-100次,也基本能够满足像手写输入这样的应用的需求了。