Могу ли я использовать GPIO для широтно-импульсной модуляции (ШИМ)?

97

Могу ли я использовать GPIO как выход с широтно-импульсной модуляцией ?

Если да, то как мне это сделать и сколько параллельных, разных выходов ШИМ я могу иметь?

berry120
источник
Вам, вероятно, нужно указать, какую модель вы используете. Они все немного разные.
not2qubit
2
@ user1147688 Этот вопрос был задан назад, когда была только одна модель!
berry120

Ответы:

76

Как предположил Алекс Чемберлен , библиотека WiringPi, по- видимому, поддерживает как аппаратный вывод ШИМ на одном или двух выводах GPIO в зависимости от модели, так и программный ШИМ на любом из других выводов GPIO. Тем временем библиотека RPIO.PWM выполняет ШИМ через DMA на любом выводе GPIO. Фактически это промежуточное звено между аппаратным и программным ШИМ, обеспечивающим временное разрешение 1 мкс по сравнению с 100 мкс с программным ШИМ WiringPi [1] .

Какой из них подходит для ваших приложений, зависит от того, сколько выходов PWM вам нужно и какую производительность вы хотите получить от этих выходов.

Если ваше приложение терпимо к низкому временному разрешению и высокому джиттеру, то вы можете использовать программный цикл или цикл синхронизации с DMA. Если вам нужна более высокая точность / низкий уровень джиттера, вам может потребоваться аппаратная помощь.

Когда может подойти программное обеспечение ШИМ?

Если вы хотите мигать набором светодиодов с разными видимыми человеческими частотами (10 Гц) с мягкими требованиями к отклику в реальном времени, тогда программный цикл может обрабатывать столько же ШИМ, сколько у вас выводов GPIO.

Когда может пригодиться аппаратный ШИМ?

Если вы хотите управлять серводвигателем с жесткими требованиями к реагированию в режиме реального времени, вам необходимо использовать аппаратный ШИМ. Даже в этом случае у вас могут возникнуть проблемы с обеспечением отклика серво-контура в реальном времени, который связывает вход датчика с выходом ШИМ.

Стабильный серво контур должен считывать кодировщики с постоянной скоростью (низкий джиттер), записывать пересмотренные выходные значения ШИМ с регулярной скоростью, и задержка между ними должна быть фиксированной (общий низкий джиттер). Если вы не можете этого сделать, то вам придется подстроить (мягкую настройку) ваш двигатель, чтобы он не стал нестабильным под нагрузкой. Это трудно сделать с многозадачной операционной системой без поддержки низкого уровня.

Что делать, если мне нужно больше аппаратных выходов ШИМ?

Если вам нужно запустить больше сервоциклов, чем у вас с аппаратными выходами PWM, то вам, вероятно, придется разгрузить их на другое устройство, чтобы обеспечить жесткую производительность в реальном времени, отводя Raspberry Pi в качестве мягкого супервизора в реальном времени .

Одним из вариантов может быть что-то вроде 16-канального 12-разрядного ШИМ-драйвера Adafruit / серво-драйвера - интерфейс I²C - PCA9685, который позволит вам управлять 16-ю ШИМ-выходами с помощью всего нескольких выводов GPIO для шины I²C. Пример его использования можно найти в I²C 16 Channel PWM / Servo Breakout - рабочий пост на форумах Raspberry Pi.

1. Благодаря dm76 за предложение, однако вереск говорит , что RPIO.PWM больше не может работать для новых моделей пи.

Марк Бут
источник
Могу ли я использовать программный подход ШИМ для запуска двигателей постоянного тока?
Гидеон
@gideon - Да, все усилители мощности двигателя, которые я использовал, приняли ШИМ в качестве входных данных.
Марк Бут
2
К вашему сведению, библиотека RPI ( pythonhosted.org/RPIO/pwm_py.html ), кажется, имеет гораздо лучшее разрешение (1 дюйм) по сравнению с WiringPi с разрешением 100 пикселей
dm76
@MarkBooth - Никаких проблем. Библиотека действительно хорошо написана и может быть использована в качестве замены для RPi.GPIO, что очень удобно, если вы начали проект с последним и позже поняли, что нужны сигналы ШИМ ...
dm76
Я думаю, что RPIO.PWM больше не работает для новых моделей пи.
вереск
39

Аппаратный ШИМ

Да, на Raspberry Pi есть один аппаратный выход ШИМ, подключенный к P1-12 (GPIO18). Кроме того, выходы ШИМ могут быть добавлены с использованием интерфейса I²C или SPI ; некоторые люди имели успех с этим ( сообщение на форуме ).

Пример кода

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

Программное обеспечение ШИМ

Raspberry Pi не подходит для любого серьезного программного обеспечения ШИМ, поскольку Linux не является операционной системой реального времени.

Алекс Чемберлен
источник
1
Вопрос, каково определение или пример серьезного программного обеспечения ШИМ? А что такое «операционные системы реального времени» и есть ли шанс получить такую ​​на Pi
AnthonyBlake
@AnthonyBlake Ну, вы, вероятно, можете управлять яркостью света с помощью программного обеспечения ШИМ, но я подозреваю, что двигатель заглохнет. Там нет необходимости делать программный ШИМ, хотя аппаратное обеспечение проще и эффективнее. Операционные системы реального времени будут лучше объяснены Google; они гарантируют определенные вещи о том, как долго и часто работает программное обеспечение.
Алекс Чемберлен
2
@AnthonyBlake «Операционная система реального времени» (ОСРВ) - это операционная система, которая дает вам гарантию на максимальный срок выполнения. Как, например, сказать программе: «Да, у вас будет некоторое время выполнения в 33 мс (с допуском 2 или 2 мс), чтобы перевернуть этот бит булавки GPIO, чтобы дать вашему шаговому двигателю сигнал в точное время, когда он в этом нуждается. И вы можете положиться на том!" Там есть RT Linux. Не знаю, было ли это перенесено на RPi (пока).
orithena
Извините, Алекс, я специально не украл другую часть вашего ответа, но я только что заметил, что мы пришли к одному и тому же сообщению на форуме разными путями.
Марк Бут
2
Более новые модели с 40 контактами имеют второй аппаратный ШИМ, подключенный к GPIO19 (контакт 35).
Кевин
12

Последние Pis имеют два аппаратных канала ШИМ. Кроме того, аппаратно синхронизированные импульсы ШИМ могут генерироваться независимо на всех GPIO, подключенных к 40-контактному разъему расширения.

На практике это означает, что есть два высокоточных ШИМ-канала, и все другие GPIO могут иметь ШИМ в стиле Arduino (800 Гц, 0 выключено - 255 полностью включено).

Например, сервобластер и мой поросенок и т. Д.

Джоан
источник
Хороший ответ! Как я могу использовать эти два HW PWM? Мне нужно контролировать 2 сервопривода, я знаю, вы говорите, что сервобластер и pigpio - это нормально, но мне просто интересно узнать, как работает HW PWM, потому что я не могу найти о них ничего ... есть ли какие-нибудь документы для этого? У меня есть RPi 2 V1.1 для испытаний.
Козуч
2
Большая загрузка процессора не должна иметь значения. Большая нагрузка на сеть может иметь значение для gpioServo, особенно если частота дискретизации составляет 1 МГц, а не 200 кГц по умолчанию. Частота составляет 50 (Гц), диапазон рабочих циклов будет 0 - 1000000 (отображается на истинное базовое значение 0 - 5000000). 1 мс - 1 мс за 20 мс, поэтому рабочий цикл составляет 5%, поэтому 50000, 1,5 мс-> 7,5% -> 75000, 2 мс-> 10% -> 100000.
Джоан
1
Страница 102 из BCM2835 ARM Peripherals показывает различные режимы, которые могут быть назначены GPIO. Посмотрите, какие GPIO выведены в различные заголовки расширения модели Pi.
Джоан
1
@ user1147688 PLLD (500 МГц) используется как тактовая частота ядра ШИМ. Из-за того, как это работает, частота ядра ШИМ составляет 250 МГц. Чтобы иметь возможность включать и выключать (довольно важно для ШИМ), максимум составляет 125 МГц. Вы можете удвоить цифры, используя PLLC (1000 МГц), но эта PLL зависит от тактовой частоты ядра.
Джоан
2

Не совсем ОС реального времени, но ОС RISC для Raspberry Pi представляет собой совместную многозадачность, поэтому вы можете легко запустить приложение с 100% ЦП, чтобы вы могли намного лучше управлять своими таймингами. Только не ожидайте, что будете делать что-то еще, кроме вашего собственного кода.

Джон
источник
Я где-то читал, что есть аппаратное ограничение и по частоте переключения выходного контакта. Я думаю, что это было около 20 МГц. Поэтому не ожидайте, что вы сможете использовать 300 МГц ШИМ или что-то в этом роде, даже при 100% загрузке процессора.
Ponkadoodle
@Wallacoloo: Какие приложения требуют 300 МГц ШИМ?
Питер Мортенсен
2
@PeterMortensen: Ну, я не знаю, как радиопередатчики и тому подобное генерируют свои сигналы, но некоторые могут сделать это с помощью ШИМ. PiFM делает это на 100 МГц. Это, кажется, противоречит моему комментарию, поэтому я задаюсь вопросом, возможно ли, что штырь все еще может быть задан на этой частоте, но это просто, что емкость штыря ослабляет такие сигналы, так что прямоугольная волна 100 МГц может фактически колебаться от, например, (1,0 В , 2,3 В) вместо полного (0 В, 3,3 В) диапазона.
Ponkadoodle
2

Я нашел эту библиотеку ( pi-blaster ), которая утверждает, что она «чрезвычайно эффективна: не использует процессор и дает очень стабильные импульсы».

Я еще не тестировал, но обновлю сразу, как только смогу (наверное сегодня)

Glantucan
источник
Я пытался это, но пока не повезло. Насколько я могу судить, аппарат не переключается?
Мистер Маугли,
1
Просто хочу натолкнуться на это. Пи-бластер сработал для меня там, где другие ответы не сработали.
Сеф Рид