Найти тему
K12 :: О ESP32 и не только

Ограничение тока выхода GPIO для ESP32 без использования резисторов и ШИМ

Добрый день, уважаемые читатели!

Однажды я написал статью, где рассказывал как работать с GPIO API на микроконтроллере ESP32. Рассказывал я про ESP-IDF, но, скорее всего, данное API будет доступно и из-под платформы Arduino32. Там я упоминал об одной довольно интересной функции – gpio_get_drive_capability(), с помощью которой можно ограничивать ток, проходящий через каждую отдельную “ножку” микроконтроллера в определенных пределах. Дабы не листать статьи “туда-сюда”, я повторю отрывок текста из той статьи.

__________________________________________

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

esp_err_t gpio_set_drive_capability (gpio_num_t gpio_num , gpio_drive_cap_t strength)

где:

  • gpio_num – идентификатор GPIO
  • strength – максимально допустимый ток

Режим gpio_drive_cap_t может принимать одно из нескольких значений:

  • GPIO_DRIVE_CAP_0 – слабый, до ~5мА
  • GPIO_DRIVE_CAP_1 – сильнее, до ~10мА
  • GPIO_DRIVE_CAP_2 – средний (по умолчанию), до ~20мА
  • GPIO_DRIVE_CAP_3 – максимальный, до ~40мА

Как видите, по умолчанию ток высокого уровня ограничен на уровне 20мА. В большинстве случаев вызывать данную функцию при настройке порта не требуется. Но если ваше устройство на ESP32 требует большего тока (например при управлении мощным биполярным транзистором), то вы можете столкнуться с “неправильным” поведением.

Выдержка из datasheet-а на классическую ESP32
Выдержка из datasheet-а на классическую ESP32

Но, честно говоря, до сегодняшнего вечера я не проверял, как работает эта функция, и работает ли вообще. Сегодня я решил исправить это упущение и провести следственный почти научный эксперимент. Схема предельно проста – подключаем светодиод к выводу GPIO12 напрямую, без использования токоограничительного резистора:

-2

Светодиод нашел ещё старый, советский – АЛ307ГМ, который “держит” максимум 60мА по паспорту. Насколько мы помним, GPIO ESP32 рассчитаны на выходной ток 40мА при высоком уровне. То есть все в пределах нормы. Должно быть. А как на самом деле – выясним в процессе эксперимента.

Для тестирования быстренько набросал небольшую программку, ничего сложного:

-3

Заливаем в чип и… убеждаемся, что всё работает – смена яркости светодиода происходит каждые 5 секунд.

Видео доступно по ссылке: https://kotyara12.ru/wp-content/uploads/esp32-gpio/gpio_cap_video01.mp4

И это без использования PWM (ШИМ)! То есть никаких высокочастотных миганий светодиода.

Давайте измерим ток через светодиод в каждом из режимов:

То есть реальный ток составил:

  • GPIO_DRIVE_CAP_0около ~8,5мА
  • GPIO_DRIVE_CAP_1около ~17мА
  • GPIO_DRIVE_CAP_2 – (по умолчанию) около ~32,5мА
  • GPIO_DRIVE_CAP_3около ~58мА

Как видим, ограничение тока наступает при более высокий значениях, чем заявлено в документации. Связано это, по моему личному мнению, с тем, что в документации указаны рекомендованные токи при заданных режимах, а у меня получились по сути предельные. И ESP32 способен “потянуть” немного больше, чем заявленные 40мА, причем нагрева модуля я не заметил (впрочем, при максимальном токе мог нагреваться сам чип под крышкой).

Для чего это можно использовать?

Конечно же, это не полноценный стабилизатор тока. Это скорее ограничитель тока. Так как неизвестно, как он будет себя вести при изменении напряжения питания. Но для многих задач эта функция вполне может пригодится.

Самое первое что приходит в голову – это ограничение максимального тока выхода если "что-то пошло не так". Или ограничение суммарного тока по всем выходам, если вы, например, подключили много светодиодов одновременно. Своего рода страховка от перегрузки.

Ещё можно подключать светодиоды “напрямую”, без использования резисторов. И при этом имеется возможность регулировать их яркость без использования ШИМ-модуляции. Для обычных индикаторных светодиодов 50мА – это всё таки слишком, но для мощных "осветительных" - вполне может пригодиться. Например так можно “притушить” светодиоды или светодиодные индикаторы в ночное время.

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