Обзор режимов сна ESP32 и их энергопотребление
ESP32 — впечатляющий кусок кремния: он содержит два мощных процессорных ядра, которые могут обрабатывать данные на сотнях мегагерц, подключаться по Wi-Fi и Bluetooth и управлять внешним миром через свои GPIO-выводы.
Но, как однажды сказал мудрый инженер,
«с Большой Мощностью приходит Большое Потребление Энергии»
Когда ваш проект подключён к розетке, вы не слишком беспокоитесь о том, сколько тока он потребляет. Однако в проектах с питанием от батареи каждый миллиампер имеет значение. Несколько лишних миллиампер тут и там могут означать разницу между неделями и месяцами автономной работы.
К счастью, ESP32 не просто мощный — он также умён в отношении энергопотребления. Он предлагает ряд сложных режимов энергосбережения, которые при правильном использовании могут значительно снизить потребление энергии, не жертвуя функциональностью.
В этом руководстве мы рассмотрим эти энергосберегающие режимы, поймём, когда использовать каждый из них, и узнаем, как максимально продлить срок службы батареи, получая при этом максимум от ESP32. Давайте начнём!
Режимы питания ESP32
ESP32 предлагает пять различных режимов работы:
Активный режим (Active Mode)
Модемный сон (Modem-sleep Mode)
Лёгкий сон (Light-sleep Mode)
Глубокий сон (Deep-sleep Mode)
Гибернация (Hibernation Mode)
Все эти режимы, кроме Активного, предназначены для снижения энергопотребления, когда чипу не нужно работать на полную мощность. Они достигают этого путём отключения определённых частей чипа при сохранении работы других.
Чтобы лучше понять, как работают эти режимы, полезно знать, что находится внутри ESP32. ESP32 содержит двухъядерный 32-битный микропроцессор вместе с 448 КБ ROM, 520 КБ SRAM и 4 МБ флеш-памяти. Он также включает модуль Wi-Fi, модуль Bluetooth, криптографический ускоритель (специальный сопроцессор, предназначенный для обработки задач шифрования), модуль RTC (часы реального времени) и несколько цифровых периферийных устройств (таких как стандартные GPIO, SPI, I2C и UART). Все эти части могут управляться ESP32 в зависимости от того, что ему нужно делать.
Блок-схема чипа ESP32 показана ниже.
Имея это в виду, давайте рассмотрим различные режимы питания ESP32, начиная с того, который потребляет больше всего энергии.
Активный режим ESP32
Активный режим — это состояние ESP32 по умолчанию, в котором чип работает на полную мощность. В этом режиме все цифровые периферийные устройства активны, тактовые генераторы процессора работают, а радиочастотный модуль, отвечающий за связь по Wi-Fi и Bluetooth, полностью способен как передавать, так и принимать данные. Поскольку одновременно включено так много компонентов, ESP32 потребляет больше всего энергии именно в этом режиме.
Энергопотребление в активном режиме значительно варьируется и в первую очередь определяется активностью радиочастотного модуля, который является самой энергоёмкой частью ESP32.
Во время передачи Wi-Fi пиковое потребление тока может варьироваться от 180 мА до 240 мА в зависимости от схемы модуляции (метода, используемого для кодирования данных), уровня мощности передачи (TX power) и используемой скорости передачи данных.
Режим приёма Wi-Fi менее требователен, чем передача, но всё равно требует значительного количества энергии. Во время приёма Wi-Fi устройство потребляет от 95 мА до 100 мА.
Операции Bluetooth Classic и Bluetooth Low Energy (BLE) обычно потребляют меньше энергии по сравнению с Wi-Fi. При передаче пакетов Bluetooth на мощности 0 дБм чип обычно потребляет около 130 мА, а при приёме Bluetooth — от 95 мА до 100 мА.
Согласно даташиту ESP32, потребление тока радиочастотным модулем в активном режиме составляет:
Рабочее состояние |
Режим работы |
Мощность передачи |
Типичный ток |
|---|---|---|---|
Wi-Fi TX |
802.11b, DSSS 1 Мбит/с |
+19.5 дБм |
240 мА |
Wi-Fi TX |
802.11g, OFDM 54 Мбит/с |
+16 дБм |
190 мА |
Wi-Fi TX |
802.11n, OFDM MCS7 |
+14 дБм |
180 мА |
Wi-Fi RX |
802.11b/g/n |
Н/Д |
95 – 100 мА |
Рабочее состояние |
Режим работы |
Мощность передачи |
Типичный ток |
|---|---|---|---|
BT/BLE TX |
Передача |
0 дБм |
130 мА |
BT/BLE RX |
Приём |
Н/Д |
95 – 100 мА |
Этот режим, без сомнения, потребляет больше всего тока и является наименее эффективным. Чтобы сэкономить энергию, особенно для проектов с питанием от батареи, вы должны в конечном итоге переключиться на один из других энергосберегающих режимов.
Модемный сон ESP32
Режим модемного сна — это часто используемый метод поддержания активного Wi-Fi-соединения при значительном снижении среднего потребления энергии ESP32. Он специально разработан для ситуаций, когда ESP32 подключён к маршрутизатору (точке доступа, AP) в качестве Wi-Fi-станции (STA), но не нуждается в постоянной передаче данных. Другими словами, устройство остаётся подключённым, но не тратит энергию, когда реальная связь не происходит.
Интервал DTIM
Принцип работы модемного сна основан на хитром механизме, называемом картой индикации доставки трафика, или сокращённо DTIM (Delivery Traffic Indication Map).
Когда ESP32 подключается к Wi-Fi-маршрутизатору, он согласовывает интервал DTIM — определённое временное окно, в течение которого маршрутизатор соглашается удерживать (буферизировать) любые данные, которые необходимо отправить ESP32, вместо того чтобы отправлять их немедленно. Между этими интервалами ESP32 отключает свой радиочастотный модуль (радио Wi-Fi/Bluetooth), сохраняя при этом работу процессора.
Непосредственно перед приходом следующего маяка DTIM ESP32 включает свой приёмник на мгновение, чтобы проверить, удерживает ли маршрутизатор какие-либо данные для него. Если данных нет, он немедленно снова отключает радиочастотный модуль. Повторяя этот цикл, ESP32 поддерживает своё Wi-Fi-соединение, при этом значительно снижая потребление энергии, потому что энергоёмкий радиочастотный модуль остаётся выключенным большую часть времени.
В режиме модемного сна процессор остаётся полностью работоспособным, тактовая частота настраивается, и все цифровые периферийные устройства остаются активными, как и в активном режиме. Основное отличие заключается в том, что радиочастотный модуль выключен большую часть времени.
Даже при выключенном радиочастотном модуле ядра процессора по-прежнему потребляют энергию, и количество потребляемой ими энергии прямо пропорционально их тактовой частоте (скорости работы). Чем выше частота процессора, тем больше тока потребляет чип.
Процессор может работать на различных частотах, включая 80 МГц, 160 МГц и 240 МГц. На максимальной скорости 240 МГц ESP32 обычно потребляет от 30 мА до 68 мА, а на минимальной скорости 80 МГц — обычно от 20 мА до 25 мА.
Вот подробная разбивка потребления тока на разных частотах процессора:
Частота |
Тип чипа |
Типичный ток |
|---|---|---|
240 МГц |
Двухъядерный чип(ы) |
30 мА – 68 мА |
240 МГц |
Одноядерный чип(ы) |
Н/Д |
160 МГц |
Двухъядерный чип(ы) |
27 мА – 44 мА |
160 МГц |
Одноядерный чип(ы) |
27 мА – 34 мА |
80 МГц (Нормальная скорость) |
Двухъядерный чип(ы) |
20 мА – 31 мА |
80 МГц (Нормальная скорость) |
Одноядерный чип(ы) |
20 мА – 25 мА |
Лёгкий сон ESP32
Режим лёгкого сна выступает как золотая середина между высокопроизводительной обработкой и настоящим глубоким сном. В этом режиме ESP32 использует технику, называемую тактовым стробированием (Clock Gating).
Что такое тактовое стробирование (Clock Gating)?
Тактовое стробирование — это популярный метод управления энергопотреблением, который снижает динамическую мощность в цифровых схемах путём временной остановки тактового сигнала для частей схемы, которые в данный момент не используются, позволяя им приостановить свою работу, не будучи полностью выключенными. Это экономит энергию, при этом позволяя устройству быстро проснуться.
В этом режиме ESP32 останавливает тактовые сигналы, идущие к ядрам процессора и к большинству цифровых периферийных устройств. Поскольку эти части не работают активно, общее энергопотребление снижается примерно до 0,8 мА.
Несмотря на то что ESP32 в основном приостановлен в этом состоянии, он всё ещё может проснуться несколькими способами.
Прерывания GPIO: Изменения уровня напряжения на цифровых GPIO-выводах могут вызвать пробуждение чипа, позволяя ему реагировать на физические нажатия кнопок или сигналы датчиков.
Пробуждение по UART: Активность на линии UART RX может вызвать пробуждение, что означает, что устройство может спать, пока не обнаружит входящие последовательные данные.
Таймеры: Внутренние высокоточные таймеры могут быть запрограммированы на пробуждение через заданное время, что идеально подходит для запланированных задач или периодических считываний датчиков.
Это позволяет ESP32 спать в ожидании события, не теряя способности быстро реагировать.
В режиме лёгкого сна ESP32 обеспечивает «Полное сохранение RAM», которое сохраняет всё содержимое оперативной памяти перед переходом в сон. Когда чип просыпается, он продолжает выполнение с той самой строки кода, которая идёт сразу после команды сна, так что кажется, что программа приостановилась на мгновение, а не перезапустилась и не потеряла данные.
Ключевое преимущество режима лёгкого сна — его чрезвычайно малая задержка пробуждения, которая составляет менее 1 миллисекунды. Такое быстрое возобновление делает практичным переход в лёгкий сон даже на очень короткие периоды простоя, поскольку чип может проснуться практически мгновенно при необходимости, экономя энергию без заметной задержки в работе.
Глубокий сон ESP32
Глубокий сон — это наиболее важный режим низкого энергопотребления для IoT-устройств с питанием от батареи. В этом режиме ESP32 агрессивно снижает энергопотребление, отключая питание ядер процессора, системной оперативной памяти и всех цифровых периферийных устройств.
Единственные компоненты, которые остаются активными во время глубокого сна, включают:
RTC-контроллер: Конечный автомат, который управляет длительностью сна и триггерами пробуждения.
RTC-периферия: Специализированный набор маломощных периферийных устройств, включая встроенный датчик температуры, АЦП, RTC GPIO и сенсорные панели.
RTC-память: Разделена на быструю память RTC (8 КБ) и медленную память RTC (8 КБ).
ULP (Ultra-low-power) сопроцессор: Маломощный микроконтроллер, встроенный в чип, который может выполнять простые задачи, пока основной процессор находится в режиме глубокого сна.
Потребление тока в режиме глубокого сна, таким образом, полностью зависит от того, какие из этих компонентов оставлены включёнными для пробуждения процессора. Оно обычно составляет от 10 мкА до 150 мкА, что чрезвычайно мало по сравнению с другими режимами.
Существует четыре вида источников пробуждения, которые могут вывести ESP32 из глубокого сна:
Пробуждение по таймеру
Первый — это пробуждение по таймеру, которое использует только RTC-контроллер и таймер RTC для пробуждения чипа после прошествия определённого времени. В этом случае ESP32 потребляет около 10 мкА тока.
Внешнее пробуждение (Ext0 и Ext1)
Второй источник — это внешнее пробуждение, которое опирается на специальные выводы, называемые RTC GPIO, которые остаются под питанием, пока остальная часть чипа спит. Внешнее пробуждение имеет две формы: Ext0 и Ext1.
Ext0: использует только один вывод RTC GPIO для пробуждения устройства (например, одно нажатие кнопки) и обычно потребляет около 50 мкА до 100 мкА.
Ext1: может одновременно отслеживать несколько выводов RTC GPIO (например, несколько кнопок, расположенных в виде клавиатуры), и поскольку он полностью управляется RTC-контроллером, он использует всего около 10 мкА, что делает его более энергоэффективным, чем Ext0.
Пробуждение по касанию
Ещё один источник пробуждения — пробуждение по касанию, при котором ESP32 просыпается, когда к одному из его ёмкостных сенсорных выводов прикасаются. В этом случае потребление тока составляет около 30 мкА.
Шаблон мониторинга датчиков ULP
В этом режиме основной процессор выключен, а ULP-сопроцессор остаётся активным. Он периодически просыпается, считывает показания датчика (используя АЦП или I2C-связь), а затем снова возвращается в сон. Он пробуждает основной процессор только при выполнении определённого условия, например, когда показание датчика превышает пороговое значение. В этом случае средний ток составляет около 100 мкА. Этот шаблон идеален для IoT-приложений с питанием от батареи, которые требуют периодических считываний датчиков без постоянной работы энергоёмкого основного процессора, что значительно экономит энергию.
Таблица ниже суммирует энергопотребление в различных конфигурациях глубокого сна:
Источник пробуждения |
Типичный ток |
|---|---|
Только таймер |
6 – 10 мкА |
Пробуждение Ext0 |
50 – 100 мкА |
Пробуждение Ext1 |
10 мкА |
Шаблон мониторинга датчиков ULP |
100 мкА при 1% рабочем цикле |
Пробуждение по касанию |
30 мкА |
Задержка пробуждения и заглушка пробуждения из глубокого сна
Есть один важный компромисс, о котором следует знать в режиме глубокого сна. Поскольку системная оперативная память отключается во время глубокого сна, все данные, которые в ней хранились, теряются. Это означает, что пробуждение из глубокого сна структурно аналогично полному системному сбросу. Чип должен пройти полную последовательность загрузки — загрузку загрузчика из ROM, проверку флеш-памяти и инициализацию среды выполнения — что значительно влияет на задержку пробуждения, обычно увеличивая её до 200 мс — 500 мс.
Однако эту задержку пробуждения можно оптимизировать с помощью «заглушки пробуждения из глубокого сна» (Deep-sleep wake stub). Это небольшая функция, хранящаяся в быстрой памяти RTC, которая запускается немедленно, когда чип просыпается, даже до загрузчика или любого обычного кода прошивки. Это позволяет выполнять быстрые, критичные по времени задачи сразу после пробуждения.
Поскольку память RTC остаётся под питанием во время глубокого сна, любые данные, хранящиеся в ней, остаются в безопасности, даже когда остальная часть чипа выключена. Это позволяет ESP32 запоминать важную информацию до перехода в сон, так что при пробуждении он может продолжить работу без потери прогресса.
Например, метеостанция, отправляющая показания температуры раз в час, может хранить номер последнего показания в памяти RTC. После пробуждения ESP32 может прочитать этот номер и сразу продолжить со следующим показанием, вместо того чтобы начинать счёт сначала.
Если вы хотите узнать больше о том, как настроить режим глубокого сна ESP32 и использовать его различные источники пробуждения в ваших проектах, пожалуйста, ознакомьтесь с нашим подробным руководством ниже.
Когда ваш IoT-проект питается от сетевого адаптера, вы не слишком беспокоитесь о потреблении энергии. Но если вы собираетесь питать свой проект от батареи…
Режим гибернации ESP32
Режим гибернации — это самое энергосберегающее состояние сна, доступное на ESP32. Он предназначен для ситуаций, когда ESP32 будет неиспользуемым очень долгое время или должен просыпаться лишь изредка. Это делает его идеальным для систем с питанием от батареи, которые должны работать месяцами или даже годами без подзарядки.
В режиме гибернации ESP32 отключает ещё больше частей чипа, чем в глубоком сне. Как и в глубоком сне, ядра процессора, системная оперативная память и все цифровые периферийные устройства выключены. Однако гибернация идёт дальше, также отключая внутренний генератор на 8 МГц, ULP-сопроцессор и всю память RTC. Это означает, что внутри ESP32 во время гибернации почти ничего не остаётся под питанием.
Единственная часть, которая остаётся активной — это один таймер RTC, работающий на медленном тактовом генераторе. Этот таймер отвечает за пробуждение ESP32, когда запрограммированное время будет достигнуто. Поскольку почти всё остальное внутри чипа обесточено, ESP32 потребляет всего около 5 мкА.
Есть одно очень важное отличие между гибернацией и глубоким сном. Поскольку память RTC обесточена в режиме гибернации, ESP32 не может сохранять никакие переменные в памяти. Это означает, что когда ESP32 просыпается из гибернации, он, по сути, начинает полностью с чистого листа, без каких-либо воспоминаний о том, что он делал перед тем, как заснул. Это делает гибернацию идеальной для ситуаций, когда вам просто нужно, чтобы чип проснулся в запланированное время и выполнил задачу с нуля.