Энергопотребление 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 и обновления показаний.

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

17 Комментарии “Энергопотребление Arduino

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

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

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

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

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

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

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

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

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

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *