电容触摸传感的理论框架
简单解码:按键是否被按下
本文引用地址:http://www.eepw.com.cn/article/96947.htm为了确定按键是否被按下,需要先确定滑动平均值。确定平均值之后,根据测量值相对于平均值的偏差可以指示按键是否被按下。对于我们的系统,读数下降表示按键按下。因为涉及到一些环境效应和其他因素(例如噪声),所以必须设置一定的容限。但是,该系统未提供迟滞值,若读数在均值与判决门限值之差附近上下变化,就会出现系统在判定按下与未按下之间来回振荡这一糟糕的情形。为了避免这一点,需要包含迟滞值:
if (reading < average – trip) {
Buttons.SENSOR0 = PRESSED;
} else if (reading > average – trip + hyst) {
Buttons.SENSOR0 = UNPRESSED;
}
以上代码在按钮释放中增添了迟滞值,使按钮不会产生振动。这也为电容开关构造了最低程度的消抖功能。机械按钮会在0-VDD之间来回抖动。电容按钮不会产生该问题;但是,通过增添迟滞值,按钮按下的操作与原来无异,只是加强了对按钮释放的判断。这可以产生最低程度的消抖效果,因为单次按下仍然可以触发按键。要进一步增强消抖,可以要求连续几次的传感器读数均有效,才表示按钮确实按下,然后向应用程序指示按钮被按下。这样可以防止虚假的低读数影响系统。
复杂解码方案
上面用于确定按钮是否被按下的解码方案是相当简单的。
对于百分比按下检测,将继续使用前面讨论的求均值方案。但是,读数变量将变换为如下形式:
unsigned long percent;
percent = average – (reading*16);
if (percent < 0) {
percent = 0; // 忽略电容上升
} else {
percent = percent * 1000; // 乘以1000
percent = percent / average; // 结果使用100.0%的形式
}
结果变量percent包含0~1000的值,更具体地说,值的范围约为0~200(代表20.0%)。结果值保持单个小数位,因为更多小数位并不会提高精度。
更换先前的“if”语句,产生类似于以下语句的“if”语句:
#define PCT_ON 50 // >5.0%,打开
#define PCT_OFF 30 // <3.0%,关闭
if (reading < PCT_ON) {
Buttons.SENSOR0 = PRESSED;
} else if (reading > PCT_OFF) {
Buttons.SENSOR0 = UNPRESSED;
}
下一个复杂解码方案称为“多键表决”。如前面所讨论,传感器不仅会与手指和周围的地产生耦合,而且会相互耦合。因此,触摸一个传感器会影响另一个传感器,但影响程度通常会低于其他意外激励。如果即使影响程度较低,影响仍足以触发按下状态,会发生什么情况?
评论