Як я можу змусити мій atmega328 працювати протягом року на батареях?


51

Сценарій

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

Зараз я переробив його для роботи на автономному Arduino (ATmega328), але дуже хотів би, щоб він працював на батареях АА або навіть на 9 В.

Що стосується програмної частини, я подумав, що я можу sleepпевний час ставити дзвінки всередині методу циклу, щоб максимально знизити енергоспоживання ATmega. І нехай світлодіод "спалахує" з якомога довшим вимкненим часом.

питання 1

Якщо протягом декількох мілісекунд, на яких дошка спить, натискається кнопка, чи буде вона «запам’ятата» / «утримана», поки не вийде зі сну, а потім буде знята як натискання кнопки?

Що було б найкращим способом обробляти це натискання кнопки уві сні? Чи можу я зашифрувати його, щоб прокинутися при натисканні кнопки, або я повинен просто дати йому спати, наприклад, 10 м. в кожну петлю?

Питання 2

Як би я підійшов до математики підрахунку, скільки батарей типу АА потрібно для роботи цього пристрою протягом 10 місяців?

Крім того, я не знаю, як виміряти середнє споживання енергії в хвилину або близько того, оскільки воно швидко чергується і т.д.

Пристрій

Мій пристрій блокування дверей

Відповіді:


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 є корисна публікація з цього приводу .

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

Додаткову економію електроенергії можна отримати, виконавши наступні кроки:

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

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

Деякі корисні посилання:


З мого досвіду, в SLEEP_MODE_PWR_DOWN ви можете зменшити його до 0,1uA до 6,0uA, якщо ви були розумні щодо відключення кожної дрібниці (наприклад, виявлення коричневого кольору). Я створив конструкції, які використовують менше 60uA, які тривають 3-5 років на наборі лужних батарей AA.
Тім Еккель

@TimEckel Я божеволію вказувати на статус зі світлодіодами - той харчується енергетичним бюджетом так, як це виходило зі стилю.
Анніндо Гош

3
Це не обов'язково. Використовуйте потужні світлодіоди з високим опором. Буде використовувати фракцію ма, замість понад 20 мА. Також спалахуйте світлодіод стану протягом 5-15 мс кожні кілька секунд, а не постійно вмикайте. У мене був дешевий світлодіодний індикатор стану, який використовував 30 мА, я змінив його на потужний світлодіод з резистором 3,3 к Ом, який миготів 15 мс раз на 8 секунд. Пішли від 30 мА до 2,9 мкА середнього струму, 1/1000 потужності!
Тім Еккель

4
@TimEckel Ви явно не розумієте ступеня моєї пристрасті до мерехтливих вогнів :-D Це не так, якби я хочу знизити інтенсивність, мені подобається, що ці дрібниці блищать, як полум’я Гадеса, бюджет енергії затьмарений! Що стосується більш серйозної уваги: ​​я знаю ті маленькі хитрощі, і насправді створив кілька моїх власних, які збільшують візуальну тривогу, зменшуючи потужність за допомогою світлодіодів. Цей попередній коментар був ( лише частково ) жартівливим, щоб відповісти на багато цікавих питань щодо світлодіодів, на які я тут відповідаю.
Anindo Ghosh

3
Я виміряв енергоспоживання ATMega328P при різних напругах і частотах і склав цю діаграму docs.google.com/spreadsheets/d/…
Cano64

19

На моєму столі зараз є Arduino Pro Mini, який розряджає 2 батарейки АА і може заряджатися більше року, якщо потрібно.

Є три аспекти дизайну, які цього досягли.

1. Інший регулятор

Я використовую регулятор посилення LTC3525. Він має дуже низький струм спокою (7uA) та високий ККД (> 90% @ 0,2mA). Щось на кшталт цієї дошки для мікрофонів https://www.sparkfun.com/products/8999 слід виконати подібну роботу. Переконайтесь, що підключіть його до 5-контактного штифта на Arduino, а не VIN, щоб не використовувався регулятор Arduino.

2. Sleeeeeeep

Частка часу роботи пристрою буде невеликою. Решту часу пристрій повинен спати в SLEEP_MODE_POWER_DOWN. Ви можете базувати свої режими сну в бібліотеці з низькою потужністю Rocketscreem . Відповідно до цього посилання, ви повинні мати можливість знизити його до 1,7uA з вимкненням ADC, BOD та WDT та в режимі відключення живлення.

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

Інша половина сну переривається, щоб його розбудити. У режимі сну вимкнення живлення перериває лише рівень рівня INT1 та INT2, TWI, і WDT розбудить його. Тому вам потрібно мати кнопку, підключену до INT1 або INT2, щоб натискання кнопки розбудило її.

Інші речі:

Вимикайте всі світлодіоди, якщо це абсолютно не потрібно. Якщо замок знаходиться в приміщенні, світлодіоди не повинні бути яскравими, економлячи більше енергії. Крім того, якщо вам потрібно регулярно виконувати якесь завдання, використовуйте таймер сторожового часу, щоб періодично його пробуджувати.

Редагувати:

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

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

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 батарейок типу AA, однієї комірки 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 я вимірював 7,25 мкА в режимі відключення живлення.


1
Приємно! Я спробую це якомога швидше. Чи дозволяє це запускати atmega238 роками з батареєю CR2032?
Бась

6

Тут є два питання, але лише друге справді є частиною заголовка питання, тому, мабуть, краще, якщо ви відкриєте ще одне для питання програмування Arduino. Я відповім на друге питання тут.

Одномісний лужний акумулятор 1,5 В АА має верхню частину ємністю близько 2600mAh. Якщо ви їдете на літієві батареї, ви можете отримати близько 3400mAh, якщо пощастить. Давайте почнемо з цією цифрою як базовою лінією для абсолютного найкращого випадку.

Спосіб обчислення максимального теоретичного часу для навантаження - це просто потужність, поділена на навантаження. Якщо ваше навантаження становить 1 мА, ви можете працювати за 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 - просто підключіть котушку до мережі постійного струму і підключіть "вимкнений" контакт до акумулятора. Коли постійний струм виходить з ладу, контакт падає, а замість нього використовується батарея.


Мої акумуляторні мрії руйнуються;) Дякую за детальну відповідь. Мені це здалося також найкращим варіантом.
LouwHopley

Випадково це було те саме питання, яке я ставив собі при проектуванні електронного замка дверей. Навіть з приємною акумуляторною батареєю в 10000 мАг це не варто. Закінчилося лише використанням адаптера постійного струму 250 мА та старого акумулятора мобільного телефону в якості резервної копії.
Поліном

4
В середньому 15 мА для мене не дуже консервативно! 328 може працювати в режимі сну на одноцифрових мікроампер, і, безумовно, ви могли б уникнути, якщо ви хоч багато часу просиджуєте напівглибокий сон. Крім того, при низьких частотах (наприклад, 0,5 МГц) ви можете обійтись з <1 мА в активному режимі. Звичайно, інші компоненти (регулятори напруги тощо) потрібно вибирати відповідно до характеру малої потужності.
exscape

4
@ Polynomial Я не придивився до схематично, але, безумовно, проект можна було б побудувати без "світлодіодного індикатора". Або ви могли б мерехтіти його, так що це на , наприклад , при половинній яскравості (через PWM), тільки говорять 25 мс кожні 2 секунди, таким чином, що поточне використання знизиться в середньому ~ 0,09 мА замість 15
exscape

1
Ардуїно голодний до влади. Створення власної ради вирішило б це. Atmega328 витягує 0,2 мА при 32 кГ та 0,75 мА в режимі економії енергії.
Vorac

4

Щось ще ніхто не згадував: Вам потрібно мати якийсь спосіб відключити джерело живлення + 5 В, що живить сервопривід, коли його не використовуєте. Навіть коли він не рухається, сервоприймач все одно буде черпати потужність.

FET з воротами, що управляються штифтом вводу / виводу з ардуїно, - хороший спосіб зробити це.


Зазвичай я використовую 2N3904 для кожного датчика або будь-якого іншого для його включення / вимкнення. Або, якщо датчик малопотужний і такої ж напруги, що і у мене в ATmega, я просто використовую штифт безпосередньо для контролю стану живлення.
Тім Еккель

1
Використовуйте 2n7000, щоб використовувати значно меншу потужність, ніж 2n3904, і вам не потрібен базовий резистор.
John Meacham

3

Ви можете розглянути можливість використання мікроконтролера, який особливо оптимізований для низького енергоспоживання для наступного дизайну. Для низького енергоспоживання потрібно спати дуже низьку потужність. Що часто не помічають - це також важливо, наскільки швидко він може прокинутися від цього сну.

Що важливо - це скільки заряду потрібно від найглибшого сну, щоб впоратися з швидким можливим перериванням (адже сплеск живлення буде дуже коротким) і повернутися знову до сну.

Одним із прикладів такого мікроконтролера є MSP430 від Texas Instruments. На їхньому веб-сайті ви знайдете примітки про застосування, як заощаджувати енергію та додатки для збору енергії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.