Энергопотребление Arduino

Измеряем энергопотребление в различных режимах
Как известно, микроконтроллеры ATmega (а соответственно и Arduino) имеют различные режимы энергосбережения. Некоторые из них отключают только некоторые неиспользуемые компоненты микроконтроллера (ADC, SPI, TWI, USART и т.д.). Некоторые — полностью вводят процессор в режим сна, из которого его можно вывести либо по таймеру, либо по внешнему прерыванию. Применение этим режимам можно найти в устройствах, питающихся автономно от батарей (возможно напишу об этом более подробно в одной из статей). А пока я решил просто измерить энергопотребление Arduino в каждом из режимов.

atmega328_electro

Для экспериментов использовалась Freeduino Through-Hole — аналог Arduino Diecimila. Напряжение подавалось от стабилизированного источника питания 5 вольт.
Freeduino Through-Hole в собранном виде

Итак, для начала замерим силу тока питания Arduino в обычном режиме во время выполнения пустого цикла.

1
2
3
4
5
6
7
8
9
void setup()
{
  while (1) {}
}
 
void loop()
{
 
}
emptycycle

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

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;
}

Сила тока немного возрасла:
simplenumbers

Теперь переходим собственно к режимам энергосбережения. Итак, первый режим — понижение тактовой частоты. Данный скетч демонстрирует перевод микроконтроллера на пониженную частоту работы = 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);
}

graph
Замерим ток, когда светодиод на 13 выводе погашен:
frequencydown

Теперь код, который не изменяет скорости работы, но может полностью приостановить любую деятельность процессора, до наступления определённого события:
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_idle
SLEEP_MODE_ADC:
sleep_adc
SLEEP_MODE_PWR_SAVE:
sleep_pwr_save
SLEEP_MODE_STANDBY:
sleep_standby
SLEEP_MODE_PWR_DOWN:
sleep_pwr_down

И теперь график этих 5 режимов:
graph

Сводная таблица:

РежимСила тока, миллиампер
Пустой цикл22.68
Простые числа23.81
Снижение частоты14.45
SLEEP_MODE_IDLE17.52
SLEEP_MODE_ADC15.29
SLEEP_MODE_PWR_SAVE12.82
SLEEP_MODE_STANDBY12.79
SLEEP_MODE_PWR_DOWN11.69

graphtotal

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

  1. Стафф:

    Спасибо за инфо;)

    1. NightFlash NightFlash:

      Всегда пожалуйста 🙂

      1. BAit:

        Здравствуйте!
        Помогите пожалуйста с проблемой!
        Понизил частоту как на примере, только забыл задать паузу в начале.
        (Arduino Pro Mini 5v 16Mhz Atmega168PA)
        Сейчас не могу прошить программатором USBasp (прошивка обновлённая)

  2. jekmodder:

    Что то для power_down слишком большое потребление энергии. У меня в этом режиме потребление 0.3мА, что даже много.

    1. NightFlash NightFlash:

      Чуть позже ещё замерю у MEGA 2560.

  3. Максим:

    Подскажите пожалуйста как замеряли потребление?
    Судя по картинке — это какая-то софтина.

    1. NightFlash NightFlash:

      Замерял цифровым мультиметром, который подключается к компьютеру. Подробнее про него тут: http://student-proger.ru/2013/10/obzor-cifrovogo-multimetra-va-va18b/

  4. Алексей:

    а не замеряли при пониженой частоте и энергосберегающем режиме?
    А то мне надо запитать про-мини 3.3 от литиевых таблеток 🙁
    не хочется мастерить на тиньке

    1. NightFlash NightFlash:

      Измерял только при тех режимах, которые перечислены в статье 🙂

  5. sir66:

    Вы зря брали для замеров стандартную Ардуину (аналог 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 ма + светодиод (тут уж какой воткнете, родной жрет много). То есть на стандартных Ардуинках экономия смысла не имеет, но при правильном подходе все Ваши приемы позволяют сильно сэкономить.

    1. NightFlash NightFlash:

      Спасибо! Приму к сведению. Как будет время — повторю эксперимент с минимальной обвязкой.

      1. Денис:

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

        Надо какой-то аппаратный счётчик на питание вешать. Чтобы по таймеру включал питание, а по команде с провода выключал. Там как я понимаю одной микросхемой обойтись можно, но я пока не представляю как это сделать..

        1. NightFlash NightFlash:

          Светодиод можно и убрать. Для управления питанием можно любой МК использовать. Вот только смысл? Вторая микросхема ведь тоже будет питание потреблять.

        2. NightFlash NightFlash:

          Светодиод можно и убрать. Для управления питанием можно любой МК использовать. Вот только смысл? Вторая микросхема ведь тоже будет питание потреблять.

          1. Денис:

            Ну вот не обязательно целый МК. Есть всякие микрухи таймеры навроде NE555. Повесил на питание: она ждёт ждёт, включает напряжение. Потом программа делает всё свои дела, кидает 5 вольт на проводок, напряжение выключили, ждём дальше. Вроде просто, может конкретно на эта делать не походит, но что-то простое придумать наверное можно.

            У МК вот пойди ещё догадайся что ты перед спячкой всё что надо в кристалле выключить успел. А тут всё наверняка. А потребление у таймера и МК ещё сравнить надо. Вдруг меньше..

          2. Денис:

            Я вот собрал передатчик на Mini. Вот ещё что подумал. У меня же из ардуины провода на 5 или 3 вольта торчат. А там пару датчиков и приёмник, кристал я гашу, а датчики всё равно висят — батарейку хавают. Это тоже без дополнительных деталей сложно решить.

          3. NightFlash NightFlash:

            Для отключения дополнительных устройств можно использовать транзисторы. Управлять с основного МК.

  6. Toni:

    Если датчики не сильно жрущие, то их можно от ног проца питать, когда надо включать и выключать перед сном.

    1. Евгений:

      Глубокий сон у атмеги8 — потребление по даташиту 500мкА

Похожие записи:

NightFlash

NightFlash

Автор сайта, ITшник, программист, системный администратор