Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Периферия ШИМ в RP2350

В RP2350 есть периферия ШИМ с 12 генераторами, которые называются слайсами (slice). Каждый слайс содержит два выходных канала (A и B), то есть всего 24 канала ШИМ. Подробные характеристики см. на странице 1077 даташита RP2350.

Давайте быстро посмотрим на ключевые понятия.

Генератор ШИМ (слайс)

Слайс — это аппаратный блок, который генерирует сигналы ШИМ. Каждый из 12 слайсов (PWM0–PWM11) — независимый блок синхронизации со своим 16-битным счётчиком, регистрами сравнения, настройками управления и делителем тактовой частоты. Эта независимость означает, что каждый слайс можно настроить на разную частоту и разрешение.

Канал

Каждый слайс содержит два выходных канала: канал A и канал B. Оба канала используют один и тот же счётчик, поэтому работают на одной частоте и синхронизированы. Однако у каждого канала свой регистр сравнения, что позволяет независимо управлять скважностью. Это даёт возможность получить от одного слайса два связанных, но разных сигнала ШИМ.

Соответствие каналов ШИМ выводам GPIO

Каждый вывод GPIO подключён к определённому слайсу и каналу. Полную таблицу соответствия вы найдёте на странице 1078 даташита RP2350. Например, GP25 (вывод встроенного светодиода) соответствует слайсу ШИМ 4, каналу B, что обозначается как 4B.

Соответствие каналов ШИМ выводам GPIO

Инициализируем периферию ШИМ и получаем доступ ко всем слайсам:

#![allow(unused)]
fn main() {
let mut pwm_slices = hal::pwm::Slices::new(pac.PWM, &mut pac.RESETS);
}

Получаем ссылку на слайс ШИМ 4 для настройки:

#![allow(unused)]
fn main() {
let pwm = &mut pwm_slices.pwm4;
}

GPIO в ШИМ

Я создал небольшую форму, которая помогает понять, какой вывод GPIO соответствует какому каналу ШИМ, и генерирует пример кода.

Выберите вывод GPIO, чтобы увидеть соответствие ШИМ и сгенерированный код.

Фазово-корректный режим

В стандартном ШИМ (быстром ШИМ) счётчик считает от 0 до TOP, а затем сразу сбрасывается в 0. Это создаёт асимметричные фронты, при которых выход меняется в разных точках цикла.

Фазово-корректный ШИМ считает от 0 до TOP, а затем обратно до 0, формируя треугольную форму сигнала. Выход переключается симметрично: один раз вверх и один раз вниз. Это даёт импульсы, центрированные относительно периода, с фронтами, которые зеркально отражают друг друга. Это снижает электромагнитные помехи и делает переходы более плавными. Компромисс в том, что фазово-корректный режим работает на половине частоты стандартного ШИМ при том же значении TOP. Подробнее об этом см. далее в разделе Фазово-корректный режим.

Настроим PWM4 на работу в фазово-корректном режиме, чтобы получить более плавные переходы выхода.

Embassy

#![allow(unused)]
fn main() {
let mut pwm_config: Config = Default::default();
pwm_config.phase_correct = true;
let mut pwm_pin = Pwm::new_output_b(p.PWM_SLICE4, p.PIN_25, pwm_config);
}

rp-hal

#![allow(unused)]
fn main() {
pwm.set_ph_correct();
}

Получаем изменяемую ссылку на канал B слайса PWM4 и направляем его выход на вывод GPIO 25.

#![allow(unused)]
fn main() {
let channel = &mut pwm.channel_b;
channel.output_to(pins.gpio25);
}