LEDC — контроллер ШИМ ESP32, задуманный для управления яркостью светодиодов, но пригодный для любого ШИМ. У него 16 каналов — 8 высокоскоростных и 8 низкоскоростных — и по 4 таймера каждого вида. Каналы берут частоту и разрешение от таймера, а скважность задают сами (ESP32 TRM, глава 28).
Частота и разрешение
Таймер делит свой источник такта дробным делителем и считает до (TRM, раздел 28.2.2):
A — целая часть от 1 до 1023, B — дробная от 0 до 255, разрешение DUTY_RES — до 20 бит. Чем выше частота, тем меньше доступно бит: произведение частоты на не может превысить частоту источника. Таблица 28.2-1 TRM:
| Источник | Частота ШИМ | Наибольшее разрешение | Наименьшее разрешение |
|---|---|---|---|
| APB_CLK 80 МГц | 1 кГц | 16 бит | 7 бит |
| APB_CLK 80 МГц | 5 кГц | 13 бит | 4 бита |
| APB_CLK 80 МГц | 10 кГц | 12 бит | 3 бита |
| RC_FAST_CLK 8 МГц | 1 кГц | 12 бит | 3 бита |
| RC_FAST_CLK 8 МГц | 2 кГц | 11 бит | 2 бита |
| REF_TICK 1 МГц | 1 кГц | 9 бит | 1 бит |
Наибольшее разрешение получается при делителе 1, наименьшее — при наибольшем делителе 1023 + 255/256. Если частоту и разрешение нельзя совместить, драйвер ESP-IDF возвращает ошибку «requested frequency and duty resolution cannot be achieved» и печатает значение div_param — делитель, умноженный на 256.
Дробная часть делителя устроена так: из 256 импульсов таймера B делятся на A + 1, остальные — на A. Средняя частота получается точной, но соседние периоды ШИМ немного различаются по длительности. Для светодиодов это незаметно, а для точного тактового сигнала лучше подобрать частоту с B = 0.
Источники такта
| Источник | Частота | Таймеры |
|---|---|---|
| APB_CLK | 80 МГц | высоко- и низкоскоростные |
| REF_TICK | 1 МГц | высоко- и низкоскоростные |
| RC_FAST_CLK | ≈ 8 МГц, калибруется драйвером | только низкоскоростные, работает в лёгком сне |
Данные — из руководства ESP-IDF. Высокоскоростные таймеры есть только у ESP32 — у ESP32-S2, S3, C3 и более новых чипов остался лишь низкоскоростной режим. Изменения делителя и разрешения высокоскоростной таймер применяет после следующего переполнения, а низкоскоростной — только после установки бита LEDC_LSTIMERx_PARA_UP (TRM, 28.2.2).
Скважность
Значение duty — от 0 до включительно: 0 — постоянный ноль, — постоянная единица (руководство ESP-IDF, функция ledc_set_duty). Для 50 % при 13 битах это 4096. Вывести ШИМ можно на любой GPIO через матрицу, кроме GPIO34–GPIO39: у них нет выходного каскада. Какие выводы ESP32 нельзя занимать из-за загрузки, разобрано на странице выводов обвязки, а расчёт тока светодиода — в калькуляторе резистора.
Частые вопросы
Какое максимальное разрешение ШИМ у ESP32 на частоте 5 кГц?
13 бит, то есть 8192 ступени яркости, — при такте APB 80 МГц и делителе 1: 80 000 000 / 5000 = 16 000, а 2^13 = 8192 — наибольшая степень двойки, которая в это число помещается (таблица 28.2-1 TRM и руководство ESP-IDF). На 1 кГц доступно 16 бит, на 10 кГц — 12 бит.
Что значит ошибка «requested frequency and duty resolution cannot be achieved»?
Драйвер не может подобрать делитель таймера: при слишком высокой частоте и разрешении он получается меньше 1 (в сообщении div_param меньше 256), при слишком низких — больше 1023,996. Например, 20 МГц с 3 битами дают div_param = 128. Уменьшите разрешение или частоту, а для очень низких частот возьмите источник REF_TICK 1 МГц.
Какую наибольшую частоту ШИМ выдаёт ESP32?
40 МГц при разрешении 1 бит: такт APB 80 МГц делится на 1 и на 2^1. Скважность тогда фиксирована на 50 %, такой сигнал годится как тактовый для внешних микросхем, например камеры.
Источники
- Espressif. ESP32 Technical Reference Manual, версия 5.8 — глава 28 (LEDC): 8 высокоскоростных и 8 низкоскоростных каналов, 4 + 4 таймера; 28.2.2 — делитель LEDC_CLK_DIV = A + B/256 от 1 до 1023 + 255/256, счётчик до 20 бит, f = f_LEDC_CLK / (LEDC_CLK_DIV · 2^DUTY_RES); таблица 28.2-1 — наибольшее и наименьшее разрешение для частот (эталон тестов)
- Espressif. ESP-IDF Programming Guide: LED Control (LEDC), ESP32 — источники APB_CLK 80 МГц, REF_TICK 1 МГц, RC_FAST_CLK ≈ 8 МГц; 5 кГц — до 13 бит; наибольшая частота 40 МГц при 1 бите; 20 МГц и 3 бита — ошибка div_param = 128; duty от 0 до 2^разрешение; структуры ledc_timer_config_t и ledc_channel_config_t (второй источник тестов)
- Espressif. ESP32 Series Datasheet, версия 5.3 — GPIO34–GPIO39 — только входы, без выходного каскада
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/esp32-ledc/" title="ШИМ ESP32 (LEDC): частота, разрешение и делитель" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/esp32-ledc/">ШИМ ESP32 (LEDC): частота, разрешение и делитель</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?