ESP32-C3: API-функции ESP-IDF управления ШИМ-контроллером LEDC
Добавил(а) microsin
ШИМ-контроллер для управления яркостью светодиодов (LEDC) микроконтроллера ESP32-C3 очень мало отличается от ESP32, поэтому можно руководствоваться описанием LEDC ESP32 [2], учитывая эти различия. Эта статья посвящена как раз отличиям контроллера LEDC чипов ESP32 и ESP32-C3.
Общее описание отличий сведено в таблицу:
Функция
ESP32
ESP32-C3
Каналы PWM (ШИМ)
16 каналов
6 каналов
Организация каналов
Каналы LEDC делятся на 2 группы по 8 каналов в каждой. Одна группа каналов LEDC работает в высокоскоростном режиме (high speed mode). Этот режим реализован аппаратно, и предоставляет автоматическое, без выбросов изменение скважности PWM. Другая группа каналов работает в низкоскоростном режиме (low speed mode), в этом режиме скважность PWM должна меняться программным драйвером. Каждая группа каналов также может также может использовать разные источники тактов.
-
Скорость ШИМ
Высокоскоростной (LEDC_HIGH_SPEED_MODE) и низкоскоростной (LEDC_LOW_SPEED_MODE) режимы генерации ШИМ.
Низкоскоростной (LEDC_LOW_SPEED_MODE) режим генерации ШИМ(1).
Тактирование(2)
APB_CLK, REF_TICK, RTC8M_CLK
APB_CLK, RTC20M_CLK, XTAL_CLK
Изменение скважности ШИМ
Программно и аппаратно
Программно и аппаратно(3)
Изменение настроек таймера ШИМ
Высокоскоростной режим позволяет без лишних выбросов менять на лету настройки генерации ШИМ [2].
-
Примечания:
(1) Все таймеры и каналы контроллера ШИМ LEDC чипа ESP32-C3 поддерживают только низкоскоростной режим. (2) См. ниже врезку "Различия тактирования LEDC для ESP32 и ESP32-C3". (3) Любое изменение настроек ШИМ (PWM) должно быть явно реализовано в программе (см. далее "Изменение сигнала PWM").
Совместимо с динамическим масштабированием частоты (Dynamic Frequency Scaling).
RTC8M_CLK
~8 МГц
Low
Совместимо с Dynamic Frequency Scaling и режимом пониженного энергопотребления Light Sleep.
[ESP32-C3]
Мнемоника
Частота тактов
Возможности тактирования
APB_CLK
80 МГц
RTC20M_CLK
~20 МГц
Совместимо с динамическим масштабированием частоты (Dynamic Frequency Scaling) и режимом пониженного энергопотребления Light Sleep.
XTAL_CLK
40 МГц
Совместимо с Dynamic Frequency Scaling.
Примечания:
1. На ESP32-C3 если для LEDC выбран в качестве тактов RTCxM_CLK, то будет выполнена внутренняя калибровка для получения точной частоты тактов. Это гарантирует точность частоты выходного сигнала PWM. 2. Для ESP32-C3 у всех таймеров один и тот же источник тактирования. Другими словами, невозможно использовать другие источники сигналов для других таймеров.
[Изменение сигнала PWM]
Как только канал начнет работать и генерировать сигнал PWM с постоянной скважностью, есть несколько способов поменять этот сигнал. Когда осуществляется управление LED, меняется главным образом яркость свечения.
В следующих двух секциях описывается, как менять скважность с помощью аппаратного и программного фейдинга. Если необходимо, также можно поменять частоту сигнала, это рассматривается в секции "Изменение частоты PWM".
Изменение скважности программно. Для установки скважности периода PWM используйте специальную функцию ledc_set_duty(). После этого вызовите ledc_update_duty() для активации изменений. Для проверки текущего установленного значения скважности используйте соответствующую функцию ledc_get_duty().
Другой способ установки скважности, как и некоторых других параметров, это вызов ledc_channel_config(), см. выше секцию "Конфигурация канала".
Диапазон передаваемых значений для изменения скважности зависит от выбранной разрешающей способности (duty_resolution), и значение должно быть от 0 до (2duty_resolution) - 1. Например, если выбранная разрешающая способность 10 (duty_resolution=10), то скважность может быть в диапазоне от 0 до 1023. Это дает точность установки уровня примерно 0.1%.
Изменение скважности аппаратно. Аппаратура LEDC обеспечивает способ плавного изменения скважности от одного значения к другому. Для использования этой возможности разрешите фейдинг функцией ledc_fade_func_install(), и затем сконфигурируйте её вызовом одной из следующих доступных функций фейдинга:
Фейдинг начинается вызовом ledc_fade_start(). Фейдинг может работать в режиме блокирования или без блокирования, см. ledc_fade_mode_t для двух различных отличающихся режимов фейдинга. Обратите внимание, что в любом из этих двух режимов следующий фейдинг или обновление на фиксированную скважность не даст эффект, пока не завершится последний процесс фейдинга.
Для получения оповещения о завершении операции фейдинга может быть зарегистрирована соответствующая callback-функция путем вызова ledc_cb_register() после того, как была установлена служба фейдинга.
Если больше не требуется фейдинг и связанное с ним прерывание, то фейдинг может быть запрещен вызовом ledc_fade_func_uninstall().
Изменение частоты PWM. LEDC API предоставляет несколько способов поменять частоту PWM "на лету":
• Установка частоты вызовом ledc_set_freq(). Имеется комплементарная функция ledc_get_freq() для проверки текущей частоты. • Изменение частоты и разрешающей способности для скважности вызовом ledc_bind_channel_timer(), чтобы привязать к каналу какой-нибудь другой таймер. • Изменение таймера канала вызовом ledc_channel_config().