Малина: как работает ШИМ через DMA? - PullRequest
0 голосов
/ 19 мая 2018

Я прочитал, что драйвер для "Software PWM" каким-то образом работает на PWM-HW и обрабатывает все GPIO без использования CPU.Может кто-нибудь объяснить, как это работает?Есть ли второй процессор в Raspberry Pi, используемый для модуля PWM и PCM (есть ли схема для блоков)?

Вопрос связан с этим превосходным драйвером , который я часто использовалв моих роботах.

Вот объяснение, которое, к сожалению, я не понимаю ...

Драйвер работает, устанавливая связанный список блоков управления DMA с последнимиодин связан с первым, поэтому после инициализации контроллер DMA постоянно циклически переключается, и драйверу не нужно вмешиваться, кроме случаев, когда необходимо изменить ширину импульса.На данный период существует два блока управления DMA;первая передает одно слово в регистр очистки вывода GPIO, а вторая передает некоторое количество слов в ШИМ FIFO для генерации необходимого времени ширины импульса.Кроме того, с этими блоками управления по одному для каждого сконфигурированного сервопривода, который используется для установки выхода.

Хотя драйвер действительно использует периферийное устройство ШИМ, он использует его только для изменения скорости передачи DMA, чтобыгенерировать точные задержки. "

Правильно ли следующее понимание:

Контроллер DMA подобен второму процессору. Вы можете запустить на нем код. Поэтому он используется здеськонтролировать все верхние и нижние состояния выводов Raspberry GPIO вместе с блоком PWM. Контроллер DMA делает это непрерывно. Вероятно, в Raspberry имеется более одного контроллера DMA, поэтому скорость ОС Linux не сильно зависит от одного отсутствующегоКонтроллер DMA.

Я не понимаю, как именно DMA и PWM работают вместе.

1 Ответ

0 голосов
/ 28 октября 2018

Я рекомендую прочитать Исходный код RPIO вместе с СервоБластером , так как он немного упрощен и может помочь в понимании.Также очень важно: Инструкция Broadcom BCM2835 , которая содержит все мельчайшие детали.

есть схема для блоков

Руководство содержит всеФункциональные возможности, предлагаемые чипом (хотя, насколько я видел, не в блок-схеме.)

Правильно ли следующее понимание:

Контроллер DMAчасть основного чипа (Broadcom, хотя я думаю, что то же самое происходит на настольных процессорах).Он не может точно выполнять код, но он может копировать память через периферийные устройства сам по себе, не тратя время основного процессора.Контроллер DMA имеет разные каналы, которые могут копировать память независимо и работать независимо от ЦП.

Он настраивается с помощью «блоков управления» (страница руководства BCM 40, 4.2.1.1): выможет сказать контроллеру DMA сначала скопировать память из A в B, затем из C в D. и т. д.

не понимают, как именно DMA и PWM работают вместе

DMA используется для отправки данных на ШИМ-контроллер («Pulse Width Modulator», Руководство по BCM, стр. 138, глава 9), который потребляет данные и создает очень точную задержку.Интересно, что ШИМ-контроллер ... не используется для генерации импульсов ШИМ, а просто для ожидания.

Может кто-нибудь объяснить, как это работает?

В конечном счете, вынастройте значение выводов GPIO (или настройки генератора ШИМ или ИКМ), установив память по специальному адресу;память в этой области представляет периферийную конфигурацию (Руководство по BCM, стр. 89, глава 6).

Итак, идея такова: скопируйте 1 в память, управляющую значением контакта GPIO, используя контроллер DMA;дождитесь ширины импульса;скопируйте 0 на значение вывода GPIO;ждать оставшуюся часть периода;петля.Поскольку контроллер DMA делает это, он не потребляет циклы ЦП.

Ключевым моментом здесь является возможность заставить контроллер DMA «ждать» точное количество времени, и для этого RPIOи ServoBlaster использует ШИМ-контроллер в режиме FIFO (генератор PCM также имеет такую ​​функциональность, но давайте придерживаться ШИМ).Это означает, что ШИМ-контроллер «отправит» данные, которые он читает из своей так называемой очереди FIFO, а затем остановится.Неважно, как оно «отправлено» (страница справочника BCM 139, 9.4 MSENi=0), ключевой момент заключается в том, что для этого требуется фиксированное количество времени.На самом деле, даже не имеет значения, какие данные отправляются: контроллер DMA настроен на запись в очередь FIFO и затем ожидание, пока контроллер PWM не закончит отправку данных, и это создасточень точная задержка.

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

Пример

У нас максимальное разрешение 1 мс (определяется задержкой ШИМ), и мы хотим иметь импульс с рабочим циклом 25% с частотой 125 Гц.Период импульса составляет 8 мс.Операция прямого доступа к памяти будет

  1. Установить вывод на 1 (запись прямого доступа к памяти в память GPIO)
  2. Ожидание 1 мс (запись прямого доступа к памяти в ШИМ FIFO)
  3. Ожидание 1 мс (Запись DMA в PWM FIFO)
  4. Установите вывод на 0 (запись DMA в память GPIO)
  5. Подождите 1 мс (запись DMA в PIFM FIFO)
  6. ... repeat "Подождите 1 мс "еще 4 раза.
  7. Подождите 1 мс (запись DMA в PIFM FIFO) и вернитесь к 1.

Таким образом, потребуется не менее 10 блоков управления DMA (8 ожиданийинструкции, заданные периодом / задержкой плюс 2 операции записи).

Примечание: в ServoBlaster и RPIO, он будет использовать ровно 16 блоков управления DMA, потому что (для более высокой точности) они всегда выполняют операцию «копирования в память» перед «операцией ожидания».Операция «копирование из памяти» является просто фиктивной, если только ей не нужно изменить значение контакта.

...