Энергопотребление Arduino
Как известно, микроконтроллеры ATmega (а соответственно и Arduino) имеют различные режимы энергосбережения. Некоторые из них отключают только некоторые неиспользуемые компоненты микроконтроллера (ADC, SPI, TWI, USART и т.д.). Некоторые — полностью вводят процессор в режим сна, из которого его можно вывести либо по таймеру, либо по внешнему прерыванию. Применение этим режимам можно найти в устройствах, питающихся автономно от батарей (возможно напишу об этом более подробно в одной из статей). А пока я решил просто измерить энергопотребление Arduino в каждом из режимов.
Итак, для начала замерим силу тока питания Arduino в обычном режиме во время выполнения пустого цикла.
1 2 3 4 5 6 7 8 9 | void setup() { while (1) {} } void loop() { } |

Теперь загрузим микроконтроллер работой, а именно — заставим его вычислять простые числа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | long i = 1000000; //начинаем с миллиона void setup() { } long found = 0; void loop() { is_prime(i); i++; } int is_prime(long num) { int upper = sqrt(num); for (long cnum = 2; cnum <= upper; cnum++) { long mod = num % cnum; if (mod == 0) { //not simple return 0; } } //simple return 1; } |
Теперь переходим собственно к режимам энергосбережения. Итак, первый режим — понижение тактовой частоты. Данный скетч демонстрирует перевод микроконтроллера на пониженную частоту работы = 62.5 КГц (штатная = 16 МГц). При этом скорость работы резко замедляется, а потребление энергии уменьшается, что видно по графику.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | void setup() { delay(10000); pinMode(13, OUTPUT); noInterrupts(); CLKPR = 1<<CLKPCE; CLKPR = 8; interrupts(); } void loop() { digitalWrite(13, HIGH); delay(50); digitalWrite(13, LOW); delay(50); } |
Замерим ток, когда светодиод на 13 выводе погашен:
Теперь код, который не изменяет скорости работы, но может полностью приостановить любую деятельность процессора, до наступления определённого события:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /* 5 режимов энергосбережения: SLEEP_MODE_IDLE SLEEP_MODE_ADC SLEEP_MODE_PWR_SAVE SLEEP_MODE_STANDBY SLEEP_MODE_PWR_DOWN */ #include <avr/sleep.h> extern volatile unsigned long timer0_millis; void setup() { pinMode(13, OUTPUT); interrupts(); } void loop() { while(timer0_millis < 5000) { set_sleep_mode(SLEEP_MODE_IDLE); // выбор режима sleep_mode(); // уходим в спячку } timer0_millis = 0; // сброс счётчика bitSet(PINB, 5); // переключение светодиода } |
SLEEP_MODE_IDLE:
SLEEP_MODE_ADC:
SLEEP_MODE_PWR_SAVE:
SLEEP_MODE_STANDBY:
SLEEP_MODE_PWR_DOWN:
И теперь график этих 5 режимов:
Сводная таблица:
Режим | Сила тока, миллиампер |
---|---|
Пустой цикл | 22.68 |
Простые числа | 23.81 |
Снижение частоты | 14.45 |
SLEEP_MODE_IDLE | 17.52 |
SLEEP_MODE_ADC | 15.29 |
SLEEP_MODE_PWR_SAVE | 12.82 |
SLEEP_MODE_STANDBY | 12.79 |
SLEEP_MODE_PWR_DOWN | 11.69 |

Как мы видим, энергопотребление Arduino в различных режимах может различаться более чем в два раза, что в некоторых случаях позволяет экономить заряд батарей в автономных устройствах. К сожалению не все режимы возможно применить в большинстве устройств, так как некоторые из них переводят микропроцессор в «глубокий сон» из которого его можно вывести лишь внешними «раздражителями» — прерываниями. Для создания электронных часов вполне можно использовать понижение частоты, иногда повышая её для чтения данных из RTC и обновления показаний.
Комментарии

Спасибо за инфо;)
Всегда пожалуйста ?
Здравствуйте!
Помогите пожалуйста с проблемой!
Понизил частоту как на примере, только забыл задать паузу в начале.
(Arduino Pro Mini 5v 16Mhz Atmega168PA)
Сейчас не могу прошить программатором USBasp (прошивка обновлённая)
Что то для power_down слишком большое потребление энергии. У меня в этом режиме потребление 0.3мА, что даже много.
Чуть позже ещё замерю у MEGA 2560.
Подскажите пожалуйста как замеряли потребление?
Судя по картинке — это какая-то софтина.
Замерял цифровым мультиметром, который подключается к компьютеру. Подробнее про него тут: http://19dx.ru/2013/10/obzor-cifrovogo-multimetra-va-va18b/
а не замеряли при пониженой частоте и энергосберегающем режиме?
А то мне надо запитать про-мини 3.3 от литиевых таблеток ?
не хочется мастерить на тиньке
Измерял только при тех режимах, которые перечислены в статье ?
Вы зря брали для замеров стандартную Ардуину (аналог UNO, насколько я понимаю). У большинства Ардуин стоит неотключаемый встроенный конвертер usb-serial который жрет сам по себе много, да и просто светодиод питания у большинства Ардуин подключен через 1к то есть жрет 5ма. Нужно брать или голый чип с минимальной обвязкой или хотя бы Pro Mini (у нее нет преобразователя сериала и светодиод через 10к). Кроме того, снижение вольтажа до 3.3 тоже сильно помогает. Тест 62 килогерц на Pro Mini 3.3v дает 2.5 ма при потушеном диоде и 6.5 ма при горящем. Тест засыпание в SLEEP_MODE_PWR_DOWN дает на ней 1.25 ма. На стандартном блинке у нее примерно 5 ма + светодиод (тут уж какой воткнете, родной жрет много). То есть на стандартных Ардуинках экономия смысла не имеет, но при правильном подходе все Ваши приемы позволяют сильно сэкономить.
Спасибо! Приму к сведению. Как будет время — повторю эксперимент с минимальной обвязкой.
Да я вот пробовал различную программую спячку и отключение внутренних устройств. Первым делом таже мысль пришла. Адруино выключается, а диод на питании горит, хотя он жрёт неплохо.
Надо какой-то аппаратный счётчик на питание вешать. Чтобы по таймеру включал питание, а по команде с провода выключал. Там как я понимаю одной микросхемой обойтись можно, но я пока не представляю как это сделать..
Светодиод можно и убрать. Для управления питанием можно любой МК использовать. Вот только смысл? Вторая микросхема ведь тоже будет питание потреблять.
Светодиод можно и убрать. Для управления питанием можно любой МК использовать. Вот только смысл? Вторая микросхема ведь тоже будет питание потреблять.
Ну вот не обязательно целый МК. Есть всякие микрухи таймеры навроде NE555. Повесил на питание: она ждёт ждёт, включает напряжение. Потом программа делает всё свои дела, кидает 5 вольт на проводок, напряжение выключили, ждём дальше. Вроде просто, может конкретно на эта делать не походит, но что-то простое придумать наверное можно.
У МК вот пойди ещё догадайся что ты перед спячкой всё что надо в кристалле выключить успел. А тут всё наверняка. А потребление у таймера и МК ещё сравнить надо. Вдруг меньше..
Я вот собрал передатчик на Mini. Вот ещё что подумал. У меня же из ардуины провода на 5 или 3 вольта торчат. А там пару датчиков и приёмник, кристал я гашу, а датчики всё равно висят — батарейку хавают. Это тоже без дополнительных деталей сложно решить.
Для отключения дополнительных устройств можно использовать транзисторы. Управлять с основного МК.
Если датчики не сильно жрущие, то их можно от ног проца питать, когда надо включать и выключать перед сном.
Глубокий сон у атмеги8 — потребление по даташиту 500мкА