使用最少的无源元件对按键矩阵进行硬件去抖动

电器工程 模拟 施密特触发器 去抖
2022-01-09 18:31:15

我最近买了这个便宜的 4x4 键盘矩阵。它只有按钮,没有其他功能,因此我想为其添加适当的去抖动功能。软件中的去抖动是我想要避免的,因为它会占用我的应用程序的一些处理能力。

在此处输入图像描述

我知道可以使用电阻器和电容器(我正确吗?)或施密特触发器(我猜这需要另一个 IC,对我来说是不可能的)来完成去抖动,所以问题是,我需要添加 R/C 吗?每个键,或者我可以每行或每列只使用一个 R/C 对吗?

有什么建议?

4个回答

让我们清楚这一点。如果您有一个键盘矩阵,则您已经在使用处理能力将顺序逻辑电压应用于行或列,然后读取列或行以确定按下的按钮。

因此,每次您获得“结果”时,即您检测到按钮已被按下,您将该事件标记为“待处理”,一段时间后(10 到 20 毫秒)您再次检查按钮是否按下您标记为“待定”可以判断为“实际”。

在我看来,在更大的方案中,这需要多少处理时间很少,如果你非常接近 CPU 可以运行的极限,那么就获得更大/更快的 CPU 或提高时钟速度。

使用 Rs 和 Cs 可以工作,但在所有情况下,它都会产生“慢”输出,需要施密特触发以将慢速边沿清理为适合随后逻辑的快速边沿。当然,您可能会侥幸逃脱,但您有一个没有灵活性的固定解决方案。

如上所述,您可能还需要从每条矩阵线到地的电容器以避免 ESD/EMC 问题。

为了获得最佳的去抖动性能,最好为每个按钮配备一个 R/C。但是,您仍然应该每行/列获得一个不错的结果。只取决于它的重要性。如果你想用最少的组件来做,为什么不先尝试每行/列做一个,然后进行一些测量,看看结果是否足以满足你的应用程序?

如果结果不是您想要的,那么继续在每个按钮上添加一些,然后再试一次。

作为一名长期从事嵌入式软件工程师,我不得不说,您认为去抖动会从我的应用程序中占用一些处理能力的假设是完全错误的。对于任何有能力编写的固件来说,这永远不会是真的。

自然,去抖动将需要一些处理。然而,处理是微不足道的,并且用户输入将以如此低的更新率发生,以至于完全可以忽略不计。如果您需要以数十 kHz 的更新速率对输入进行去抖动处理,那么去抖动处理可能会很重要,但人类按下按钮不需要类似分辨率的任何东西。在您的情况下,100Hz 采样很容易就足够快了,您几乎可以肯定地将其降低到 10Hz 采样,而不会严重影响您的用户交互。

如果您尝试在以数十 kHz 运行的主控制回路中进行输入处理,那么它当然会消耗处理能力。正确的解决方案是编写不这样做的固件,而不是使用硬件解决方案来修复软件反模式。适当使用定时器和中断优先级将为您提供所需的东西。

您可以通过确保回读全部在一个 I/O 端口上来优化处理。假设您在列上设置级别并读回行,然后您进行位与、位移位和位或以建立 16 个引脚的 16 位值。将它与之前的 16 位值进行异或,如果它不为零,那么就会发生变化。一个简单的去抖动算法只是在引脚改变状态时将计数器设置为一个值,如果引脚保持其状态并且计数器为零,则选择一个状态,如果它不为零则递减。

当然,您确实只需要检查一个按钮是否被按下。如果你有一个 ARM 处理器,ARM 有一个指令来报告设置了多少位,这是理想的选择。只是提到进一步优化。

Afaik,有些 IC 可以“自动”去抖动,例如 MC14490,称为 Switch Debouncer。

这将防止您需要 CPU 电源,但会花费一些额外的布线/PCB 空间。