Перейти к содержанию

ШИМ ESP32 (LEDC): частота, разрешение и делитель

Задайте источник такта, частоту ШИМ и разрешение — калькулятор посчитает дробный делитель таймера LEDC, фактическую частоту и значение duty для нужной скважности, покажет, какие разрешения вообще возможны на этой частоте, и выдаст код настройки для ESP-IDF.

Исходные данные

Гц
%

вывод, на который выводится ШИМ

Результат

Делитель LEDC_CLK_DIV
1 + 244/256
регистр 500 (0x1F4), допустимо 256…262 143
Фактическая частота
5 кГц+0 % к заданной
Значение duty
4096 из 8192диапазон 0…2^разрешение
Разрешение на этой частоте
4…13 биткак в таблице 28.2-1 TRM

Код ESP-IDF

#include "driver/ledc.h"

ledc_timer_config_t timer = {
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .duty_resolution = 13,
    .timer_num = LEDC_TIMER_0,
    .freq_hz = 5000,
    .clk_cfg = LEDC_AUTO_CLK,   /* the driver picks a source that fits */
};
ledc_timer_config(&timer);

ledc_channel_config_t channel = {
    .gpio_num = 18,
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .channel = LEDC_CHANNEL_0,
    .timer_sel = LEDC_TIMER_0,
    .duty = 4096,   /* 50 % of 8192 */
    .hpoint = 0,
};
ledc_channel_config(&channel);

Расчёт выполнен по формулам и данным из источников, приведённых на этой странице, и не заменяет проверку: параметры компонентов у разных производителей и даже партий различаются. Перед применением сверяйте результат с документацией на конкретные детали.

LEDC — контроллер ШИМ ESP32, задуманный для управления яркостью светодиодов, но пригодный для любого ШИМ. У него 16 каналов — 8 высокоскоростных и 8 низкоскоростных — и по 4 таймера каждого вида. Каналы берут частоту и разрешение от таймера, а скважность задают сами (ESP32 TRM, глава 28).

Частота и разрешение

Таймер делит свой источник такта дробным делителем и считает до 2DUTY_RES2^{DUTY\_RES} (TRM, раздел 28.2.2):

fШИМ=fLEDC_CLKLEDC_CLK_DIV⋅2DUTY_RES,LEDC_CLK_DIV=A+B256.f_\text{ШИМ} = \frac{f_\text{LEDC\_CLK}}{LEDC\_CLK\_DIV \cdot 2^{DUTY\_RES}}, \qquad LEDC\_CLK\_DIV = A + \frac{B}{256}.

A — целая часть от 1 до 1023, B — дробная от 0 до 255, разрешение DUTY_RES — до 20 бит. Чем выше частота, тем меньше доступно бит: произведение частоты на 2DUTY_RES2^{DUTY\_RES} не может превысить частоту источника. Таблица 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_CLK80 МГцвысоко- и низкоскоростные
REF_TICK1 МГцвысоко- и низкоскоростные
RC_FAST_CLK≈ 8 МГц, калибруется драйверомтолько низкоскоростные, работает в лёгком сне

Данные — из руководства ESP-IDF. Высокоскоростные таймеры есть только у ESP32 — у ESP32-S2, S3, C3 и более новых чипов остался лишь низкоскоростной режим. Изменения делителя и разрешения высокоскоростной таймер применяет после следующего переполнения, а низкоскоростной — только после установки бита LEDC_LSTIMERx_PARA_UP (TRM, 28.2.2).

Скважность

Значение duty — от 0 до 2DUTY_RES2^{DUTY\_RES} включительно: 0 — постоянный ноль, 2DUTY_RES2^{DUTY\_RES} — постоянная единица (руководство 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 %, такой сигнал годится как тактовый для внешних микросхем, например камеры.

Источники

  1. 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 — наибольшее и наименьшее разрешение для частот (эталон тестов)
  2. 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 (второй источник тестов)
  3. 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>

Обновлено .

Нашли ошибку в расчёте?