我如何让atmega328依靠电池运行一年?


51

情境

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

我现在已经对其进行了重新设计,使其可以在独立的Arduino(ATmega328)上运行,但是我真的很希望它可以在AA电池甚至9V电池上运行。

对于软件部分,我认为我可以sleep在循环方法内放置一定时间的调用,以保持ATmega功耗尽可能低。并让LED的“闪烁”时间尽可能长。

问题1

如果在板子进入休眠状态的几毫秒内按下一个按钮,它会被“记住” /“保持”直到它退出睡眠状态,然后在按下按钮时被拿起吗?

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

问题2

如何计算要在10个月内使用此设备需要使用几节AA电池的数学方法?

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

设备

我的门锁装置

Answers:


35

Atmega328提供了六种省电模式,从最小到出色(从此论坛帖子估算的电流消耗)排序:

  • SLEEP_MODE_IDLE:15 mA
  • SLEEP_MODE_ADC:6.5 mA
  • SLEEP_MODE_PWR_SAVE:1.62 mA
  • SLEEP_MODE_EXT_STANDBY:1.62 mA
  • SLEEP_MODE_STANDBY:0.84 mA
  • SLEEP_MODE_PWR_DOWN:0.36 mA

引用原始问题:

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

您可能需要使用sleep_cpu()设定您所需要的睡眠模式,从上面的列表后。Arduino Playground有一篇关于此有用文章

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

通过以下步骤可以进一步节省功率:

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

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

一些有用的参考:


根据我的经验,在SLEEP_MODE_PWR_DOWN中,如果您精通关闭所有小事(例如掉电检测),则可以将其降至0.1uA至6.0uA。我用一组碱性AA电池创建了使用时间不到3-5年的耗电量不到60uA的电池。
Tim Eckel 2013年

@TimEckel我为通过LED指示状态而疯狂-就像过时的那样消耗了功率预算。
Anindo Ghosh

3
不必。使用高电阻的高功率LED。将使用几分之一毫安而不是超过20毫安。另外,每隔几秒钟使状态LED闪烁5-15毫秒,而不是持续点亮。我有一个便宜的调暗状态LED,它使用30 mA电流,我将其改为具有3.3k Ohm电阻的高功率LED,该电阻每8秒闪烁15 ms。从30 mA降低到2.9 uA的平均电流,是电源的1000/1000!
蒂姆·埃克尔

4
@TimEckel您显然不明白我对闪烁的灯光的热情程度:-D并不是我想降低强度,我喜欢像Hades的火焰那样闪闪发光的小东西,功率预算实在令人惊讶!更严重的一点是:我知道这些小技巧,实际上是我自己设计的一些技巧,这些技巧增加了视觉警报的影响,同时减少了通过LED的功率。前面的评论只是(部分地)是开玩笑,与在这里回答的许多有趣的LED问题一起
Anindo Ghosh 2013年

3
余测量在不同的电压和频率的ATMEGA328P功耗和使这个图表docs.google.com/spreadsheets/d/...
Cano64

19

我现在在桌上有一块Arduino Pro Mini,它用2节AA电池供电,如果需要,可以使用一年以上。

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

1.不同的调节器

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

2. Sleeeeeeep

设备处于活动状态的时间比例很小。在其余时间中,设备应在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);

14

所有这些评论都是当场的。我想补充一些建议:

1)对于LED,请使用高输出20 mA LED。这是逻辑。假设您要使状态LED每8秒闪烁一次。您不希望它变亮,所以使用一些随机的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电池,一个锂电池或两个锂纽扣电池。

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


8

我使用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。


1
真好!我会尽快尝试。这是否允许使用CR2032电池在atmega238上运行多年?
巴吉(Basj)'17

6

这里有两个问题,但是只有第二个确实是问题标题的一部分,因此,如果您为Arduino编程问题打开另一个,可能会更好。我将在这里回答第二个问题。

单个高端碱性1.5V AA电池容量约为2600mAh。如果您购买锂电池,那么幸运的话,您可以得到3400mAh左右的电量。让我们以该数字作为绝对最佳情况的基准。

计算负载理论最大运行时间的方式就是将容量除以负载。如果负载为1mA,则可以运行3400/1 = 3400小时= 141天=〜5个月。但是,这只是理论上的最大值,因为到那时您将开始获得大约65%的明显电压下降。如果要调节输出,则会产生失控效应,其中电池电压越低,维持稳定电压所需的电流就越大,这会更快地消耗电池电量。如果您能用足以使设备运行的电压从其中获得80%以上的广告容量,我会感到惊讶。

因此,假设您在电压下降和稳压器无效之后获得了80%的时间。我们假设您使用三节串联电池以3.3V运行。这仍将为您提供相同的容量,但电压足以满足稳压器的需求。如果您的设备以15mA的电流运行(这是一个相当保守的估计),数字将如下所示:

  • 80%效率后的容量= 3400 * 0.8 = 2720mAh
  • 时间= 2720/15 = 181小时= 7.54天

因此,您需要大约144个锂电池(48组3节)来运行一年。不太好!

我建议改为使用来自市电的稳压直流电源。可以包括备用电池,可以使用SPDT继电器轻松设置备用电池-只需将线圈连接到电源DC并将“断开”触点连接到电池即可。当直流电发生故障时,触点会掉落,而是要使用电池。


我无绳的梦想被粉碎了;)感谢您的详细回答。对我来说,这也是最好的选择。
LouwHopley 2012年

巧合的是,这是我在设计电子门锁时向自己提出的相同问题。即使使用笨重的10,000mAh可充电电池也不值得。最终仅使用250mA DC适配器和旧的手机电池作为备份。
多项式2012年

4
15 mA的平均值对我来说并不十分保守!328可以在睡眠模式下以个位数的微安运行,并且肯定可以在很多时候让它至少处于半深睡眠状态。同样,在低频(例如0.5 MHz)下,您可以在活动模式下获得<1 mA的电流。当然,需要选择其他组件(稳压器等)以适应低功率的要求。
退出2012年

4
@多项式我没有仔细看原理图,但是可以肯定的是,该项目可以在没有“电源LED”的情况下构建。或者你可以眨眼,所以它的上例如,在一半亮度(通过PWM),只为说25毫秒每2秒,这样,目前的使用将下降到平均〜0.09毫安,而不是15
exscape

1
Arduino非常耗电。建立自己的董事会将解决此问题。在省电模式下,当32kH和0.75 uA时,Atmega328消耗0.2 mA。
Vorac 2012年

4

还没有人提到:不使用伺服器时,您需要某种方法来关闭+ 5V电源为伺服器供电。即使不移动,伺服仍会消耗功率。

栅极由arduino的I / O引脚控制的FET是实现此目的的好方法。


我通常将2N3904用于每个传感器或用于打开/关闭它的任何东西。或者,如果传感器是低功率的,并且电压与我运行ATmega的电压相同,则只需直接使用一个引脚即可控制电源状态。
Tim Eckel 2013年

1
与2n3904相比,使用2n7000所消耗的功率要少得多,并且不需要基极电阻。
John Meacham 2014年

3

您可能会考虑使用经过特别优化的微控制器,以用于下一个设计。为了降低功耗,有必要在睡眠时消耗非常低的功率。通常被忽视的是,从睡眠中唤醒的速度也很重要。

重要的是从最深的睡眠到尽可能快地处理一个中断需要花费多少电荷(因为此时功率突发将非常短),然后再次进入睡眠状态。

这种微控制器的一个例子是德州仪器(TI )的MSP430。在他们的网站上,您将找到有关如何保存能源和能源收集应用的应用说明。

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.