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

ШИМ RP2040 и Raspberry Pi Pico: TOP, делитель, частота

Задайте частоту ШИМ или значения TOP и делителя — калькулятор подберёт настройку слайса RP2040 с наибольшим числом ступеней скважности, посчитает фактическую частоту и уровень для нужной скважности, определит слайс и канал по номеру GPIO и выдаст код для Pico SDK.

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

МГц

125 МГц по даташиту RP2040

Режим счёта
Что задаём
Гц
%

0–29; на Pico светодиод — GPIO25

Результат

Частота ШИМ
1,000002 кГц
+0,0002 % к заданной
TOP и делитель
64515; 1 + 15/1664516 ступеней скважности
Уровень CC
322580…64516, 50 %
Слайс и канал
4BGPIO25
Наименьшая частота
7,4524 ГцTOP 65 535, делитель 255 15/16

Код Pico SDK

#include "pico/stdlib.h"
#include "hardware/pwm.h"

gpio_set_function(25, GPIO_FUNC_PWM);
uint slice = pwm_gpio_to_slice_num(25);   /* slice 4, channel B */
pwm_set_clkdiv_int_frac4(slice, 1, 15);
pwm_set_wrap(slice, 64515);
pwm_set_phase_correct(slice, false);
pwm_set_gpio_level(25, 32258);
pwm_set_enabled(slice, true);

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

Блок ШИМ RP2040 состоит из 8 одинаковых слайсов, у каждого по два канала A и B — всего 16 выходов, которые можно вывести на любой из 30 выводов GPIO (даташит RP2040, раздел 4.5). Слайс считает 16-битным счётчиком от 0 до TOP, его тактирует системная частота через дробный делитель, а каждый канал сравнивает счётчик со своим уровнем.

Частота и период

Период ШИМ в тактах системной частоты (даташит RP2040, раздел 4.5.2.6):

T=(TOP+1)⋅(PH_CORRECT+1)⋅(DIV_INT+DIV_FRAC16),f=fsysT.T = (TOP + 1) \cdot (PH\_CORRECT + 1) \cdot \left(DIV\_INT + \frac{DIV\_FRAC}{16}\right), \qquad f = \frac{f_\text{sys}}{T}.

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): соседние периоды немного различаются, а средняя частота точная.

Выводы и слайсы

GPIO0123456789101112131415
Канал0A0B1A1B2A2B3A3B4A4B5A5B6A6B7A7B

GPIO16–GPIO29 повторяют ту же последовательность с 0A по 6B (таблица 515 даташита): номер слайса — (n/2) mod 8(n / 2) \bmod 8, канал 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), и на них будет один и тот же сигнал.

Источники

  1. 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
  2. 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
  3. 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>

Обновлено .

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