打开时是否需要对开关进行反跳操作?


8

假设微控制器的输入端具有一个连接到5V的上拉电阻和一个接地开关(常开)。我知道在关闭开关时应将其去抖动(在我的情况下,在软件中),但是在打开开关时是否需要去抖动?

Answers:


11

是的,如果每次开关更改状态时都希望保证单边,则必须在两个方向上都进行反跳动。

幸运的是,如果将开关连接到微控制器,则不需要任何其他硬件来进行反跳。如果微控制器具有内部上拉电阻(很多人都这样做),那么您在外部只需要在微引脚和地之间切换即可。

我发现50毫秒是一个不错的去抖动时间。大多数开关的弹跳远不及此弹跳,但有几个弹跳的时间可能差不多那么长。但是,对于人类用户而言,50 ms仍然会瞬间感觉到,因此您也可能会更加可靠。唯一的区别是您要计入固件的数量,因此没有额外的费用。无论如何,由于其他原因,我通常会有一个1 ms的周期性中断,因此,如果该中断在同一行中连续50次处于同一状态,则您需要声明该状态已被去抖动。

有关回复评论的反跳逻辑的详细信息:

通常,您将使用一个全局位来指示该开关的正式去抖状态。这就是任何需要知道设置开关方式的逻辑。您唯一需要的附加状态是中断例程中的一个计数器,通常是一个字节。假设中断是每1毫秒一次,去抖动时间是50毫秒。对于每个中断:

如果瞬时状态与去抖状态匹配:
  将计数器重置为50
  完成了

如果瞬时状态与去抖动状态不同:
  减量计数器
  如果计数器达到0:
    声明新的反跳状态
    将计数器重置为50
  完成了

前一段时间在www.embedded.com上有一篇非常好的文章。作者抓住了一堆开关,并将它们放在电源和数字存储示波器输入之间,以查看反弹特性。最终结论是,您不能选择“一个适合所有人的”去抖动时间:您必须表征每个特定的开关并查看其如何反弹。
John R. Strohm 2012年

@约翰:你能给链接吗?我不明白为什么不能在所有开关上都使用最坏情况下的最大跳动时间假设,前提是该跳变时间足够短以使用户满意。Ilin Oms提到的50毫秒满足两个标准。
Wouter van Ooijen 2012年

谢谢奥林。那么,如何跟踪过去50次中断中开关处于何种状态?如果开关与上次中断处于同一状态,我将增加一个变量,如果状态已更改,则将其清除,如果开关达到50,则考虑将其去抖动。这是一种有效的方法吗?
Nate 2012年

1
这可能不是上面提到的文章,但是其中包含很多有趣的信息:ganssle.com/debouncing.htm 处理反跳的任何人都应该阅读它。
无条件

1
@Nate:参见答案。
奥林·拉斯特罗普

2

是的,我会用一种,机制基本相同。断开触点时,您会及时发现开关的电气接触良好以及电气接触不良。与建立联系时相同。


1

一般来说,是的。机械开关在关闭和打开时都会产生电气噪声(弹跳)。


1

通常,是的,但这始终取决于您对数字输入的处理方式。我有一些系统绝对不需要在任何一个方向上进行反跳动。

但是,如果要驱动中断,则很可能应该去抖动。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.