Как я могу заставить мой atmega328 работать в течение года на батареях?

Сценарий

Я создал хороший электронный замок для комнаты в общежитии. В настоящее время это Arduino Diecimila с сервоприводом [un], блокирующим дверь. Он имеет цифровую клавиатуру с 3x4 кнопками и 5 светодиодами (2 последовательных пары и один светодиод). Он также в настоящее время работает на зарядном устройстве для мобильного телефона.

Теперь я переработал его для работы на автономном Arduino (ATmega328), но он действительно хотел бы, чтобы он работал на батареях АА или даже на батарее на 9 В.

Для части программного обеспечения я решил, что я мог бы вызвать вызовы sleep для определенных времен внутри метода цикла, чтобы максимально снизить потребление энергии ATmega. И пусть светодиод «вспыхивает» как можно дольше.

Вопрос 1

Когда нажата кнопка в течение нескольких миллисекунд, которые плата спит, будет ли она «запоминаться» /«удерживаться» до тех пор, пока она не выйдет из-под сна, а затем поднимите ее нажатием кнопки?

Каким будет лучший способ справиться с этой кнопкой, нажмите на сон? Могу ли я закодировать его, чтобы проснуться при работе с кнопкой, или я просто позволю ему спать, например. 10m.s. в каждом цикле?

Вопрос 2

Как я подхожу к математике расчета количества батарей АА для запуска этого устройства в течение 10 месяцев?

Кроме того, я не знаю, как измерить среднее потребление энергии в минуту или около того, поскольку оно чередуется быстро и т. д.

Устройство

Устройство блокировки двери

49 голосов | спросил LouwHopley 18 72012vEurope/Moscow11bEurope/MoscowSun, 18 Nov 2012 18:03:29 +0400 2012, 18:03:29

7 ответов


34

Atmega328 обеспечивает шесть режимов энергосбережения, заказанных от минимального до отличного (расчетные текущие расходы от этого сообщения на форуме ):

  • SLEEP_MODE_IDLE: 15 мА
  • SLEEP_MODE_ADC: 6,5 мА
  • SLEEP_MODE_PWR_SAVE: 1,62 мА
  • SLEEP_MODE_EXT_STANDBY: 1,62 мА
  • SLEEP_MODE_STANDBY: 0,84 мА
  • SLEEP_MODE_PWR_DOWN: 0,36 мА

Цитата исходного вопроса:

  

Я решил, что я мог бы вызвать вызовы sleep для определенных времен внутри метода цикла "

Вам нужно будет использовать sleep_cpu () после настройки требуемого режима ожидания из списка выше. На игровой площадке Arduino есть полезное сообщение об этом .

Приложению необходимо управлять прерываниями, широко использовать вышеупомянутые режимы сна и разбудить процессор на нажатие кнопки, переполнение таймера и события сторожевого таймера для фактического выполнения задач.

Дополнительную экономию энергии можно получить с помощью следующих шагов:

  • Используйте внутренний генератор микроконтроллера и низкую тактовую частоту (8 МГц вместо 16), но убедитесь, что код времени и времени по-прежнему работает должным образом. Для этого может потребоваться другая версия загрузчика.
  • Избегайте длительного включения светодиодов, если приложение их использует. Используя быструю двойную или тройную вспышку короткой продолжительности (0,05 секунды, 0,5 секунды), с промежутками между секундами, обеспечивает заметную индикацию с минимальным потреблением энергии.
  • Используйте регулятор переключения вместо линейного, если требуется регулятор.
  • Запустите микроконтроллер при более низком напряжении, если он поддерживается, 3,0 вольт (например, литиевая ячейка CR2032, не требуется регулятор) или 3,3 вольта вместо 5 вольт.
  • Следуйте рекомендациям в таблице данных для неиспользуемых настроек входных и выходных контактов для минимальной потери мощности.

Включение этих предложений позволяет запускать приложения микроконтроллера в течение недель или месяцев на одной ячейке монеты CR2032 и годы на литиевой ячейке типа LR123. Конечно, ваш пробег может варьироваться в зависимости от того, какие датчики, выходы и фактическая обработка вашего приложения требуют.

Некоторые полезные ссылки:

ответил Anindo Ghosh 19 12012vEurope/Moscow11bEurope/MoscowMon, 19 Nov 2012 13:04:13 +0400 2012, 13:04:13
18

У меня есть Arduino Pro Mini на моем столе прямо сейчас, который работает от 2 батарей AA и может работать более года, если потребуется.

Есть три аспекта дизайна, которые достигли этого.

<сильный> 1. Другой регулятор

Я использую регулятор усиления LTC3525. Он имеет очень низкий ток покоя (7uA) и высокий КПД (& gt; 90% @ 0,2 мА). Что-то вроде этой свечной платы https://www.sparkfun.com/products/8999 должно выполнять аналогичную работу. Обязательно подключите его к выходу 5V на Arduino, а не VIN, чтобы регулятор Arduino не использовался.

<сильный> 2. Sleeeeeeep

Доля времени, в течение которого устройство активна, будет небольшим. В остальное время устройство должно спать в SLEEP_MODE_POWER_DOWN. Вы можете основывать свои процедуры сна от Rocketscreem Low Power Library . Согласно этой ссылке вы сможете получить ее до 1.7uA с отключением АЦП, BOD и WDT и в режиме отключения питания.

<сильный> 3. Прерывания

Другая половина сна - это прерывания, чтобы разбудить его. В режиме ожидания «Вниз» только прерывания уровня на INT1 и INT2, соответствие TWI и WDT разбудят его. Поэтому вам нужно иметь кнопку, подключенную к INT1 или INT2, чтобы нажатие кнопки разбудило ее.

Другие вещи:

Отключите все светодиоды, если это абсолютно необходимо. Если замок находится в помещении, светодиоды не должны быть яркими, что позволяет сэкономить больше энергии. Также, если вам нужно регулярно выполнять некоторые задачи MCU, используйте сторожевой таймер, чтобы периодически его разбудить.

Edit:

Один из способов, который может работать, - использовать библиотеку Low Power выше и спать, скажем, 60 мс каждый цикл, благодаря таймеру сторожевого таймера. При пробуждении проверьте нажатие кнопки. Функция для вызова будет

  LowPower.powerDown (SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);
 
ответил geometrikal 19 12012vEurope/Moscow11bEurope/MoscowMon, 19 Nov 2012 12:53:37 +0400 2012, 12:53:37
13

Все эти комментарии находятся на месте. Я хотел бы добавить еще несколько предложений:

1) Для светодиодов используйте светодиоды с высоким выходом 20 мА. Вот логика. Допустим, вам нужен светодиодный индикатор состояния, который мигает каждые 8 ​​секунд. Вы не хотите, чтобы он был ярким, поэтому вы используете случайный светодиод. Проблема заключается в том, что тусклый светодиод по-прежнему использует 20 мА (или более) для вывода только 100 мкдд. Вместо этого получите светодиод с высоким выходом, который по-прежнему рассчитан на 20 мА, но может выводить 4000 мдд (убедитесь, что вы смотрите на выходной угол, вы, вероятно, хотите, чтобы он составлял 30 градусов и более). С этим светодиодом 4000 mcd вы соединяете его с чем-то вроде резистора 3,3 кОм, и вы получаете около 100 мкд света, но используете менее 1 мА. Таким образом, вместо использования 20 мА для светодиода состояния вы используете долю одного мА. Я также обычно устанавливаю светодиодную индикацию состояния во время всего 5-15 мс, что также может сэкономить много энергии, если раньше у вас была вспышка во время 100 мс.

2). Мой регулятор напряжения - Microchip MCP1700. Он использует только 1,6 мкА тока покоя и является супер дешевым (около $ 0,30 в небольших количествах). Единственным ограничением является то, что максимальное входное напряжение составляет всего 6 вольт, поэтому вы не можете использовать 9-вольтовую батарею. Но он идеально подходит для 4 батарей АА, одноядерных LiPo или двух литиевых монет.

3) Для питания схемы ATmega с 4 батареями АА я обычно использую диод 1N4001 на VCC, чтобы сбросить максимум 6 вольт из 4 батарей до 5,5 вольт. Кроме того, диод защищает ATmega от обратного напряжения, поэтому он служит двум полезным целям. Делая это, я могу создать схему с батарейным питанием, которая может использовать всего лишь 0,1 мкА во время сна, поскольку регулятор напряжения постоянно не течет.

ответил Tim Eckel 18 PMpThu, 18 Apr 2013 19:11:53 +040011Thursday 2013, 19:11:53
8

Я провел тест на голой atmega328P-PU на макете, используя библиотека RocketScream LowPower

Используется этот эскиз:

  #include "LowPower.h"

void setup () {}

void loop ()
{
    LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
    Задержка (5000);
}
 

С uCurrent Gold я измерил 7,25 мкА в режиме отключения питания.

ответил Guus 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 10 Sep 2014 23:22:45 +0400 2014, 23:22:45
6

Здесь есть два вопроса, но только второй - это часть названия вопроса, поэтому, вероятно, лучше открыть другой вопрос для программирования Arduino. Я отвечу на второй вопрос.

Одна щелочная батарея 1,5 В переменного тока верхнего уровня имеет емкость около 2600 мАч. Если вы идете на литиевые батареи, вы можете получить около 3400 мАч, если вам повезет. Пойдем с этой фигурой в качестве базовой линии для абсолютного наилучшего случая.

То, как вы вычисляете теоретическое максимальное время работы для загрузки, - это просто емкость, деленная на нагрузку. Если ваш груз равен 1 мА, вы можете запустить его для 3400/1 = 3400 часов = 141 день = ~ 5 месяцев. Тем не менее, это теоретический максимум , так как вы начнете получать значительное напряжение, опустившееся на 65% к тому времени. Если вы регулируете выход, вы получите эффект убегания, когда ниже напряжение батареи, более высокий ток, необходимый для поддержания регулируемого напряжения, который быстрее разряжает батарею. Я был бы удивлен, если вы сможете получить более 80% рекламируемой емкости из-за этого напряжения, достаточно высокого для запуска вашего устройства.

Итак, скажем, вы получаете 80% того времени после снижения напряжения и снижения эффективности регулятора. Предположим, что вы работаете на 3,3 В от трех батарей в серии. Это все равно даст вам такую ​​же мощность, но для регулятора будет достаточно напряжения. Если ваше устройство работает со скоростью 15 мА (это довольно консервативная оценка), они будут выглядеть следующим образом:

  • Емкость после 80% эффективности = 3400 * 0,8 = 2720 мАч
  • Время = 2720/15 = 181 час = 7,54 дней

Таким образом, вам понадобится около 144 литиевых батарей (48 комплектов из 3) для запуска в течение года. Не очень хорошо!

Я бы предложил использовать регулируемое питание постоянного тока от сети. Можно включить резервную батарею, которая легко настраивается с помощью реле SPDT - просто подключите катушку к сетевому постоянному току и подключите «выключенный» контакт к батарее. Когда DC не работает, контакт падает, и вместо этого используется батарея.

ответил Polynomial 18 72012vEurope/Moscow11bEurope/MoscowSun, 18 Nov 2012 22:45:21 +0400 2012, 22:45:21
4

Что-то, о чем никто еще не упомянул: вам нужно как-то отключить питание + 5V, питающее сервопривод, когда вы его не используете. Даже когда он не движется, сервопривод по-прежнему будет потреблять энергию.

A FET с затвором, управляемым выводом ввода /вывода от ардуино, - хороший способ сделать это.

ответил jwygralak67 18 PMpThu, 18 Apr 2013 21:59:28 +040059Thursday 2013, 21:59:28
3

Возможно, вы захотите использовать микроконтроллер, особенно оптимизированный для низкого потребления энергии для вашего следующего дизайна. При низком потреблении энергии необходимо потреблять очень низкую мощность во время сна. Часто упускается из виду, что важно также, как быстро он может проснуться от этого сна.

Что считается, сколько заряда требуется от самого глубокого сна, чтобы справиться с прерыванием быстрее всего (потому что силовой импульс будет очень коротким) и снова вернемся к сна.

Одним из примеров такого микроконтроллера является MSP430 из Texas Instruments. На их веб-сайте вы найдете примечания к приложениям, как использовать программы энергопотребления и энергосбережения.

ответил Peer Stritzinger 27 Maypm13 2013, 21:39:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132