电容触摸传感的理论框架
简单解码:按键是否被按下?
本文引用地址:https://www.eepw.com.cn/article/96399.htm为了确定按键是否被按下,需要先确定滑动平均值。确定平均值之后,根据测量值相对于平均值的偏差可以指示按键是否被按下。对于我们的系统,读数下降表示按键按下。因为涉及到一些环境效应和其他因素(例如噪声),所以必须设置一定的容限。使用4个变量来确定按键是否被按下:
unsigned char reading; // 传感器读数
unsigned char average; // 传感器平均值
unsigned char trip; // 传感器门限值
unsigned char hyst; // 传感器迟滞值
检测按下的最简单方式如下:
if (reading < average – trip) {
Buttons.SENSOR0 = PRESSED;
} else {
Buttons.SENSOR0 = UNPRESSED;
}
但是,该系统未提供迟滞值,若读数在均值与判决门限值之差附近上下变化,就会出现系统在判定按下与未按下之间来回振荡这一糟糕的情形。为了避免这一点,需要包含迟滞值:
if (reading < average – trip) {
Buttons.SENSOR0 = PRESSED;
} else if (reading > average – trip + hyst) {
Buttons.SENSOR0 = UNPRESSED;
}
以上代码在按钮释放中增添了迟滞值,使按钮不会产生振动。这也为电容开关构造了最低程度的消抖功能。机械按钮会在0-VDD之间来回抖动。电容按钮不会产生该问题;但是,通过增添迟滞值,按钮按下的操作与原来无异,只是加强了对按钮释放的判断。这可以产生最低程度的消抖效果,因为单次按下仍然可以触发按键。要进一步增强消抖,可以要求连续几次的传感器读数均有效,才表示按钮确实按下,然后向应用程序指示按钮被按下。这样可以防止虚假的低读数影响系统。
复杂解码方案
上面用于确定按钮是否被按下的解码方案是相当简单的。在本文的以下部分中,将使用较复杂的方案。它们包括基于百分比的检测、多键表决,以及计算量很少的百分比按下检测。此外,还将讨论何时使用简单方案,何时使用较复杂的方案。
在前面的简单方案中,门限值变量trip是一个低于平均值的绝对值。更好的做法是采用减法求一个相对值,例如相对于标称值的百分比偏差。为了实现这一点,必须执行更多的计算,这就要求系统作出折衷。使用绝对门限值需要更多地了解系统的工作,而使用基于百分比的系统可适应许多处于合理限度内的系统。手指按下产生的电容变化通常介于1%至20%这一可检测范围之间。如果手指按下产生的读数变化小于1%,系统会遇到错误。触摸裸露金属传感器产生的读数会高于20%,但它并不常用。如果系统以这种方式工作,则可以采用简单开关算法。
评论