ATmega328P 使用尽可能低的功耗读取 DIP 开关

电器工程 电路设计 设计 低电量
2022-01-31 17:26:59

我目前正在寻找一些关于使我的电路尽可能低功耗的建议。

我需要使用三个 DIP 开关才能在LoRa自定义网络中设置我的 ATmega328P 板的地址。

我已经看到最常用的解决方案之一是将外部上拉电阻连接到 V CC,如下所述:

上拉开关

...但是,这种方法对我的目的来说效率极低(我的硬件在深度睡眠期间需要达到 1-5 µA 的电流消耗)。

所以,我的意图是去掉外部上拉电阻,使用 ATmega328P 数字输入的内部上拉电阻。

这种方法将允许我仅在需要读取开关状态时启用内部上拉电阻(在启动期间非常有限的时间)。

因此,从理论上讲,这将是非常高效且低功耗的。

这将是生成的示意图(取自此处):

内部上拉电阻

这是我解决这个问题的想法。无论如何,我还没有测试过。如果有人能分享他们对此的想法,我会很高兴。

4个回答

我不建议关闭引体向上。这有两个问题:

  • 输入引脚容易受到噪声拾取
  • 该引脚可以浮动到中间状态,从而导致输入缓冲器功率增加

如果您可以多留一个引脚,请将开关公共端连接到该引脚而不是 GND,并且仅在读取开关时将该公共端驱动为低电平。然后在非读取时间期间,引脚总是通过上拉(开关打开)或驱动高电平(开关关闭)连接,但没有任何待机绘制。像这样:

示意图

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

即便如此,内部上拉(30K 或更多)还是有点弱,特别是如果它要部署在恶劣的环境中。在引脚上添加一些电容(30pF 左右)将绕过来自引脚的噪声并提高其抗扰度。您还可以在非读取时间将引脚切换到输出模式,以获得最佳的抗噪能力。

但是为什么要使用 DIP 开关呢?也许完全取消它们并将此状态与您的其他设备配置信息一起存储在 EEPROM 中。

但是……为什么还要为此烦恼呢?利用它是具有唯一 ID 的无线连接设备这一事实。想法:使用 LoRa 设备唯一标识符 (DevEUI) 并在安装时在应用程序级别分配其物理位置。如果节点间距很大,请使用地理位置坐标;如果它们是紧密阵列的一部分,请在工厂或设备上使用一些网格位置。

更多关于 LoRa 寻址的信息:https ://www.thethingsnetwork.org/docs/lorawan/addressing/

最后,一点不请自来的建议。作为硬件人员,很容易陷入直接的、看似显而易见的解决方案,就像 DIP 开关、跳线等经常出现的那样。我鼓励您跳出硬件框框思考,转而寻求软件解决方案。PC 行业多年来一直在为跳线和交换机苦苦挣扎,直到终于有人说“够了”,Plug'n'Play 及其后代(PCMCIA、Cardbus 和 PCIe CIS)应运而生。

tl; 博士:跳线是邪恶的。如果可以,请避免使用它们。

这将起作用。输入引脚上的内部上拉就是这样使用的。选择可以设置为输入和输出的 I/O 引脚,当不读取开关时(99% 的时间),您可以将该引脚设置为输出并将其驱动为低电平以消除通过内部上拉的电流UPS。

如果您查看数据表第 35.6 节,您会发现对于您的用例,上拉电流不可忽略 - 如果输入接地,2.7V 时为 75uA,5V 时为 140uA。内部上拉电阻指定为 20 至 50kOhms (30.2)。

没有指定输入阻抗,但引用“模拟输入电阻”为 100MO,GPIO 漏电流为 1uA。所以使用一个非常高的值(1MO)的外部上拉是安全的。我不会超过这个,因为噪音很容易被拾取,尤其是在长引线和/或附近有收音机的情况下。

长话短说:为了最大限度地简化,我只会在读取数据时启用内部引体向上。为了更好的可靠性,我会使用 200k-1M 外部上拉电阻。

使用上拉电阻到微型 VCC 或使用端口上拉电阻。开关的另一侧连接到端口引脚。当您想读取时将端口切换为低电平,然后再次将其设置回高电平。如果您有一个驱动指示器的端口引脚,它可以用于开关控制,但您需要小心一点。如果通过将端口引脚驱动为低电平来点亮指示灯,则说明它已完成,否则您需要反转极性。在正常操作期间,交换机将不关心端口在做什么,并且在设置期间,周期将足够快,指示灯会非常快地闪烁。