Опыт изучения Arduino. Пост очередной. Аппаратный.
В этой статье хочу уделить немного внимания аппаратной основе плат семейства Arduino Nano. Вариации аппаратного исполнения я описал под фото.
Распиновка Arduino Nano.
Arduino Nano может быть запитан через кабель mini(micro)-USB, от внешнего источника питания с нестабилизированным напряжением 6-20 В (через вывод 30, подавать на этот вывод больше 12 В настоятельно не рекомендуется) либо со стабилизированным напряжением 5В (через вывод 27). Устройство автоматически выбирает источник питания с наибольшим напряжением.
Напряжение на микросхему FTDI FT232RL подается только в случае питания Arduino Nano через USB. Поэтому при питании устройства от других внешних источников (не USB), выход 3.3 В (формируемый микросхемой FTDI) будет неактивен, в результате чего светодиоды RX и TX могут мерцать при наличии высокого уровня сигнала на выводах 0 и 1.
Входы и выходы
Каждый из 20 (0-19, на схеме помещены в сиреневые параллелограммы, на то же схеме в серых параллелограммах указаны выводы микроконтроллера) цифровых выводов Arduino Nano может работать в качестве входа или выхода. Рабочее напряжение выводов — 5В. Максимальный ток, который может отдавать один вывод, составляет 40 мА, но нагружать выходы более, чем на 20 мА не рекомендуется. При этом суммарная нагрузка по всем выводам не должна превышать 200 мА. Все выводы сопряжены с внутренними подтягивающими резисторами (по умолчанию отключенными) номиналом 20-50 кОм. Помимо основных, некоторые выводы Arduino Nano могут выполнять дополнительные функции:
Последовательный интерфейс: выводы 0 (RX) и 1 (TX). Используются для получения (RX) и передачи (TX) данных по последовательному интерфейсу. Эти выводы соединены с соответствующими выводами микросхемы-преобразователя USB-UART от FTDI.
Внешние прерывания: выводы 2 и 3. Данные выводы могут быть сконфигурированы в качестве источников прерываний, возникающих при различных условиях: при низком уровне сигнала, по фронту, по спаду или при изменении сигнала. Для получения дополнительной информации см. функцию attachInterrupt().
ШИМ: выводы 3, 5, 6, 9, 10 и 11. С помощью функции analogWrite() могут выводить 8-битные аналоговые значения в виде ШИМ-сигнала.
Интерфейс SPI: выводы 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Данные выводы позволяют осуществлять связь по интерфейсу SPI. В устройстве реализована аппаратная поддержка SPI.
Светодиод: вывод 13. Встроенный светодиод, подсоединенный к цифровому выводу 13. При отправке значения HIGH светодиод включается, при отправке LOW — выключается.
I2С: выводы 4 (SDA) и 5 (SCL). С использованием библиотеки Wire (документация на веб-сайте Wiring) данные выводы могут осуществлять связь по интерфейсу I2C (TWI).
Помимо перечисленных на плате существует еще несколько выводов:
AREF. Опорное напряжение для аналоговых входов. Может задействоваться функцией analogReference().
Reset. Формирование низкого уровня (LOW) на этом выводе приведет к перезагрузке микроконтроллера. Обычно этот вывод служит для функционирования кнопки сброса на платах расширения
Аналоговые входы A0-А7: входы с 10-битным аналого-цифровым преобразователем (АЦП). Напряжение поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт. Источник опорного напряжения может быть изменен.
Среда программирования Arduino IDE поддерживает работу не со всеми устройствами, входящими в состав микроконтроллера. Например, остался без внимания аналоговый компаратор. Пользоваться им можно, но придется напрямую обращаться к регистрам.
Схема соединений разъёмов J1 и J2.
Схема соединений микроконтроллера. В качестве МК могут быть применены ATMega 328P или ATMega 168P.
Схема соединений преобразователя USB-UART. Есть версии плат с микросхемами CH340G(более капризные), в оригинальной версии стоит FT232RL. В базовой версии устанавливается разъём mini-USB, но попадаются версии и с более удобным разъёмом micro-USB.
Соединения цепей питания и разъёма ICSP. Есть версии плат с номинальным напряжением питания 5 В или 3,3 В.
На сегодня у меня всё. В планах небольшая статья о внутреннем устройстве МК и его периферийных устройствах.
Какое максимальное энергопотребление Arduino Nano 3.0?
Какова максимальная потребляемая мощность (в мВт) Arduino Nano 3.0, когда он работает по умолчанию? состоянии (на частоте 16 МГц, светодиоды не удалены) и питается от внешнего регулируемого источника питания 5 В, поэтому он обходит встроенный регулятор напряжения?
Это даст нам верхнюю границу энергопотребления Arduino Nano, которую можно использовать при оценке.
4 ответа
Ну, это зависит от того, что вы подключили к Arduino. Если вы используете контакты для выполнения каких-либо действий, вам определенно потребуется больший ток.
Если вы ТОЛЬКО хотите питать Arduino, я рассчитал, что, по моему мнению, оно должно быть ниже. (Вы также должны уточнить у владельца этого устройства экспериментальное значение, а не только расчетное значение.)
Исходя из таблицы данных (рис. 30-8, стр. 319), я бы сказал, что процессор будет потреблять около 2,4 мА при 5 В.
http://www.atmel.com/images/doc2545.pdf
Чип USB потребляет около 15 мА в зависимости от нескольких факторов (стр. 18). http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232R.pdf
Тогда у вас есть 2 светодиода с резисторами 680 Ом. (Предполагая падение на 2 вольта для каждого светодиода) (5-2)/680 = около 4 мА на светодиод.
Итак, в зависимости от того, насколько вы используете последовательный порт и светодиоды, я бы предположил, что около (2,4 + 15 + 4 * 4) = 33,4 мА
33,4 мА * 5 В = 0,167 Вт
Я подозреваю, что вы хотите знать общее количество энергии, которое может получить Arduino, что немного сложнее рассчитать.
Выводы могут обеспечивать ток до 200 мА. (стр. 303 http://www.atmel.com/images/doc2545.pdf ) Итак, 33,4 + 200 = 233,4
Я бы также добавил запас прочности 20% (около 50 мА)
Поэтому мне нужен источник питания на 280 мА, если я собираюсь подключать Arduino к разным вещам.
280 мА * 5 = 1,4 Вт
Сообщите мне, если мои цифры отличаются.
PS: Будьте осторожны, делая свой собственный запас. Очень важно, чтобы напряжение было очень стабильным. Нестабильное снабжение может/уничтожит Ардиуно. Я предлагаю использовать линейный регулятор , например LM7805 . или, может быть, LM317
7805 и 317 оба имеют пиковое начальное напряжение 6 В при первом включении от fx 12 В. Но не портит платы., @user2497
@user13180 — зажать стабилитроном и использовать колпачок, @Peter Wone
USB потребляет так много, если он используется только для питания платы? У вас есть хорошая библиотека, чтобы усыпить Нано? Спасибо, @Amir
С веб-сайта https://store.arduino.cc/usa/arduino-nano : каждый из 14 цифровых контактов на Nano можно использовать как вход или выход. Они работают от 5 вольт. Каждый контакт может обеспечить или получить максимум 40 мА. Поэтому я бы предположил, что максимальное энергопотребление составляет 14 x 40 мА x 5 В = 2,8 Вт, зависит от % эффективности платы, например, скажем, 80%, поэтому вход может составлять 3,5 Вт, но опять же вы редко используете все 14 контактов одновременно в качестве выходов. следовательно, это намного ниже, чем 3,5 Вт. Это всего лишь цифра шариковой ручки.
Если отдельный контакт может обеспечить 40 мА, это не значит, что они могут обеспечить 560 мА одновременно., @gre_gor
«Каждый из 14 цифровых контактов Nano можно использовать как вход или выход.»
Есть 6 аналоговых входных контактов, которые также являются цифровыми контактами, вы должны принять это во внимание.
Однако в примечании 3 к таблице 32-2 таблицы данных 328P говорится: «Хотя каждый порт ввода-вывода может подавать больше, чем в условиях испытаний (20 мА при VCC = 5 В, 10 мА при VCC = 3 В) в установившихся условиях (непереходных), необходимо соблюдать следующее:
3.1. Сумма всех IOH, для портов C0-C5, D0-D4, ADC7, RESET не должна превышать 100мА.
3.2. Сумма всех IOH для портов B0 — B5, D5 — D7, ADC6, XTAL1, XTAL2 не должна превышать 100 мА.
(но ADC6 и ADC7 являются только аналоговыми входами и не должны быть источниками тока)
Поэтому я бы посоветовал, чтобы ваш Nano оставался в рабочем состоянии, 200 мА x 5 В = 1 Вт учитывались для ввода-вывода, а затем значения, указанные выше, для светодиода питания, светодиода L (который управляется D13) и внутренней работы учитывать чип.
Да, ввод/вывод может подавать 40 мА при 5 В (или 3 на 3) на контакт, но ограничение не равно 40 мА с каждого контакта одновременно, а ограничивается рассеиваемой мощностью процессора. Внимательно прочитайте спецификацию 328A, и правда станет ясной.
Про Ардуино и не только
Согласно закону Ома, сила тока в цепи прямо пропорциональна напряжению. Поэтому для уменьшения тока, потребляемого Ардуино, необходимо уменьшить напряжение питания. Требуемое рабочее напряжение (5В или 3.3В) в Ардуино обеспечивают линейные стабилизаторы типа AMS1117, при этом входное напряжение должно быть несколько больше (6,5В и 4,8В). Чтобы запитать Ардуино меньшим напряжением его следует подавать в обход стабилизатора: на пин +5V или через USB разъем. Но будьте осторожны, превышение максимально допустимого напряжения питания МК (для ATmega328P оно составляет 6В) выведет его из строя. Других причин не использовать пин +5V для питания Ардуино нет.
Если использование стабилизатора все-таки необходимо, то вместо линейных лучше использовать импульсные, так как они имеют больший КПД. Вполне реально найти импульсный стабилизатор, подходящий по габаритам и распиновке для замены AMS1117 на плате UNO.
Другой фактор, влияющий на расход энергии, это тактовая частота МК. Чем выше частота МК, тем больший ток он потребляет. Если нам не нужна вся вычислительная мощь Ардуино, то можно понизить его тактовую частоту, чтобы уменьшить энергопотребление. И в этом нам поможет предделитель тактовой частоты (System Clock Prescaler).
Описание предделителя МК ATmega328P и управляющего им регистра CLKPR (Clock Prescale Register) приведено в разделе 13.11 даташита. Согласно документации для того чтобы изменить значение делителя необходимо сначала установить в управляющем регистре бит Clock Prescaler Change Enable (CLKPCE), записав в него значение 0x80. После этого новое значение делителя, а точнее его код, записывается в младшие 4 бита регистра. На время внесения данных изменений все прерывания должны быть запрещены. Таким образом для уменьшения частоты, например, в 8 раз можно использовать следующий код:
Данный пример иллюстрирует принцип управления частотой Ардуино на низком уровне. Но все же гораздо удобнее для этих целей использовать функцию clock_prescale_set() из файла power.h. Пример скетча с ее использованием ниже:
- clock_div_1
- clock_div_2
- clock_div_4
- clock_div_8
- clock_div_16
- clock_div_32
- clock_div_64
- clock_div_128
- clock_div_256
Еще один важный момент на пути к минимизации энергопотребления — это выбор конкретной платы Ардуино. Платы могут отличаться моделями используемых МК, частотой кварцевых резонаторов, микросхемами для соединения с компьютером через USB и т.д. Например, в оригинальных платах Ардуино за соединение с компьютером отвечает МК ATmega16U2, в дешевых клонах вместо нее устанавливают преобразователи интерфейсов USB в UART вроде CH340G, а в Arduino Pro Mini преобразователь отсутствует в принципе.
Я измерил ток, который потребляют имеющиеся у меня ардуинки. Самой прожорливой оказалась оригинальная UNO: при питании 5В (запитывал через пин +5V) и скетче из пустых функций setup и loop ток составил 44,2мА. Китайский клон с микросхемой CH340G потребляет 23,5мА. Наименьший ток оказался у платы Pro Mini 5В 16МГц без встроенного преобразователя USB-UART, он составил 15,4мА — с ней я и решил проводить свои эксперименты по снижению энергопотребления. И начал я их с управления тактовой частотой. Ниже приведены значения тока, который потребляет моя Arduino Pro Mini при питании 5В и различных коэффициентах делителя частоты:
clock_div_1 (16МГц): 15,4мА
clock_div_2 (8МГц): 11,4мА
clock_div_4 (4МГц): 9,5мА
clock_div_8 (2МГц): 7,7мА
clock_div_16 (1МГц): 7,3мА
clock_div_32 (512кГц): 6,9мА
clock_div_64 (256кГц): 6,7мА
clock_div_128 (128кГц): 6,6мА
clock_div_256 (64кГц): 6,5мА
Бросаться в крайности и уменьшать частоту в 256 раз может и не стоит. А вот понизить ее до 1МГц вполне адекватное решение, этого хватит для большого круга задач.
Однако, здесь есть и нюанс. Изменение тактовой частоты микроконтроллера сказывается на работе всех его модулей, работающих в синхронном режиме. Если во время выполнения программы тактовая частота будет уменьшена вдвое, то и скорость обмена по I2C, USART или SPI также уменьшится в 2 раза, задержки функцией delay станут в 2 раза дольше, исказится ШИМ и т.д. Это происходит потому, что при компиляции скетча была заявлена одна частота, а по факту микроконтроллер работает на другой. Поэтому программное изменение тактовой частоты стоит использовать в тех участках кода, которые от частоты не зависят.
Следующий шаг — снижение напряжения питания. При тактовой частоте 1МГц и снижении напряжения до 3,3В Ардуино ProMini потребляет 2мА. Все еще много. Поэтому я решил выпаять из Ардуино светодиод-индикатор питания, в результате ток уменьшился до 1,2 мА — это уже что-то!
Энергосбережение и сон
У вас наверняка есть настольные часы-будильник с датчиком температуры и влажности, которые работают на двух пальчиковых батарейках уже не первый год и даже не планируют разряжаться. В то же время, если подключить плату Ардуино к “паурбанку” на 10 Ампер*часов, она высосет его за две недели. Как же так вышло?! Разработать энергоэффективное автономное устройство на Ардуино или голом микроконтроллере гораздо труднее, чем питающееся от “сети”: потребление схемы складывается из большого количества факторов: как аппаратных, так и программных. В этом уроке мы постараемся рассмотреть их все. Основные моменты энергосбережения:
- Правильно подобрать источник питания по напряжению.
- Минимизировать и оптимизировать потребление пассивных компонентов (стабилизаторы напряжения, светодиоды индикации, делители напряжения и т.д.).
- Задать оптимальный режим работы устройства и отдельных его частей: максимальное энергосбережение бОльшую часть времени работы, пробуждение по внешним событиям или таймеру, работа различных компонентов по расписанию и т.д. Например: опрос датчика и отправка данных по радио раз в минуту, всё остальное время – максимальный сон МК и отключение датчика и радио от питания.
- Что касается сна самого МК – спать можно при помощи встроенных команд (например ассемблерной asm(«sleep») или sleep_mode() из avr/sleep.h), а можно использовать библиотеки. Например есть стандартная avr/sleep.h, которая идёт в комплекте со средой разработки. Из нестандартных есть весьма популярные Narcoleptic и Low-Power, имеющие гораздо бОльшие возможности по настройке сна. Мы сделали свою библиотеку для управления энергосбережением МК – GyverPower, которая включает в себя удобное управление сном и энергопотреблением МК на всех уровнях (сон, управление частотой и периферией), а также встроенный калибровщик сторожевого таймера и несколько уникальных фишек, которых нет ни в каких других библиотеках. В данном уроке я буду ссылаться именно на неё, с полной документацией можно ознакомиться здесь.
- Также потребление МК сильно зависит от частоты. Можно понижать частоту между периодами активной работы (вычислений, работы с датчиками), об этом читай ниже.
Вольты, амперы, ёмкость
Начнем с базовых понятий мира электричества: Вольты и Амперы (более подробно про это читай в этом уроке). Вольты – напряжение, оно же разность потенциалов. Напряжение задаёт источник питания, например батарейка или блок питания. Амперы – сила тока в цепи, показывает с какой силой “расходуется” электрическая энергия. Ток в цепи задаёт потребитель. (Примечание: описанное выше справедливо для источника напряжения, коим является любая батарейка/аккумулятор или обычный блок питания. Источником тока может быть специальное зарядное устройство или светодиодный драйвер, от них питать предназначенную для источника напряжения схему нельзя – сразу сгорит). Потребляемую и запасаемую энергию принято считать в Ампер*часах, работает это следующим образом: допустим, ёмкость аккумулятора составляет 1 А*ч (Ампер*час). Это означает, что такой аккумулятор сможет отдавать ток с силой 1 Ампер в течение одного часа, полностью при этом разрядившись. Если ток в цепи будет 0.5 А – аккумулятора хватит на 1 А*ч / 0.5 А == 2 часа. Плата Ардуино потребляет в районе 24 мА, то есть тот же условный аккумулятор сможет питать её в течение 1000 мА*ч /24 мА
42 часов. При параллельном подключении потребителей, как это обычно бывает в схеме, ток потребления суммируется. Если добавить в “схему” из предыдущего расчёта дисплей с подсветкой, который будет потреблять условно ещё 30 мА, то такая схема проработает от того же аккумулятора 1000 мА*ч / (24+30 мА)
Потребление компонентов схемы
Если в устройстве помимо МК есть какие-то другие модули/датчики/дисплеи/микросхемы, то больший вклад в потребление энергии будут вносить именно они, потому что МК можно погрузить в сон, а их – не всегда. Логично, что для максимальной экономии энергии нужно держать все компоненты в полностью отключенном состоянии и включать только на период активной работы: датчики – на время опроса, дисплеи и подсветки – на время взаимодействия с человеком, и тому подобное.
- Некоторые железки имеют очень удобный пин EN – enable, позволяющий логическим уровнем с МК полностью включать и выключать компонент, что позволяет очень просто управлять его состоянием.
- Некоторые микросхемы имеют встроенный режим энергосбережения, который можно активировать из программы (например, передав нужную команду по интерфейсу связи). Информацию нужно искать в даташите или библиотеке на конкретную железку.
- Если таких возможностей у железки нет – всегда можно просто разорвать ей питание при помощи транзистора или оптопары. Электромеханическое реле использовать не рекомендуется, т.к. оно само потребляет приличный ток.
- Маломощные (до 20 мА) компоненты можно питать напрямую от пинов МК, что ещё больше упрощает задачу по управлению питанием. Примечание: у “Ардуиновских” AVR весьма приличный запас по току – в районе 40 мА на пин, но на таком токе напряжение просаживается и работа “железки” может стать нестабильной, поэтому не рекомендуется подключать на пин нагрузку выше 20 мА. К слову, у других процессоров (STM32, esp8266) максимальный ток с пинов на порядок ниже (2-5 мА) и что-то от них питать в принципе невозможно.
- Большинство “интерфейсных” микросхем при сбросе питания будут требовать повторной инициализации. У того же например lcd дисплея после отключения и включения питания нужно вызвать метод .init() , чтобы дисплей начал реагировать на остальные команды.
Если система измеряет напряжение питания выше 5V (напряжение батареи аккумуляторов), то делитель напряжения должен быть рассчитан оптимально, чтобы не тратить ток в холостую. Об этом мы говорили в уроке про аналоговые входы.
Потребление платы Ардуино
Честно говоря, сам микроконтроллер может работать абсолютно самостоятельно просто при наличии питания, а смена режима сна или частоты будет влиять на потребление ровно так, как написано в даташите. Если в основе проекта лежит плата ардуино – начинаем загибать пальцы: светодиоды индикации, стабилизатор питания и usb-ttl преобразователь – все они потребляют ток в холостом режиме, просто потому что они сидят на общем питании. Плата Nano в активном режиме потребляет около 24 мА, а если погрузить МК в максимальный сон – в районе 5 мА. В то же время по даташиту МК в таком режиме должен потреблять в районе 1 мкА, то есть в 5000 (пять тысяч) раз меньше. Эти самые 5 мА потребляют перечисленные выше компоненты на плате ардуино, поэтому для создания действительно энергоэффективного проекта нужно делать свою плату и паять на неё МК, либо брать скальпель/паяльник и убирать лишнее с платы Ардуино.
Потребление МК
Частота тактирования
Вычислительное ядро потребляет энергию всегда, когда находится в активном режиме: вычисляет ли программа арккосинус, ожидает ли окончание задержки delay() , висит ли в бесконечном пустом for(;;) – неважно. Потребление будет одинаковым во всех случаях, пока ядро тактируется. Более того, от частоты тактирования зависит напряжение, при котором МК гарантированно стабильно работает. Вот картинки из даташита на ATmega328: На самом деле всё как обычно слегка “завышено”, потому что на 16 МГц клоке Ардуино прекрасно работает начиная от 3.3V, а на 8 МГц (внутреннем) – от 1.8V (при отключенном BOD). Есть четыре уровня управления тактовой частотой:
- Подключение внешнего кварца с нужной частотой (на плате Ардуино стоит 16 МГц, сам МК поддерживает вплоть до 20 МГц без разгона).
- Выбор источника тактирования при помощи фьюзов: внешний (частота соответствует установленному генератору) и внутренний (8 МГц).
- Изменение системной частоты прямо из программы: большинство МК avr позволяют понизить приходящую с источника тактирования частоту, а именно – поделить (реализовано в GyverPower). Таким образом можно замедлить работу всего МК для уменьшения потребления энергии или увеличения стабильности работы от пониженного напряжения. Можно выполнить необходимые действия на высокой частоте, а затем понизить её до минимума до наступления внешних событий по прерываниям или по таймеру. На некоторых МК есть PLL – умножитель частоты (например на Attiny85), позволяющий тактироваться на частоте 36 МГц от внутреннего источника! Для такого разгона придется поднять напряжение и обеспечить теплоотвод, но об этом не в этом уроке =).
- Фьюз CKDIV8: системный делитель из предыдущего пункта автоматически устанавливается на 8 перед запуском МК. Это нужно для более надёжного старта при низком напряжении. Обычно используют так: МК стартует с CKDIV8 на пониженной частоте, измеряет напряжение питания, если оно достаточно высокое (аккумулятор не разряжен) частота выставляется на необходимую и работа продолжается. Иначе например можно всё вырубить и уйти в сон.
Также прилагаю картинку с графиками тока потребления МК в активном режиме (не во сне) в зависимости от частоты и напряжения питания:
Режимы энергосбережения
У микроконтроллера есть несколько режимов энергосбережения, в каждом из которых остаются в активном режиме только некоторые из аппаратных блоков (таймеры, интерфейсы, АЦП, и т.д.). Также у мк есть блок BOD, отвечающий за постоянный мониторинг напряжения и перезагрузку в случае его падения ниже настроенного порога. Во всех режимах сна остаётся активен АЦП, его нужно отключать отдельно (всё реализовано в GyverPower). Режимы энергосбережения МК (AVR):
- IDLE – Легкий сон, отключается только клок CPU и Flash, пробуждается мгновенно от любых прерываний
- POWERDOWN – Наиболее глубокий сон, отключается всё кроме WDT и внешних прерываний, просыпается от аппаратных (обычных + PCINT) или WDT, пробуждение за 16+6 тактов (
Самый часто используемый на практике режим – power down, самый глубокий сон. В нём отключается всё, кроме watchdog и аппаратных прерываний (обычные external и PCINT). В данном режиме МК потребляет минимальный ток (ATmega328 – чуть меньше 1 мкА), а проснуться можно только по прерыванию Watchdog таймера или по аппаратному прерыванию (по кнопке). Очевидно, что в глубоком сне не работают таймеры и прерывания по ним, поэтому счёт времени становится отдельной задачей (в GyverPower эта задача решена максимально удобно).
Периферия
Помимо главного “ядра” у микроконтроллера есть куча периферийных блоков (АЦП, компаратор, таймеры, интерфейсы связи), которые по сути работают отдельно и могут общаться с МК на аппаратном уровне. Каждый блок потребляет некоторый ток, и при желании некоторые блоки можно отключить. В режиме глубокого сна они отключаются автоматически, а вот в активной работе нужно отключить их вручную. Большую таблицу с потреблением МК в разных режимах и с разным набором активной периферии можно посмотреть на официальной странице библиотеки Low Power, на всякий случай приложу её ниже. Управление периферией также реализовано в GyverPower.
Измерения проводились на 8 МГц плате Pro Mini при питании от Li-Ion аккумулятора (3.7V):
Питание
Источник питания
Выбор источника питания очень важен для эффективного энергосбережения: максимально желательно питать МК напрямую от батарейки/аккумулятора:
- Трёх-четырёх АА/ААА батареек или аккумуляторов достаточно для работы на стандартной частоте 16 МГц (с 4-мя батарейками нужно быть аккуратнее по суммарному напряжению, а 4 никелевых аккумулятора подходят идеально).
- От одного литиевого аккумулятора (3.7-4.2V) можно работать на 16 МГц, но при разряде ниже 3.5V работа на такой частоте уже может быть не очень стабильной (частоту можно чуть понизить, об этом ниже).
- От литиевой 3V таблетки (CR2025, CR2032 и прочие) микроконтроллер отлично будет работать на внутреннем 8 МГц клоке.
- Плохим вариантом можно считать ситуации, когда приходится использовать понижающие преобразователи и стабилизаторы: они все будут тратить несколько миллиампер “в тепло”, и даже режим сна МК может оказаться абсолютно бессмысленным. Но в любой ситуации нужно считать потребление и прикидывать время работы, для каких-то задач и работа от “Кроны” через стабилизатор будет приемлемой во имя упрощения схемы и стабильных 5 Вольт (китайский транзистор-тестер, например, включается на несколько секунд, поэтому заморочек по питанию нет).
- Если в устройстве используется аккумуляторная батарея, то можно схитрить: высоковольтный потребитель (мотор к примеру) может питаться от общего напряжения с батареи через драйвер, а микроконтроллер может работать от одной его “банки”, соединяясь общим проводом с минусом. Микроконтроллер, особенно в режиме сна, потребляет ничтожно мало по сравнению с тем же мотором, поэтому о разбалансировке банок можно не беспокоиться. Таким образом МК также может мониторить напряжение батареи и отключать её при разряде, выполняя роль BMS. Про измерение напряжения мы говорили в уроке про аналоговые входы.
- Также напомню, что питать всякие железки напрямую от МК можно только в некоторых пределах, подробнее о них и вообще питании проекта мы говорили в уроке о питании Ардуино и схемы в целом.
Самоблокировка питания
Самый надёжный и аппаратно простой способ сэкономить энергию – самоблокировка питания. Он подходит для устройств, которые включаются тактовой кнопкой (без фиксации) и через некоторое время должны сами отключиться до следующего клика по кнопке. Самоблокировка работает следующим образом: нажатие на кнопку подаёт ток на МК, он запускается, подаёт сигнал на “ключ”, который запараллеливает линию питания. Мы отпускаем кнопку, а МК продолжает работать, потому что сам удерживает ключ, через который идёт питание. Отсюда и название: самоблокировка питания. По тайм-ауту или другому алгоритму работы МК может отпустить ключ и отключиться. Через этот же ключ могут питаться и остальные железки, и точно так же быть отключены от питания при самовыключении. Проблема в том, что МК от AVR могут питаться от любого GPIO пина (при наличии общей GND), поэтому практически все старые схемы из интернета не работают. Пока что удалось найти две схемы на форуме arduino, но лично я их не тестировал. В будущем дополню урок.
Но есть шикарный, простой и рабочий вариант: использовать стабилизатор напряжения с пином Enable, за который МК может “заблокировать” себе питание (за идею спасибо Дмитрию Карманову). Вот пример со стабилизатором me6212c33m5g на 3.3V (стоит в районе 15 руб). На схеме PWR_EN ведёт на физическую кнопку, подключенную второй ногой к питанию (батарейке), BUT_MK идёт на пин МК, который будет подавать высокий сигнал при запуске. 3V3 соответственно линия 3.3 (от неё питается сам МК и опционально что-то ещё), и BAT – батарейка.