将按钮连接到控制器引脚


8

这个问题已经存在了数十年,但是我在此站点上没有找到直接的答案。我想要以下内容:

在此处输入图片说明

该电路仅允许从微控制器内部检查按钮的状态。没有什么花哨。我的问题:

  1. 有什么比这个简单的设计更好的了吗?
  2. 100千欧姆电阻器的电阻是否足以满足当今dsPIC30FXXXX等CMOS器件的要求,而不是大功率应用?

2
1)并非如此,除非您正在寻找硬件防弹跳功能。2)是的。
NickHalden

Answers:


6

首先,许多微控制器和数字信号控制器将具有内部上拉电阻。这是一个示例,Atmel ATMega164。ATMega164p G​​PIO端口

通常会有一个寄存器,用于打开和关闭内部上拉电阻。由于制造工艺的变化,这些内部上拉电阻的范围很广,如果您需要在超低功耗应用中非常紧密地控制电流消耗,则不是一个不错的选择。如果将组件数量保持在低水平很重要,这是一种简单的方法。使用内部上拉电阻进行硬件去抖动并不是一个好主意,因为无法预测其确切值。

100值是否足够取决于。如果只是用户会定期翻转的开关,那么100将是最小化功耗的好选择。对于将要快速切换的事物(例如旋转编码器),我要经历的过程是kΩkΩ

  1. 在数据表中找到最大灌电流
  2. 使用欧姆定律计算上拉值
  3. 选择标准尺寸的电阻器,其尺寸要大一些,具体取决于实际所需的速度
  4. 测试并查看所选电阻器的大小是否给出了所需的上升和下降时间
  5. 相应调整

因此,如果每个GPIO引脚的最大灌电流为10 mA并在5V下运行:。将此R值保持尽可能小将允许最锐利的边缘和最高的开关频率。R=VI=5V10mA=500Ω


您是说由于导线/走线电容而产生的RC电路会导致信号向uC的传播延迟,而R越大,这些传播延迟实际上会导致旋转编码器的误读?
angelatlarge 2013年

是的,随着频率的增加,寄生电抗只是生活中的事实,需要越来越多地加以处理。
马特·杨

有趣!不过我很困惑:假设寄生电容小于1 uF,假设电阻为100k Ohms,并且假设寄生C为0.1uF,我们得到的时间常数约为23mS(输入= 5V,输出= 4.5V)。换句话说,在5V电路中,uC将在不到25ms的时间内以一个上升脉冲在输入上看到4.5V。为了让uC错过这一点(假设它没有轮询),编码器将生成40Hz左右的脉冲。那是我们应该担心的事情吗?
angelatlarge 2013年

寄生电容通常在纳法或皮法拉范围内。对于高速旋转编码器,这成为一个问题。考虑一个光学编码器,该编码器每转发出24个脉冲,并且以1500 RPM的转速旋转。输出方波将为600Hz,周期约为1.2ms。这仍然足够慢,以至于没有必要使用最小尺寸的上拉,但是的上升和下降时间是不可能的。值得单独提出一个问题。kΩ
马特·杨

真实和真实。我在想手动旋转编码器。
angelatlarge

4

您可以得到比这更简单的结果。

只需在微控制器中使用内部上拉/下拉电阻即可。

100k就足够了,但是在某些MCU中内部上拉可能会低一些,例如,在AVR atmega8中,它的复位上拉为30-80kOhm,所有其他I / O引脚为20-50kOhm。


您不能说100k就足够了。没有通用收据,您必须根据MCU和另一侧驱动引脚的设备来计算值。
Blup1980 2013年

1
问这个问题的人指定了一个按钮。我没有看到这个答案有问题。
mjh2007

1
  1. 有什么比这个简单的设计更好的了吗?


    没有您未提供的特定衡量标准,就无法回答更好。在大多数情况下,您显示的拓扑很好。根据情况,可能会有两个变种“更好”:

    许多微控制器在某些引脚上具有内部上拉电阻。这些正是针对这种情况。然后,该电阻位于微控制器内部,您可以在某个位置进行设置以使其启用。唯一需要的外部部件就是按钮本身。

    要记住的另一个有用的变体是低功耗设计,其中按钮可能是可以长时间闭合的开关。在这种情况下,您希望通过上拉电阻的长期平均电流最小。您将其设置得尽可能大,但是这样做有其局限性,也有使其过大的缺点。取而代之的是,您一次仅将上拉开关打开几微秒即可读取按钮。如果您每隔1 ms检查一次按钮,并且上拉持续10 µs,则平均上拉电流将降低100倍。通过外部电阻,您可以使用另一个引脚来驱动上拉电阻的顶部。通过内部上拉,您可以根据需要在固件中启用/禁用它。

  2. 100千欧姆电阻器的电阻是否足以满足当今dsPIC30FXXXX等CMOS器件的要求,而不是大功率应用?


    我已经在这里详细回答


0

比那个简单的设计更好?是。盖上盖子,您将获得一个简单的硬件去抖动开关。

在此处输入图片说明

电容器将是常见的0.1uf陶瓷电容器。电阻为10k。该网站提供了有关原因的完整详细信息。简而言之,防抖电路可以防止微控制器在按下按钮时错误地记录多次按下。电阻/电容设置可平滑按钮的机械弹跳,使其平稳过渡。


电解盖不喜欢被短路。我经常使用100nF,对我的应用程序来说效果很好。
jippie

1
@jippie符号是图像所具有的,但是需要100nf或0.1uf的陶瓷。
路人2013年

3
这不是一个好的反跳电路。首先,这只会反弹一个休息,而不是制造。按下按钮后,盖立即短路。其次,1 ms的时间常数太短而无法使用。第三,仅应将其输入到Schmidt触发输入中。普通输入不喜欢缓慢上升的信号。只需松开盖子,然后在固件中进行反跳操作,即使使用盖子也要执行此操作。
奥林·拉斯罗普

是的,在使电容立即短路时,但是由于弹跳而进行的任何充电均经过低通滤波,从而消除了弹跳的任何影响。也许更准确地说,制造时反跳与休息时反跳是一种非常不同的机制。一毫秒太快了。由于种种原因,我都不喜欢使用该电路。但是,如果您正在使用该引脚驱动中断,则固件防抖动通常不是最佳解决方案。在这种情况下,转移到DPST并使用SR触发器进行反跳是一个很好的方法。
Scott Seidman

0

编辑-我在下面的评论旨在跟进Olin稍后所说的关于带有电容的电路的行为,据说该电容会增加去抖。对不起,它似乎出现在错误的位置-也许有人可以解决此问题,因为我显然太盲目或愚蠢,以至于看不到我应该怎么做!

我同意奥林(Olin)-它不能提供良好的防抖功能。我还要补充一点,如果PCB布局不是很好,将电容器短路会引起很大的电流浪涌,从而使微处理器复位。一些开关需要润湿电流才能正确可靠地工作,而对于某些开关(尤其是薄膜开关),100k可能太高。

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.