Блок ШИМ RP2040 состоит из 8 одинаковых слайсов, у каждого по два канала A и B — всего 16 выходов, которые можно вывести на любой из 30 выводов GPIO (даташит RP2040, раздел 4.5). Слайс считает 16-битным счётчиком от 0 до TOP, его тактирует системная частота через дробный делитель, а каждый канал сравнивает счётчик со своим уровнем.
Частота и период
Период ШИМ в тактах системной частоты (даташит RP2040, раздел 4.5.2.6):
TOP — от 0 до 65 535, целая часть делителя — от 1 до 255, дробная — от 0 до 15 шестнадцатых. В обычном режиме счётчик после TOP сбрасывается в 0, в режиме с коррекцией фазы (PH_CORRECT = 1) идёт обратно вниз — частота вдвое ниже, а импульс всегда отцентрован на одной точке периода независимо от скважности.
Скважность задаёт уровень канала (регистр CC): доля времени в единице равна уровень / (TOP + 1), а уровни от 0 до TOP + 1 дают от 0 до 100 % включительно, без коротких выбросов на краях (раздел 4.5.2.2). Поле уровня в регистре CC 16-битное (таблица 520), поэтому при TOP = 65 535 уровень 65 536 не записать и наибольшая скважность — 65 535 / 65 536; для чистых 100 % возьмите TOP не больше 65 534. Ступеней скважности тем больше, чем больше TOP, поэтому калькулятор держит делитель равным 1, пока TOP помещается в 16 бит, и только для частот ниже fsys/65 536 — 1907 Гц при 125 МГц — включает дробный делитель. Дробная часть реализована сигма-дельтой первого порядка (раздел 4.5.2.4): соседние периоды немного различаются, а средняя частота точная.
Выводы и слайсы
| GPIO | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Канал | 0A | 0B | 1A | 1B | 2A | 2B | 3A | 3B | 4A | 4B | 5A | 5B | 6A | 6B | 7A | 7B |
GPIO16–GPIO29 повторяют ту же последовательность с 0A по 6B (таблица 515 даташита): номер слайса — , канал A у чётных выводов и B у нечётных. Каналы одного слайса имеют общую частоту, но независимую скважность. Светодиод платы Raspberry Pi Pico подключён к GPIO25 — это канал 4B. Назначение остальных выводов платы показано на странице Raspberry Pi Pico, ток светодиода поможет подобрать калькулятор резистора.
Для сравнения: у ESP32 ШИМ строится на контроллере LEDC с 20-битным счётчиком — его считает калькулятор LEDC, а у Arduino на AVR частоты жёстко связаны с делителями таймеров — см. ШИМ Arduino.
Частые вопросы
Какая частота ШИМ у Raspberry Pi Pico по умолчанию?
Конфигурация по умолчанию из Pico SDK — делитель 1 и wrap (TOP) 65 535 без коррекции фазы. При системной частоте 125 МГц это 125 000 000 / 65 536 ≈ 1907 Гц с 65 536 ступенями скважности.
Какая минимальная частота ШИМ у RP2040?
Около 7,45 Гц при 125 МГц: наибольший TOP 65 535 и наибольший делитель 255 15/16 (даташит RP2040, раздел 4.5.2.4). С коррекцией фазы — вдвое меньше. Более низкие частоты делают программно, по прерываниям таймера.
Почему два вывода RP2040 меняют частоту вместе?
Каналы A и B одного слайса делят счётчик, TOP и делитель: частота у них общая, а скважность у каждого своя. Кроме того, GPIO16–GPIO29 повторяют слайсы GPIO0–GPIO15: GPIO0 и GPIO16 — это один и тот же канал 0A (таблица 515), и на них будет один и тот же сигнал.
Источники
- Raspberry Pi. RP2040 Datasheet — 4.5 — 8 слайсов по 2 канала, 16-битный счётчик до TOP, дробный делитель 8.4 (INT 1…255, FRAC 0…15), режим с коррекцией фазы вдвое снижает частоту, 4.5.2.2 — уровни CC от 0 до TOP + 1 дают 0…100 % включительно; 4.5.2.4 — около 7,5 Гц минимум при 125 МГц (эталон тестов); 4.5.2.6 — период (TOP + 1) · (PH_CORRECT + 1) · (DIV_INT + DIV_FRAC / 16); таблица 515 — выводы GPIO и каналы; таблицы 520, 521 — CC A и B по 16 бит, TOP после сброса 0xFFFF
- Raspberry Pi. Pico SDK: hardware/pwm.h (github.com/raspberrypi/pico-sdk) — pwm_get_default_config() — делитель 1, wrap 0xFFFF без коррекции фазы (эталон тестов); делитель 1 ≤ div < 256; pwm_gpio_to_slice_num, pwm_set_clkdiv_int_frac4, pwm_set_wrap, pwm_set_phase_correct, pwm_set_gpio_level, pwm_set_enabled
- Raspberry Pi. Raspberry Pi Pico Datasheet — GPIO25 — светодиод платы
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/rp2040-pwm/" title="ШИМ RP2040 и Raspberry Pi Pico: TOP, делитель, частота" 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/rp2040-pwm/">ШИМ RP2040 и Raspberry Pi Pico: TOP, делитель, частота</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>Обновлено .
Нашли ошибку в расчёте?