去抖电路中的电容器如何工作?


13

在以下电路上(一个反跳按钮使LED点亮):

原理图

模拟该电路 –使用CircuitLab创建的原理图

我试图了解为什么LED不会亮起,因为电容器看起来像是绕过了开关。当电容器装满时,它不传输/导电吗?

您会注意到我是一个初学者,但是在阅读了20个小时的各种教程之后,我仍然无法真正找到非常简单的东西。完整的电容器与简单的电线有何不同?如果我用电线代替电容器代替了电容器,则指示灯将始终亮着。

编辑:有人指出,去抖电路没有任何意义(电压差等),这是我第二次尝试使之更有意义。R5和R6可以相同,但是我认为将它们分开将有助于为每个组件保留一份工作。

电路

Answers:


14

这不是一个好的去抖动电路。

一个问题是(至少在理想情况下)开关及其连接线的电阻为零。这意味着当开关闭合时,电容器将立即放电。(实际上,如果电容器上有足够高的电压并且具有足够高的容量,这种快速放电甚至可能对开关触点或布线也不利。)

电容式开关去抖动应在开关处于一种状态时缓慢地给电容器充电,而在另一种状态时使电容器缓慢地放电。RC常数不必相同,但应为非零值。该电路具有控制电容器充电的电阻器。它只需要在开关回路中使用一个电阻器就可以正常放电。

t=0

t=0t=0

这里的最后一个考虑是电路仅点亮一个LED,因此开关弹跳基本上是没有意义的,除非LED闪烁在某个光学检测器上,在该探测器中开关弹跳会变成信号中的毛刺。如果LED的工作只是提供漂亮的灯光,那么您的眼睛甚至不会足够快地看到开关弹跳。


这是电路的时域仿真(将V1更改为3V之后)。绘制的是LED电流。重要提示:“跳过初始”参数设置为“是”,因此我们可以看到当电容器最初为空且电压源通电至3V时会发生什么。开关处于打开状态时,一切都是如此。

在此处输入图片说明

如您所见,电流通过LED浪涌,然后消失。如果您的意图是由操作员通过按钮严格控制LED,那么您的设计就不会实现您的意图。


关于下面的评论,假设目标是实际驱动微控制器引脚(所有以5V运行)。首先,我们可以在没有任何电容的情况下做到这一点,并通过以合理的低采样率对引脚进行采样来处理软件中的抖动。

原理图

模拟该电路 –使用CircuitLab创建的原理图

开关断开时,输出通过下拉电阻器拉至0V。当我们闭合开关时,电阻器顶部的电压上升到5V。该输出可以视为信号。我们对信号的低频成分感兴趣:相对较慢的开关按下。我们要拒绝高频,例如开关弹跳。为此,我们可以添加一个无源单极RC低通滤波器:

原理图

模拟该电路

现在,当开关闭合时,电压随着电容器充电而逐渐升高。您可以在时域仿真中看到这一点:

平滑的开关闭合

当开关断开时,电容器将通过R1和R1放电,使电压逐渐降回零。电容器基本上遵循R1的电压,但是由于必须通过R1充电以及通过R1和R2放电而有所滞后。(请注意,放电速度是充电速度的两倍!)

微处理器的输入端以高阻抗感测电压,因此我们可以忽略其负载效应,甚至不会在图中显示它。对于LED,我们不能这样做,因为它需要电路必须提供的电流。电流流经我们的电阻器并产生电压,这是我们必须考虑的:换句话说,它具有“负载效应”。

如果我们将输出馈送到施密特触发器,则这种电路的效果会更好。施密特触发器是一种用于数字信号的缓冲器,具有类似于温度计的滞后性。超过某个高输入阈值时,其输出变为高电平;而超过另一个低阈值时,其输出则变为低电平。例如,当输入电压高于3.5伏时,它可能会变高;而当输入电压低于1.5伏时,它可能会变低。

因此,即使电容器允许通过一些噪声,该噪声仍可能导致在输入阈值的交点附近发生一些小的来回翻转,施密特触发器仍会拒绝这种噪声。


假设我们要用电容器对LED进行反跳?问题在于,由于需要向LED提供电流,因此电阻最终变得太低。如果我们只使用相同的电路,并且使电阻更小(而电容器却增大相同的倍数),那么最终会浪费功率。做到这一点的方法是使用一个小信号环路来处理开关,并对其去抖动,然后使用电压来控制将电流倾泻到LED中的晶体管。

尽管对LED进行反跳可能没有用,但是如果我们使电阻和/或电容器足够大,我们可以获得良好的行为:按下并按住按钮时,LED的指示灯会逐渐褪色,而在释放按钮时,LED的指示灯会逐渐褪色。

原理图

模拟该电路

这与以前的电路相同:“输出到微控制器”节点现在连接到n沟道MOSFET的基极,后者将电流驱动到LED。MOSFET“缓冲” LED驱动的去抖逻辑。去抖电路不会受到LED的低阻抗的干扰,并且去抖电路中的高阻抗不会使LED电流不足。


哼,那解决办法是什么?LED可能是arduino输入或其他。我的问题更多地是关于电容器的...我只是试图复制一个现有的去抖动电路来说明关于电容器的问题。电压为5V,而不是1
FMaz008

我可以将其添加到答案中。
卡兹(Kaz)2013年

那么,您的意思是说我应该在V1和SW1之间增加一个100olm的电阻?我想我只是感到困惑,因为在我所看到的所有教程中,我还没有看到一个按钮反跳电路涉及超过1个电阻。但是大多数都没有绘制完整的电路(到OUT,到Arduino等),因此我很难理解。那么这会不好吗?:digital.ni.com/public.nsf/8e0a9cd1e264dced86256a100082b910/...
FMaz008

很奇怪,所以您向我解释说,我无法执行带有防弹跳电路的点亮LED的按钮。无论如何,这回答了最初的问题,其余的我将做更多的研究:p我只是不想说“ arduino会做”:我知道,我可以增加20ms的延迟而不进行反跳根本没有,但是我试图了解其背后的魔力是什么……这就是为什么我想要完整的电路。
FMaz008 2013年

您可以对驱动LED的按钮进行反跳操作,但这是没有意义的,因为开关跳动不会导致LED故障。对于完整的电路,假设您的Arduino由+ 5V和地供电。然后,“输出”节点连接到要驱动的输入引脚。
卡兹(Kaz)2013年

2

之所以会出现这种效果,是因为在稳定状态下,电容器有效地阻止了直流电压中的任何电流。通过理解方程式可以看出

i = C *(dV / dt)

在DC时,差分项为0,因此电流为0。因此,通过电容器的电流在稳定状态下将为零。

如果您认为这是理所当然的,那么该电路为何起作用应该是很明显的。如果您想提供更多细节,那么该视频可能会比我的描述更好地演示电容器的物理原理,如何产生上述结果。


这个视频很棒,除了它给我带来的握手:p谢谢:)
FMaz008 2013年

1

出于许多目的,电容器可以被认为是非常小的可再充电电池。它只会在充电或放电时通过电流。

大多数LED至少需要2伏特才能点亮-为了使电路完全正常工作,电压源至少应为3伏特。然后,当电容器打开时,打开开关后,您可能会看到LED继续发光一秒钟。


除了电阻以外,我并没有真正配置电压以及所有其他功能。这是我第一次使用电路实验室,所以我只是在“使用默认值放置组件”,如果我真的要这样做,那将是5V。
FMaz008 2013年

1
"When the capacitor is full, it doesn't transmit/conduct electricity"

是。它不是电线,而是(如符号所示)两个平行的板紧靠在一起。

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.