Могу ли я использовать GPIO как выход с широтно-импульсной модуляцией ?
Если да, то как мне это сделать и сколько параллельных, разных выходов ШИМ я могу иметь?
Могу ли я использовать GPIO как выход с широтно-импульсной модуляцией ?
Если да, то как мне это сделать и сколько параллельных, разных выходов ШИМ я могу иметь?
Ответы:
Как предположил Алекс Чемберлен , библиотека 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 больше не может работать для новых моделей пи.
Да, на Raspberry Pi есть один аппаратный выход ШИМ, подключенный к P1-12 (GPIO18). Кроме того, выходы ШИМ могут быть добавлены с использованием интерфейса I²C или SPI ; некоторые люди имели успех с этим ( сообщение на форуме ).
Вы можете использовать библиотеку WiringPi для управления выводом ШИМ; Вы можете посмотреть на код, чтобы избежать включения всей библиотеки.
Raspberry Pi не подходит для любого серьезного программного обеспечения ШИМ, поскольку Linux не является операционной системой реального времени.
Последние Pis имеют два аппаратных канала ШИМ. Кроме того, аппаратно синхронизированные импульсы ШИМ могут генерироваться независимо на всех GPIO, подключенных к 40-контактному разъему расширения.
На практике это означает, что есть два высокоточных ШИМ-канала, и все другие GPIO могут иметь ШИМ в стиле Arduino (800 Гц, 0 выключено - 255 полностью включено).
Например, сервобластер и мой поросенок и т. Д.
Не совсем ОС реального времени, но ОС RISC для Raspberry Pi представляет собой совместную многозадачность, поэтому вы можете легко запустить приложение с 100% ЦП, чтобы вы могли намного лучше управлять своими таймингами. Только не ожидайте, что будете делать что-то еще, кроме вашего собственного кода.
Я нашел эту библиотеку ( pi-blaster ), которая утверждает, что она «чрезвычайно эффективна: не использует процессор и дает очень стабильные импульсы».
Я еще не тестировал, но обновлю сразу, как только смогу (наверное сегодня)