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

51

сценарий

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

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

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

Вопрос 1

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

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

вопрос 2

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

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

Устройство

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

LouwHopley
источник

Ответы:

35

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 Playground есть полезный пост об этом .

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

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

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

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

Несколько полезных ссылок:

Аниндо Гош
источник
Исходя из моего опыта, в SLEEP_MODE_PWR_DOWN вы можете уменьшить его до 0,1–6,0 мкА, если вы умели отключать каждую мелочь (например, обнаружение потери мощности). Я создал сборки, которые используют менее 60 мкА, которые работают 3-5 лет на комплекте щелочных батарей типа АА.
Тим Экель
@TimEckel Я без ума от индикации состояния со светодиодами - это съедает бюджет мощности, как будто он выходил из моды.
Аниндо Гош
3
Это не обязательно. Используйте мощные светодиоды с высоким сопротивлением. Будет использоваться доля мА вместо более 20 мА. Кроме того, мигайте светодиод состояния в течение 5–15 мсек каждые несколько секунд вместо того, чтобы постоянно гореть. У меня был дешевый тусклый светодиодный индикатор состояния, который использовал 30 мА, я сменил его на мощный светодиод с резистором 3,3 кОм, который я мигал в течение 15 мс каждые 8 ​​секунд. От 30 мА до 2,9 мкА среднего тока, 1/1000 от мощности!
Тим Экель
4
@TimEckel Вы явно не понимаете степень моей страсти к мерцанию огней :-D Я не хочу уменьшать интенсивность, мне нравятся те мелочи, которые сверкают, как пламя Аида, запас энергии! На более серьезной ноте: я знаю об этих маленьких уловках, и фактически сделал несколько моих собственных, которые увеличивают воздействие визуальной тревоги, уменьшая мощность через светодиоды. Этот предыдущий комментарий был ( только частично ) в шутку, чтобы ответить на многие забавные светодиодные вопросы, на которые я отвечаю здесь.
Аниндо Гош
3
Я измерил энергопотребление ATMega328P при разных напряжениях и частотах и ​​сделал эту диаграмму docs.google.com/spreadsheets/d/…
Cano64
19

Сейчас у меня на столе Arduino Pro Mini, который работает от 2 батареек АА и может работать более года, если это необходимо.

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

1. Другой регулятор

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

2. Sleeeeeeep

Доля времени, в течение которого устройство активно, будет небольшой. В остальное время устройство должно спать в SLEEP_MODE_POWER_DOWN. Вы можете основывать свои режимы сна из Библиотеки малой мощности Rocketscreem . Согласно этой ссылке, вы сможете снизить ее до 1,7 мкА с отключенными АЦП, БПК и WDT и в режиме отключения питания.

3. Прерывания

Другая половина сна прерывается, чтобы разбудить его. В спящем режиме Power Down только прерывания уровня на INT1 и INT2, TWI совпадают, и WDT разбудит его. Таким образом, вам нужно подключить кнопку к INT1 или INT2, чтобы нажатие кнопки активировало ее.

Другие вещи:

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

Редактировать:

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

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);
geometrikal
источник
14

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

1) Для светодиодов используйте мощные светодиоды 20 мА. Вот логика. Допустим, вам нужен неяркий индикатор состояния, который мигает каждые 8 ​​секунд. Вы не хотите, чтобы он был ярким, поэтому вы используете какой-то случайный светодиод. Проблема в том, что тусклый светодиод все еще использует 20 мА (или больше) для вывода только 100 мкд. Вместо этого возьмите светодиод высокой мощности, который по-прежнему рассчитан на 20 мА, но может выдавать 4000 мкд (убедитесь, что вы смотрите на выходной угол, вы все равно, вероятно, хотите, чтобы он был 30 градусов или больше). С этим светодиодом 4000 мкД вы подключаете его к чему-то вроде резистора 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 мкА во время сна, поскольку регулятор напряжения не потребляет ток все время.

Тим Экель
источник
8

Я провел тест на чистом atmega328P-PU на макете с использованием библиотеки RocketScream LowPower

Использовал этот эскиз:

#include "LowPower.h"

void setup(){}

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

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

Гус
источник
1
Приятно! Я попробую это как можно скорее. Позволяет ли это работать atmega238 в течение многих лет с батареей CR2032?
Basj
6

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

Единая щелочная 1,5-вольтовая батарея типа AA емкостью около 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 - просто подключите катушку к источнику постоянного тока и подключите «выключенный» контакт к батарее. Когда происходит сбой постоянного тока, контакт падает и вместо него используется батарея.

многочлен
источник
Мои беспроводные мечты рушатся;) Спасибо за подробный ответ. Это тоже показалось мне лучшим вариантом.
LouwHopley
По совпадению, это был тот же вопрос, который я задавал себе при разработке электронного дверного замка. Даже с компактной перезаряжаемой батареей емкостью 10 000 мАч оно того не стоило. Закончилось только использованием адаптера постоянного тока 250 мА и аккумулятора старого мобильного телефона в качестве резервного.
Полином
4
15 мА в среднем не звучит очень консервативно для меня! 328 могут работать с однозначными микроамперами в спящем режиме, и, конечно же, вам будет достаточно, если вы будете в нем, по крайней мере, в полуглубоком сне. Кроме того, на низких частотах (например, 0,5 МГц) вы можете обойтись с <1 мА в активном режиме. Конечно, другие компоненты (регуляторы напряжения и т. Д.) Должны быть выбраны в соответствии с природой малой мощности.
Exscape
4
@Polynomial Я не очень внимательно смотрел на схему, но, безусловно, проект можно было бы построить без «индикатора мощности». Или вы можете мигать, чтобы он включался, например, на половину яркости (через ШИМ), скажем, только на 25 мс каждые 2 секунды, так что текущее использование упадет в среднем до ~ 0,09 мА вместо 15.
exscape
1
Arduino жаждет власти. Построение вашей собственной доски решило бы это. Atmega328 потребляет 0,2 мА при 32 кГ и 0,75 мкА в режиме энергосбережения.
Vorac
4

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

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

jwygralak67
источник
Я обычно использую 2N3904 для каждого датчика или что-то еще, чтобы включить / выключить его. Или, если датчик имеет низкое энергопотребление и то же напряжение, что и то, что я использую в ATmega, я просто использую контакт непосредственно для контроля состояния питания.
Тим Экель
1
Используйте 2n7000, чтобы использовать значительно меньше энергии, чем 2n3904, и вам не нужен базовый резистор.
Джон Мичам
3

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

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

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

Пер Стритцингер
источник