如何让我的 atmega328 使用电池运行一年?

电器工程 Arduino 大气压 低电量
2022-01-11 02:15:57

设想

我为我的宿舍创造了一个漂亮的电子门锁。它目前是一个带有伺服 [un]locking 门的 Arduino Diecimila。它有一个带有 3x4 按钮和 5 个 LED(2 个串联对和一个单个 LED)的数字键盘。它目前还可以在手机充电器上运行。

我现在重新设计了它以在独立的 Arduino (ATmega328) 上运行,但我真的很想让它在 AA 电池甚至 9V 电池上运行。

对于软件部分,我想我可以sleep在循环方法中调用某些时间以保持 ATmega 功耗尽可能低。并让 LED 的“闪烁”用尽可能长的时间熄灭。

问题 1

在板子休眠的几毫秒内按下按钮时,它会被“记住”/“保持”直到它从睡眠中醒来,然后在按下按钮时被拾起?

在睡眠时处理此按钮按下的最佳方法是什么?我可以编写它以在按钮活动时唤醒它,还是必须让它休眠例如 10 毫秒。在每个循环中?

问题2

我将如何计算需要多少 AA 电池才能运行该设备 10 个月?

另外,我不知道如何测量每分钟左右的平均用电量,因为它会快速交替等。

设备

我的门锁装置

4个回答

Atmega328 提供六种省电模式,从最低到卓越排序(来自此论坛帖子的估计电流消耗):

  • 睡眠模式空闲:15 毫安
  • SLEEP_MODE_ADC:6.5 毫安
  • SLEEP_MODE_PWR_SAVE:1.62 毫安
  • SLEEP_MODE_EXT_STANDBY:1.62 毫安
  • 睡眠模式待机:0.84 毫安
  • SLEEP_MODE_PWR_DOWN : 0.36 毫安

引用原始问题:

我想我可以sleep在循环方法中调用某些时间

sleep_cpu()需要从上面的列表中设置所需的睡眠模式后使用。Arduino Playground 有一篇关于此的有用帖子

应用程序需要中断驱动,广泛使用上述睡眠模式,并在按钮按下、定时器溢出和看门狗定时器事件时唤醒处理器以实际执行任务。

可以通过以下步骤获得额外的节能效果:

  • 使用微控制器的内部振荡器和低时钟频率(8MHz 而不是 16)——但要确保与时间和时序相关的代码仍按预期工作。为此,可能需要不同版本的引导加载程序。
  • 如果应用程序使用它们,请避免让 LED 长时间亮着。使用持续时间短的快速两次或三次闪光(0.05 秒开,0.5 秒关),其间有几秒钟的间隔,确保以最小的功耗获得明显的指示
  • 如果需要稳压器,请使用开关稳压器而不是线性稳压器。
  • 如果支持,以较低的电压运行微控制器,3.0 伏(例如 CR2032 锂电池,无需调节器)或 3.3 伏而不是 5 伏。
  • 请遵循数据表中关于未使用的输入和输出引脚设置的建议,以最大限度地减少功耗。

结合这些建议,可以在单个 CR2032 纽扣电池上运行微控制器应用数周或数月,在 LR123 型锂电池上运行数年。当然,您的里程可能会因您的应用程序所需的传感器、输出和实际处理而有所不同。

一些有用的参考:

我的办公桌上现在有一个 Arduino Pro Mini,它使用 2 节 AA 电池,如果需要可以运行一年以上。

设计的三个方面实现了这一点。

1. 不同的监管机构

我正在使用 LTC3525 升压稳压器。它具有非常低的静态电流 (7uA) 和高效率 (>90% @ 0.2mA)。像这个 sparkfun board https://www.sparkfun.com/products/8999这样的东西应该做类似的工作。确保将其连接到 Arduino 上的 5V 引脚,而不是 VIN,以便不使用 Arduino 稳压器。

2. 睡眼惺忪

设备处于活动状态的时间比例会很小。其余时间设备应在 SLEEP_MODE_POWER_DOWN 中休眠。您可以根据Rocketscreem 低功耗库建立您的睡眠程序。根据该链接,您应该能够在 ADC、BOD 和 WDT 关闭并处于断电模式的情况下将其降至 1.7uA。

3. 中断

睡眠的另一半是中断以唤醒它。在掉电休眠模式下,只有 INT1 和 INT2 上的电平中断,TWI 匹配,WDT 才会将其唤醒。因此,您需要将按钮连接到 INT1 或 INT2,以便按下按钮将其唤醒。

其他的东西:

除非绝对必要,否则关闭所有 LED。如果锁在室内,则 LED 不必亮,从而节省更多电力。此外,如果您确实需要让 MCU 定期执行某些任务,请使用看门狗定时器定期唤醒它。

编辑:

一种可能有效的方法是使用上面的低功耗库,并借助看门狗定时器在每个循环中休眠 60 毫秒。在唤醒检查按钮按下。要调用的函数是

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

所有这些评论都是现货。我想补充几点建议:

1) 对于 LED,使用高输出 20 mA LED。这是逻辑。假设您想要一个每 8 秒闪烁一次的昏暗状态 LED。你不希望它太亮,所以你使用一些随机的 LED。问题是,昏暗的 LED 仍然使用 20 mA(或更多)来仅输出 100 mcd。取而代之的是,获得额定电流仍为 20 mA 但可以输出 4000 mcd 的高输出 LED(确保查看输出角度,您可能仍然希望它为 30 度或更大)。使用这个 4000 mcd LED,您将其与 3.3 k Ohm 电阻器连接,您可以获得大约 100 mcd 的光输出,但使用的电流小于 1 mA。因此,您使用的不是 20 mA 的状态 LED,而是单个 mA 的一小部分。我通常还将状态 LED 闪烁时间设置为仅 5-15 毫秒,如果您之前将闪烁时间设置为 100 毫秒,这也可以节省大量电量。

2) 我选择的稳压器是 Microchip MCP1700。它仅使用 1.6 µA 的静态电流并且非常便宜(小批量时约为 0.30 美元)。唯一的限制是最大输入电压仅为 6 伏,因此您不能使用 9 伏电池。但是,它非常适合 4 节 AA 电池、单节 LiPo 或两节锂纽扣电池。

3) 为了用 4 节 AA 电池为 ATmega 电路供电,我通常在 VCC 上使用 1N4001 二极管将 4 节电池的最大 6 伏电压降至 5.5 伏。此外,二极管保护 ATmega 免受反向电压的影响,因此它有两个有用的用途。这样做,我可以创建一个电池供电的电路,它可以在睡眠时使用低至 0.1 µA 的电流,因为没有稳压器一直消耗电流。

使用RocketScream LowPower 库对面包板上的裸atmega328P-PU进行了测试

使用了这个草图:

#include "LowPower.h"

void setup(){}

void loop()
{
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);         
    delay(5000);
}

在断电模式下,我使用uCurrent Gold测得 7.25 uA。