суббота, 1 августа 2020 г.

Еще раз про энергосбережение

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

Время, ёмкость аккумулятора и ток разряда

Итак, мы разрабатываем некоторое устройство с автономным источником питания и задались вопросом энергосбережения. С чего начать? Начнем с того, что выделим 3 составляющие, от которых будем отталкиваться: время автономной работы, ёмкость аккумулятора и потребляемый устройством ток. Связь между ними следующая: чем больше ёмкость аккумулятора и меньше ток разряда, тем дольше проработает устройство. Вопрос в том, какие из этих составляющих мы можем изменять: можем ли увеличить ёмкость аккумулятора или она уже продиктована габаритами устройства и нам остаётся максимально уменьшить потребляемый ток; хотим ли, чтобы устройство проработало год или достаточно недели автономной работы. Здесь нам помогут онлайн калькуляторы, вычисляющие время работы аккумулятора при заданной ёмкости и токе разряда. Например, калькулятор на этом сайте для аккумулятора ёмкостью 1000мАч и тока 15мА прогнозирует время работы 46 часов:

Расчет времени работы аккумулятора в онлайн калькуляторе

Разумеется, не стоит воспринимать такие результаты как точный ответ. Но для грубой оценки они вполне годятся. Уже сейчас можно понять, что платы Ардуино, ток потребления которых составляет 15-30мА, не смогут работать от аккумулятора продолжительное время. Да, есть способы уменьшить потребляемый ими ток и в каких-то случаях это сработает. Но если требуется действительно долгое время работы от аккумулятора, то единственный вариант - это использование отдельного микроконтроллера. Для сравнения ATmega328P при тактовой частоте 8МГц и питании от литиевого аккумулятора потребляет около 4мА в активном режиме и менее 0,2мкА в режиме Power-Down. Таким образом ёмкости 1000мАч хватило бы, чтобы микроконтроллер проспал десятки лет - скорее аккумулятор потеряет свою ёмкость из-за старения и саморазряда.

Небольшое отступление. В своих публикациях я всегда привожу ссылки на даташиты микросхем, о которых идет речь. Я понимаю, что для многих подобная документация - темный лес. И всё-таки рекомендую начать заглядывать в нее. Так для AVR микроконтроллеров в разделе Typical Characteristics можно найти массу полезной информации: зависимости тока от тактовой частоты и напряжения, потребление в различных режимах энергосбережения, минимальное напряжение питания при заданной частоте и многое другое. Это то, чем нужно уметь пользоваться, если вы хотите понять, как продлить время работы устройства от аккумулятора. На всякий случай даташит на ATmega328P.

С определением примерного времени работы от аккумулятора разобрались. С ёмкостью тоже всё понятно - чем больше, тем лучше. Как уменьшить ток? Оцените по даташиту или измерьте мультиметром ток, потребляемый отдельными компонентами устройства. Необходимо выявить наиболее прожорливые компоненты и понять, какие есть варианты для уменьшения потребляемого ими тока. Ранее я уже писал о способах снижения энергопотребления Ардуино. Это уменьшение питающего напряжения (актуально как для Ардуино, так и для всех компонентов в целом), понижение тактовой частоты и использование режимов энергосбережения. Последние кстати могут присутствовать не только в микроконтроллерах, но и других микросхемах. Однако не обязательно, что они будут реализованы в используемых библиотеках. Поэтому целенаправленно ищите информацию об энергосбережении (Power Consumption, Sleep) в даташите компонента. Ну или хотя бы в интернете - тоже вариант.

Некоторые микросхемы имеют вход, разрешающий их работу. Он может называться ENABLE, EN, CHIP ENABLE, SHUTDOWN. Подав на этот вход сигнал нужного уровня, можно запретить работу микросхемы, уменьшив таким образом ее энергопотребление. Если микросхема распаяна на плате, то есть перед нами некоторый модуль, то данный вход уже может быть соединен с землей или питанием и не выведен как внешний контакт модуля. В этом случае всё ещё можно подпаяться к выводу микросхемы и разрешать ее работу программно, если перерезать дорожку, идущую от этого вывода к линии питания или к земле. И, наконец, можно просто отключить питание компонента и включать его только при необходимости. Об этом чуть позже, а пока вернемся к микроконтроллерам и Ардуино.

Уменьшение напряжения питания и тактовой частоты микроконтроллера

Данная тема подробно рассмотрена в этой статье, поэтому сейчас вкратце отметим основные моменты. Взгляните на следующий график из даташита на ATmega328P, он отражает зависимость потребляемого микроконтроллером тока от тактовой частоты и напряжения питания:

Зависимость потребляемого микроконтроллером ATmega328P тока от частоты и напряжения

Из графика видно, что потребляемый микроконтроллером ток падает при уменьшении напряжения питания и тактовой частоты. С уменьшением напряжения снижается и максимальная частота, на которой может работать микроконтроллер. Поэтому не стоит рассчитывать на корректную работу микроконтроллера с резонатором, скажем, на 16МГц при напряжении 3 вольта.

Итак, чтобы уменьшить энергопотребление микроконтроллера, нужно:

  • Определиться с резонатором, т.е. тактовой частотой, необходимой для данного приложения. Если нет серьезных требований к её стабильности, то можно настроить микроконтроллер на тактирование от внутреннего генератора 8МГц. Не забываем также о возможности деления тактовой частоты на 8 путём установки фьюза CKDIV8.
  • Для выбранной тактовой частоты оценить по вышеприведенному графику необходимое для микроконтроллера напряжение. Если оно сильно отличается от напряжения источника питания (как в меньшую, так и в большую сторону), то здесь помогут dc-dc преобразователи.
  • Тактовую частоту можно изменять в ходе работы программы путём установки значения предделителя. Однако следует помнить, что это повлияет на тактирование большинства периферийных устройств: таймеров/счетчиков, модулей SPI, USART, АЦП и других.

Спящий режим и пробуждение микроконтроллера

Доступные для Ардуино (ATmega328P) режимы энергосбережения, а также события, пробуждающие микроконтроллер, с примерами кода я приводил ранее в статье Режимы энергосбережения Ардуино. Перевод плат Ардуино в сон не даст такой экономии, как в случае с отдельным микроконтроллером, поскольку кроме него на плате присутствуют другие потребители, которые продолжают работать, светиться и греться. Можно, конечно, выпаять из Ардуино всё лишнее. Некоторые именно так и поступают.

В проектах, где требуется периодическое пробуждение микроконтроллера, отличными помощниками становятся RTC модули с возможностью установки будильника. Их можно запрограммировать на генерацию запроса прерывания, который разбудит микроконтроллер в нужный момент. О применении для этих целей модуля на базе DS3231 можете почитать в статье DS3231 - будильник для Ардуино.

Внешние компоненты, питание от МК

Если в компонентах нет спящего режима и вывода ENABLE или они не обеспечивают нужного уровня энергосбережения, то можно просто отключать питание данных компонентов. Для этих целей идеально подходят полевые транзисторы, они экономичны и способны коммутировать значительные токи. А в тех случаях, когда речь идет о нескольких миллиамперах, можно обойтись без транзисторов и запитать компонент непосредственно от микроконтроллера, как на следующей схеме:

DHT22 потребляет не более 1,5 мА и может быть запитан цифровым выводом микроконтроллера

На этой схеме вывод Vcc датчика DHT22  подключен не к питанию, а к выводу D3 Ардуино. Чтобы подать напряжение на компонент, переводим вывод D3 в режим OUTPUT и устанавливаем на нем сигнал высокого уровня. Чтобы снять напряжение, переводим вывод в режим INPUT. Не лишним также будет перевести в режим INPUT вывод D2, чтобы исключить возможность паразитного питания. Таким образом, при переходе микроконтроллера в спящий режим можно отключить DHT22, чтобы он зря не работал.

Конечно, нужно иметь в виду, что одни компоненты входят в свой рабочий режим сразу при подаче питания, другим же требуется предварительная инициализация. То есть после подачи на них питания нужно будет выполнить некоторый код, который, как правило, размещают в функции setup() IDE Arduino.

В описанном способе нет ничего ужасного, он вполне рабочий. Только нужно помнить о нагрузочной способности портов микроконтроллера, а так же о том, что с увеличением нагрузки напряжение на выводе падает. Предельно допустимый ток через вывод AVR микроконтроллера (если не всех, то большинства, а вообще смотрим раздел Electrical Characteristics - Absolute Maximum Ratings даташита) составляет 40мА.

А если нагрузочной способности вывода микроконтроллера не хватает чтобы запитать компонент? Или если не хочется сильно нагружать один вывод, можно ли поделить нагрузку между двумя и более выводами микроконтроллера, соединив их? В принципе можно. В этом случае выводы должны принадлежать одному порту микроконтроллера, чтобы можно было изменять их состояние одновременно. При этом суммарный ток не должен превышать значение, указанное в даташите для данной группы выводов. Но ограничивающим фактором здесь должен быть, конечно, не обозначенный максимум по току, а понимание того, что выводы микроконтроллера не предназначены для этого. Кроме того данный способ уже потенциально опасен: если один из выводов будет установлен в HIGH, а другой по ошибке в LOW, то порт микроконтроллера может сгореть. Можно обезопасить себя от подобного, подвесив к каждому выводу резистор, чтобы ограничить ток через него. Но раз уж дело дошло до дополнительных компонентов, то лучше сразу посмотреть в сторону транзисторов.

Полевые транзисторы для управления питанием устройств

А точнее полевые транзисторы с изолированным затвором, они же МДП-транзисторы (металл-диэлектрик-полупроводник), они же MOSFET (metal-oxide-semiconductor field effect transistor).

Почему именно полевые? Потому что в отличие от биполярных они управляются не током, а напряжением и расходуют значительно меньше энергии, что для нас актуально. По типу проводимости канала полевые транзисторы разделяются на N-канальные и P-канальные. N-канальные транзисторы открываются, когда к затвору приложено положительное напряжение относительно истока и закрываются, когда приложено отрицательное. P-канальные полевые транзисторы, наоборот, открываются при подаче на затвор отрицательного напряжения относительно истока, а закрываются положительным напряжением. Не будем пока вдаваться в теорию, поскольку это отдельная тема, и рассмотрим сразу схемы ключей на МДП транзисторах:


N-канальный полевой транзистор включается между нагрузкой и землей. P-канальный - между нагрузкой и питанием. В закрытом состоянии сопротивление участка сток-исток очень велико и ток через транзистор не течет. Когда к затвору приложено отпирающее напряжение, транзистор открывается и сопротивление сток-исток резко снижается (может составлять десятки миллиОм), соответственно, через нагрузку начинает протекать электрический ток.
Типовая схема ключа на МДП-транзисторе (MOSFET'е)

Резистор R1 нужен для защиты вывода микроконтроллера от наводок при коммутации больших нагрузок. В низковольтных схемах необходимости в таком резисторе нет.

Чтобы полевой транзистор самопроизвольно не открывался под действием помех при отсутствии управляющего сигнала, его затвор подтягивают к земле или питанию. На схеме эту функцию выполняет резистор R2. Таким образом, в момент перезагрузки микроконтроллера и других случаях, когда вывод находится в Z-состоянии, транзистор гарантированно останется закрыт.

Используя ключ на полевом транзисторе, можно отключить питание компонентов (или даже всего устройства, подробности в статье Кнопка включения питания для Ардуино) перед уходом в сон. При выборе транзистора для этих целей обратите внимание на значение параметра напряжение отсечки (Gate Threshold Voltage), оно должно быть меньше напряжения питания микроконтроллера. В противном случае микроконтроллер не сможет открыть данный транзистор. Другой важный параметр - это сопротивление канала в открытом состоянии (Static Drain-Source On-Resistance), чем оно ниже, тем лучше. Остальные параметры для данной задачи не так важны.

DC-DC преобразователи

Номенклатура преобразователей напряжения весьма широка, что позволяет сделать оптимальный выбор для каждого конкретного применения. Так для устройств, работающих от батареек и аккумуляторов, существуют специализированные низковольтные преобразователи. Они экономичны и обладают высоким КПД. Именно такие преобразователи следует использовать при создании устройств, работающих от автономных источников питания.

Как было сказано ранее, микросхемы могут иметь вход, разрешающий их работу. Это относится и к микросхемам dc-dc преобразователей. Подавая на такой вход напряжение нужного уровня (в соответствии с даташитом), можно разрешать и запрещать работу преобразователя, то есть управлять питанием его потребителей. Это можно использовать для отключения компонентов, например, перед уходом микроконтроллера в сон, сам преобразователь при этом будет потреблять очень малый ток. Таким образом это еще один вариант энергосбережения, который следует иметь в виду. 

Заключение

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

5 комментариев:

  1. Почитал с удовольствием, даже не смотря на то, что не нашел для себя что-то нового. Спасибо, что продолжаете писать на такие узконаправленные, но важные темы. У самого текущий проект работает через LDO стабилизатор на 2.5в и 8мгц внутреннего RC тактирования, в таком режиме МК кушает 2-2.5 мА, в режиме сна 1.1 мкА. Немного пожертвовал режимом сна, но зато в рабочем режиме получил отличный результат.

    ОтветитьУдалить
    Ответы
    1. Приветствую!
      Вчера выложил статью про использование DS3231 для вывода Ардуино/МК из сна. И в планах на ближайшее будущее материал про аппаратное включение (по кнопке/по RTC) и программное отключение питания Ардуино.

      Удалить
  2. Добрый день, Владимир подскажите пожалуйста, доминантой при создании устройства идет энергопотребление и универсальность расходников, то есть, питание - любой мизинчик и таблетка для часов (форм фактор таблетки пока не выбрал, но что-то типа CR2032, 3V), а так же любая легкодоступная microSD, так вот, вопрос возник как раз с последней.

    Как отразиться на ее работе, если я использую пониженную частоту и внутренний генератор? Хотя бы до 8мГЦ, в идеале бы до 1мГЦ, но тут если честно где-то попадалась информация, что проблемы синхронизации будут точно, так ли это? Карта вообще будет работать при такой частоте МК?

    И еще, в активном режиме вся система (ATmega328P, датчик и microSD) питается от мизинчика через DC-DC, а вот спит МК от батарейки 3V, параллельно с часами реального времени, после пробуждения по прерыванию с часов, МК будит DС-DС и переходит на питание с него, так вот вопрос - имеет ли смысл искусственно понижать напряжение до 1.8V (и с батарейки для сна тоже), персонально для МК, если для работы датчика и microSD преобразователь дает 3.3? Такое вообще возможно при использовании одного DC-DC?

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      попадалась информация, что проблемы синхронизации будут точно, так ли это? - Проблемы с синхронизацией могут быть в том случае, если, например, 2 устройства договорились общаться по Serial на скорости 9600, и тут вы программно меняете частоту одного из них, при этом все тактовые сигналы тоже меняются. Вот тут и возникнут проблемы. В случае с SPI или I2C скоростью обмена управляет мастер и она может быть сколь угодно низкой, проблем с синхронизацией не будет.

      имеет ли смысл искусственно понижать напряжение до 1.8V (и с батарейки для сна тоже), персонально для МК - В даташите есть график ATmega328: Power-Down Supply Current vs. VCC, там разница между 3,3В и 1,8В около 0,1мкА - ради этого не стоит заморачиваться.

      Удалить