软件设计
实现电容式触摸感应按键时,检测电容充放电时间的精度将受到外界各种因素的影响,如:系统供电电源、定时器计时的频率高低及外部50/60Hz主频干扰,以上诸多因素均可能在一定程度上影响测量结果。当然,我们可以通过软件滤波方法将按键检测结果的LSBs位去除,因为单个触摸按键在ON/OFF两种状态的检测结果相差较大,这在实现单个触摸按键时是个很好的方法;但是在实现滑动按键时,检测结果的处理相对单个按键的检测要复杂,此时可以采取软件滤波算法,或者对多次测量结果取平均,来处理平滑按键的检测结果,真正实现滑动按键;而当一个滑动按键系统受电源或是PCB板厚度影响较大时,检测结果的LSBS位的处理更要谨慎。
系统软件设计包含四部分:感应按键的基准电容检测、单个按键功能的实现、滑动按键的实现、多路按键复用实现滑动按键四部分。
1.基准电容检测
基准电容为按键未被触时的电容状态,即PCB板上“焊盘”的感应电容。在检测感应电容的触摸或滑动按键功能之前,基准电容的检测是软件算法中非常重要的一个关键步骤,因为我们需要根据基准电容的大小设定一个按键阈值,判断有无按键按下。同时,电源电压的稳定性、PCB材质、周围环境如温度、湿度等因素都会影响基准电容的检测,所以在实现电容式触摸感应按键时需“动态”检测该基准电容值,否则当外界环境改变而影响基准电容时,设定的按键阈值相应会有偏差,从而引起按键的误操作。
下面介绍一种“动态”检测基准电容值和根据基准电容值变化调整按键阈值的方法,流程如下图所示,
每一个按键均需要单独使用这种方法进行检测,流程图中的变量“BASE”基准值并不是反应实际“焊盘”按键的感应电容值的增加或减小,而是软件算法中的调整变量。
单个基准电容的检测流程也如下图所示,
完成一次检测后,首先确定是否检测到有效按键按下,本文采用设定一个“最小检测阈值”,只有当检测结果的变化值达到这个“最小检测阈值时,确认为一次有效按键,而“最小检测阈值”比实现一个简单的ON/OFF时在程序中实际所设定的基准阈值会小很多。当没有触摸按键时,空按键寄生电容放电时间单位为10;当手指触摸按键时,按键电容放电时间最小为20,则可以将“最小检测阈值”设置为中间值15。
当检测到没有按键接下时,调整“BASE”值,由检测到基准电容值大小的改变情况决定如何调整“BASE”值,当检测到按键基准电容减小时,“BASE”值相应地自动减小。当按键按下时,所检测到的电容值肯定增大,所以当程序检测到按键基准电容变小时,那么实际的基准电容肯定是变小了,此时可以将“BASE值与新检测到的结果做平均运算,同时将得到的平均值作为新的“BASE”值,作为下一次的判断标准。
当检测结果表明基准电容增大时,则须降低检测基准电容的速度,此时基准电容的增加,可能为基准电容真的增大了,或者可能是当手指正在靠近PCB上的感应按键时引起的,此时过快调整“BASE”值,将导致有手指接下时检测不到按键被按下。如果在没有手指触摸时检测到基准电容值增加,那么可以在程序中进行简单的调整,即将“BASE”值进行加1操作。
2.单个按键功能的实现
单个按键的检测即为开关按键的检测,触摸按键的灵敏度和电容的变化值对按键操作的影响相对来说比较小,如下图所示,
检测4个感应电容,未触摸的按键被测量出的结果只是一个基准数值,即基准电容的充放电数值,第二个按键由于手指触摸后感应电容容量的增加,所以增加一个最大计数值A,每一个按键的灵敏度要靠所设定的按键阈值决定,该阈值在基准电容和触摸的最大计数值△之间调整,同时,设定阈值大小时须考虑到外界检测噪音的影响)以提高检测的准确性与按键的可靠性、稳定性。
3.滑动按键的实现
除了检测单个感应电容按键的ON/OFF功能之外,触摸按键系统的应用还可以拓展到滑动按键的应用,利用一个按键设定多个阈值,从而检测多个按键位置。当手指与感应电容“焊盘”的相互接触面积越大时,则感应电容的容值也会越大。如下图所示:
当手指按在4个感应按键上时,被接下的键与其它三个按键的感应电容的容值大小将有所区别,与手指靠得越近,感应电容将越大。
基于以上原理,每个按键都可以检测到手指处于该按键的不同位置,从而达到检测滑动按键的目的。举例说明:如果每个感应按键可以采用16级分辨率进行检测,那么4个感应按键对应划分成64级分辨率,也就是说可以实现64个按键功能。简单算法如下图所示
。感应电容的分辨率可以通过触摸电容的灵敏度调节,即根据触摸后电容电量的变化大小进行调节,触摸电容容量变化越大,测量的计数值△越大,可以实现的滑动按键分辨率越高。
将手指触摸按键时,感应电容的最大计数值△除以理想的分辨率,所得结果从1~64呈线性分布,并决定触摸电容的感应位置]位置0代表没有手指触摸按键,如下表所示,
电容按键 | 每个按键的位置 | 因子 | 计算后的位置 |
1 | 1 to 16(min to max delta) | 0 | 1-16+16×0:1-16 |
2 | 1 to 16(min to max delta) | 1 | 1 -16+ 16 ×1 : 17-32 |
3 | 1 to 16(min to max delta) | 2 | 1-16+ 16 ×2 :33-48 |
4 | 1 to 16(min to max delta) | 3 | 1- 16+ 16 ×3:49-64 |
这种方法的缺点是当手指触摸时,感应电容达到最大的计数值△确定后,计算出的分辨率不能再改变,且只能等下一次重新计算△后,才可改变该分辨率。
4.滑动按键端点处理
在1~64个阶梯数中,如果1表示滑动按键的最左端点位置]那么64则表示滑动按键的最右端点位置,0表示没有任何触摸。通过简单的算法即可实现手指在左端点与右端点之间的滑动操作,如下图a所示,
从左至右端执行滑动触摸时,在最后一个端点会出现手指与触摸按键点的接触面变小,最右端点按键的测量结果变化值会从最大值变小,若不经过处理,按键判断值会出现从49到0的突然变化,也就是滑动时最后一个右端点按键会被忽略掉。同理,如下图b所示,
当从右端点开始滑动时,最右端点测量结果变化值会变小,若不处理,按键判断值会出现从0到49的突然变化,也就是滑动时最后一个右端点按键会被忽略掉。
上述两种方法的软件算法示意图如下图所示,
当执行图a从左端点向右端点方向滑动时,MCU检测最后一个按键(第四个按键)和前一个按键(第三个按键)的感应电容容量值,当第三个按键的感应容量值逐渐减少并且后一个位置检测位置为最大值64时,可以按计算将新的位置确定在64点的位置;当执行图b的方向时,MCU从最右边的按键开始检测,左边的下一个按键对其没有任何影响,则即可判断滑动按键从右向左开始滑动,且最开始滑动的直接位置即为64。
5.多路按键复用实现滑动按键
实现滑动触摸按键时,经常需要多个触摸按键点,当利用MSP430系列微控制器的I/0口实现触摸按键时,可能I/0口数量不够,此时可以采用多个按键共用一个I/0口来实现。如图7所示,一个I/0口接几个触摸按键,当一个按键按下时,I/0口会检测到几个按键同时被接下的情况,那么这种情况下就需要靠邻近几个键的检测值来判断为哪个按键被按下,下图中实际被按下为中间指示的按键,
但是两侧的按键也被检测到接下,即只有中间按键的、左右两按键的电容值略增加,此时可以通过软件判断是中间按键被接下。
结束语
充分利用MSP430微控制器的低功耗性,同时结合硬件设计和软件算法实现的触摸式感应按键的方案已经在MP3、抽油烟机很多领域得到了成熟和广泛应用。本刊讲述的触摸式感应按键硬件和软件的实现方法具有较高的参考价值,由于触摸式感应按键会受外界温度、湿度等诸多环境影响,在实际产品设计中还须针对不同要求进行更为精确的处理。