聪明的方法来检测按钮(耗电量更少)


28

在一个特定项目的会议中,我被要求考虑使用MCU来检测按钮按下的方式。检测应消耗尽可能少的功率。乍一看,我认为典型的电路具有上拉或下拉功能:

原理图

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

我在这里没有说明一些防弹跳功能,因为这超出了这个问题的范围。在任何一种情况下,按下按钮时,流过的总电流值取决于电阻器的值。为了最小化它(电流),我可以增加电阻值,但不能增加太多,因为如果我对,它还取决于输入引脚的泄漏值。另外,较大的电阻会缓慢恢复。

我的问题是以下问题:检测不消耗功率的按钮(通常用于高功率消耗的应用程序)的聪明方法是什么?按下按钮时,是否有什么方法几乎不会消耗能量?


5
下拉10k几乎不消耗功率。3.3V产生330uA。在大多数现代MCU上,您可以选择在内部设置一个电阻,从而具有更高的电阻。话虽如此,您可以通过BJT或MOSFET激活MCU引脚的按钮电源。仅在读取期间将其激活,然后通过轮询读取。
伦丁

27
@Lundin在“现代”术语,330 A可以是高电流...μ
awjlogan

6
实际上,许多微控制器可以提供低至2-10μA的睡眠电流。一次下拉时要浪费30倍是一件令人遗憾的事情,尤其是在电池供电的情况下。
whatsisname

1
下拉电阻中可以使用多大的电阻取决于引脚阻抗以及它们切换的电压。假设您有一个处于高阻抗状态的3.3v引脚,其开关频率为2.4v,您真正需要的只是阻抗略低于输入阻抗。我建议您安装一个电位计,并测量可用于该引脚的电阻的高值以使其可靠地工作,然后降低其值20%以保持裕量。
醉酒的代码猴子

Answers:


29

我曾经使用的一种低电流方法是在两个微控制器I / O引脚之间连接一个开关。

一个I / O被配置为输出(SWO)。第二个配置为启用可编程内部上拉的输入(SWI)。

开关状态很少(每10毫秒)通过软件中断例程进行采样。读取顺序为:将SWO驱动为低电平,将SWI读取为驱动,将SWO驱动为高电平。

这意味着在扫描过程中,按下的开关仅通过SWI自身和SWO吸收SWI下拉电流的时间不到1 us,而按下的开关则没有吸收电流。每10毫秒<1 us的电流消耗导致很小的平均平均电流消耗。


令人怀疑的是,为什么需要使用此技术进行上拉。顺序SWO低,读SWI,SWO高,SWI读可能足以判断引脚是否连接在一起。您还可以在众多交换机之间共享SWO。
Trevor_G

8
@Trevor在开关断开时让输入悬空并不是一个特别好的主意。根据技术的不同,如果其输入处于中间状态,则可能导致输入缓冲器消耗功率。
RoyC

1
@Trevor有效地将上拉电阻乘以sw1 sw2占空比。仍然使我们回到OP的方案1。它可能在低噪声环境中工作。
RoyC

2
MCU是否必须保持清醒状态以执行轮询而不是仅依靠中断来完全消除较短的开关占空比中的任何节省,这不是事实吗?
AndreKR

5
@AndreKR,您好,我们有一个电池供电的微控制器应用程序,它需要连接多个开关,因此我们使用此技术非常轻松。我们并不仅仅是为了检测开关而安装了MCU。MCU在其10ms中断之间的睡眠模式下消耗了大约900nA的电流,因此节省上拉是值得的。
托尼

23

单刀双掷(š英格尔P OLE d ouble 牛逼 HROW)按钮将你的超高效按钮。

在此处输入图片说明

资料来源:http : //www.ni.com/white-paper/3960/en/

在您的情况下,将1P送至MCU,将1T送至VCC,将2T送至GND。


+1 ..一直让我感到困惑的是,超小型SPDT要么很难找到,要么花费太多……
Trevor_G

1
@Trevor是的...可悲的是有些东西定价过高。而其他商品的价格则偏低(例如MCU)。你不能拥有全部。
哈里·斯文森

这是一个好主意。遗憾的是,我没有找到适合我需求的SPDT CMS按钮。不过,我会牢记这条路线
-vionyst

10

该按钮将被按下多长时间?如果它不是拨动开关(保持其状态)而是瞬时开关,则由于按钮实际闭合的时间短,因此在按下按钮时流过的电流基本上无关紧要。

您显示的两个电路中的任何一个都可以,没关系。

您可以假设输入到MCU输入的泄漏和/或电流可以忽略不计。如今,所有MCU均采用CMOS技术,输入电流几乎为零。所以不要再考虑了,它不存在。

除了使用外部电阻之外,您还可以使用内置在许多MCU输入中的内部上拉电阻。该电阻值可能相对较低(也许为50 kohm),所以当按下按钮时会流过小电流。

您甚至可以安全地使用1 Mohm电阻进行上拉/下拉。仅在非常“脏”(从电气角度而言)的环境中,您可能需要较低的值。您还可以在开关上并联放置一个100 nF电容器,以抑制附近其他电路的干扰。

专家提示:在PCB上为此类电容器保留一个位置,但不要安装盖子。然而。如果出现问题,请放置它,看看是否有帮助。

要检测开关的状态,请使用轮询(如TonyM的回答)或使用interrupt。取决于应用程序(MCU)的功耗哪个更好。


实际上,该按钮只是一个瞬时按钮,但是按下该按钮的时间可能足够长(分钟)
vionyst

如果设备处于24/7开机状态,那么几分钟可能还不算很多。重要的是占空比,每小时5分钟是5 x 60/3600 = 8.3%。因此,即使在电流为100 uA的情况下,在我的方案中,开关平均也会消耗8.3 uA 。我的信息是:不要将注意力集中在按下开关时所使用的电流上,而不必将其与整个系统的电流消耗进行比较。仅当贡献相同时,才有意义的是改善开关的电流消耗。当MCU连续使用1uA时,进行0.1 uA开关是没有用的。
Bimpelrekkie

“当MCU连续使用1uA时,进行0.1 uA开关是没有用的。” 听起来不对。我认为您的意思是1uA峰值。10%只是因为切换会过多;)
Trevor_G

@Trevor不是峰值,我的意思是说MCU的平均电流为1uA ,但按下开关时为0.1uA。结合仅会(相对)短时间按下的0.1 A开关,该开关几乎不会对总平均功耗产生任何作用,因为平均电流为:100%x 1 uA + 8.3%* 0.1 uA = 1.0083 uA (根据以上评论重用了8.3%)。
Bimpelrekkie

2
是的,它的读取就像您在交换机上的平均0.1uA一样。对于拨码开关而言,这并不是没有道理的。
Trevor_G

10

我使用的一种方法是利用CMOS输入的电容特性。

原理图

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

在开关上方的电路中,当闭合时,允许下拉电阻将GPIO的输入电容充电/放电至地电位。

该电路的窍门是利用GPIO的双向特性,以在开关断开时将输入充电至逻辑高电平。

控制例程会定期将引脚变为高电平,或短暂使能上拉,持续足够长的时间以保持对电容的充电。然后,输入引脚就像一个动态存储位,对于大多数设备,将在相当长且可用的时间内保持该电荷。

正确配置后,如果按下按钮,则引脚上的电荷放电将比刷新速率快。然后可以将该条件检测为刷新算法的一部分,作为刷新操作之前的读取,或用于驱动中断。

在刷新脉冲期间短暂使用电源,既可以为电容器充电,也可以通过电阻器进行充电,并在电阻闭合时进行开关。但是,刷新脉冲的长度很短,并且轮询频率导致刷新电流相对较小。

显然,这种方法是一种活跃的方法。如果微型计算机进入睡眠状态,则唤醒后开关的状态将不确定。唤醒后的第一个刷新周期必须忽略引脚读操作。同样,此方法也不应用于唤醒微控制器。上床睡觉之前,也应使该引脚作为低输出,以使其处于零电流状态。

为了读取更多的静态开关,如设置DIP开关,可以使用专用例程,而不是连续的刷新周期。读取后,应将GPIO引脚“停放”在一个有效的低输出状态(零电流),以避免出现浮动输入问题。

注意:如果走线长度较长并且经过嘈杂的区域,则此技术的确会对噪声敏感度造成影响。因此,R1应该靠近输入引脚。但是,除非您在该引脚附近添加额外的电容,否则我不建议您将它挂在前面板上某个距离的开关上。


1
这看起来确实很容易受到EMI的影响。如果有任何形式的无线电能量进入该电路,我认为所有赌注都没有了。如今,无线的好东西并不常见:)
Lundin

@Lundin并没有你想的那么糟。30pF和1兆磁阻是一个很好的滤波器。
Trevor_G

8

如果您的按钮是压电开关,则唯一需要的功率就是按下按钮所产生的功率。

例如:R2 / C1收集按下压电产生的能量。D1防止C1电压过高。释放按钮时,R1排空C1。MCU GPIO必须处于输入,无上拉模式。Voilà,按钮检测,电源消耗零电流。

原理图

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


3
嗯,您能制作/设计一个可行的原型,并用我们过去30年来一直使用的普通开关来展示解决方案的好处吗?
Bimpelrekkie

当然。我添加了示例示意图。简单地建立那个。好处是,在闭合或断开状态下,电源消耗的电流为零。缺点包括无法很好地控制激活开关所需的工作量(有源电路会更好,但是可以抵消电路的很小的好处),并且与30年前的常规开关设计相比,它是一种新颖的设计。
Heath Raftery

尽管如此,我的计算器还是有很多按钮,并且在纽扣电池上运行至少5年。仍然看不到您的解决方案如何带来任何好处。我仍然认为这是不存在的问题的“解决方案”。而且更昂贵。
Bimpelrekkie

1
哦,我同意!它符合“消耗尽可能少的功率”的原始标准,但是很难想象为什么节省不到一毫焦耳实际上是有用的。
Heath Raftery

由于压电的高输出阻抗,MCU的输入阻抗不是很讨厌吗?
Scott Seidman

5

如果设备需要无限期地保持在任何一种状态,则使用SPDT开关将是最低功耗的方法,因为可以制作静态电路以吸收超出其自身和开关内部泄漏电流的电流。SPDT开关的另一个优点是,无论它们以多快的速度操作或触点可能有多弯曲,它们几乎都可以被去抖,前提是只有在一个触点停止跳动之前,另一个触点才开始读为闭合。

有两种连接此类交换机的好方法:

原理图

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

第一种方法需要比第二种方法少一个电阻,但是第二种方法将更能容忍两极之间的重叠(它会吸收比平时更高的电流,但不会使电源完全短路)。请注意,如果开关可以进入长时间处于中等电阻状态,则可能会消耗比平时大得多的电流,但是在正常使用期间,除了两个电阻之间的短暂瞬间外,所有电阻器都不会携带任何大电流。开关改变状态并输出响应的时间。


2

使用微控制器的内部上拉电路,并在检测到按下时禁用上拉电路。然后偶尔重新启用它以检查按钮状态。

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.