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").

[ESP32]

Мнемоника Частота тактов Режим скорости Возможности тактирования
APB_CLK 80 МГц High / Low  
REF_TICK 1 МГц Совместимо с динамическим масштабированием частоты (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_set_fade_with_time()
ledc_set_fade_with_step()
ledc_set_fade()

Фейдинг начинается вызовом 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().

[Ссылки]

1. ESP32-C3 LED Control (LEDC) site:docs.espressif.com.
2. ESP32: API-функции ESP-IDF управления ШИМ-контроллером LEDC.
3ESP32-C3: контроллер ШИМ (LEDC).