关于原子哥的触摸屏滤波算法的探讨

2019-08-17 09:03发布

这几天被一个诡异的bug折腾掉两斤肉,最后bug的根源是没找到,不过关于原子哥的触摸屏例程我倒是有些看法。先说说这个bug。
几个月前,突然发现一批产品有一小部分触摸屏触摸不良,最明显的表现就是滚动条很难拖动,按钮则需要按更长的时间才有反应。
由于同一份代码表现出不同的现象,所以我们找了触摸屏的厂家让他们找原因。后来他们说找到原因,并进行处理,事情就了结了。
但是,最近,这个问题再次出现,并且发现,有问题的屏,换一份代码居然又没事!于是对比两份代码,但是无论怎么看,都不关代码的事,直接用一份代码改也能改出问题,最后能得到的结论就是:代码的长度会影响触摸灵敏度!
小学生才相信这个结论,但是事实似乎就是如此。
还好仿真的时候也有这个现象,于是深入研究。最后得到一个新结论,如果出现触摸不良,原因是触摸采样的值波动很大,而原子哥的例程中设置了一个“30”的阈值,大部分触摸采样都被这个阈值滤掉了。
那为什么基本相同的代码,一样的板子,采样得到的波动会有不同呢?为了这个问题折腾了一个通宵也毫无结果。
于是,另辟蹊径,从滤波算法入手。
原子哥的滤波算法是,采样5个x值,去掉最大和最小值,取平均。用同样的方法采样y值。然后再用同样的方法再采样一次x和y,并比较两次采样的值,如果相差超过30就放弃这两个值,否则取两个值的平均值。
仿真显示,永远是y的值偏差超出30。这个问题的幕后真相可能会一辈子就这么过去,不管它了。
上网搜索了一下,发现有网友提出一个观点:采样20次x值,再采样20次y值。绝对不能采样x值1次,再采样y值1次,然后重复20次。具体原因他让我们自己看波形。我暂时就不看了。我急着解决问题好出货。
按这个说法,原子哥采样5次x,再采样5次y,然后重复1次,会不会就是x、y交叉采样太快了呢?
于是我把采样次数提高到40次,丢弃值4个,最后得到32个计算平均值,这样计算平均值时还能用移位的方法算。这样处理后,问题有些好转。
于是我又想,原子哥的30这个阈值是对采样值设置的,采样值最大可以去到3000多,那么30的阈值就相当于1%的精度!对于这么块粗糙的电阻屏,触摸点的精度去到1%没什么意义,而且我已经针对触摸设计布局,按钮都是40X40的尺寸,也不需要在上面画图画,所以精度可以降低。于是,我把采样值换算成屏幕坐标,再设置4%的精度,这样,对于320个像素的长边来说,误差是12个像素,依然毫无压力,问题漂亮解决。
可能你会问,既然采样了40次,那还有必要采样两个点来比较吗?有必要。测试可知,在按下和离开的瞬间,采样值会跳得更加离谱,甚至跳到屏幕外,如果加入这个阈值限制两个点的距离,就能解决这个问题。
最后的结论就是:
原子哥的算法适应于触摸玻璃质量非常好,需要在玻璃上用尖细的笔端画画的情形,但是不适应质量差(暂时就这么界定吧~),又需要快速反应的情形,如“滚动条”控件。
说明一下:滚动条控件是我设计的,这个不会存在未知问题。使用的芯片、电路都是模仿mini开发板,两年前买的,应该没什么问题吧?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。