Чи можу я використовувати GPIO як вихід модуляції ширини імпульсу ?
Якщо так, то як би я пішов робити це і скільки одночасних, чітких ШІМ-результатів я можу мати?
Чи можу я використовувати GPIO як вихід модуляції ширини імпульсу ?
Якщо так, то як би я пішов робити це і скільки одночасних, чітких ШІМ-результатів я можу мати?
Відповіді:
Як запропонував Алекс Чемберлен , бібліотека WiringPi, як видається, підтримує як апаратний вихід ШІМ на одному або двох штифтах GPIO залежно від моделі, так і програмне забезпечення ШІМ на будь-якому з інших GPIO-штифтів. Тим часом бібліотека RPIO.PWM робить PWM від DMA на будь-якому штифті GPIO. Ефективно це на півдорозі між апаратним та програмним PWM, що забезпечує роздільну здатність часу на 1 мкс порівняно зі 100 мкс із програмним забезпеченням PWM з програмного забезпечення WiringPi [1] .
Який із них підходить для ваших програм, залежить від того, скільки ШІМ-виходів вам потрібно і якої продуктивності ви хочете отримати з цих виходів.
Якщо ваша програма терпима до низької роздільної здатності та великого тремтіння, тоді ви можете використовувати програмне забезпечення або підтримуваний DMA цикл синхронізації. Якщо ви хочете отримати більш високу точність / менший шифр ШІМ, то вам може знадобитися апаратне забезпечення.
Якщо ви хочете спалахнути кучу світлодіодів з різними видимими людськими каденціями (10 х герц) з м'якими вимогами до реагування в реальному часі, тоді програмний цикл може обробляти стільки ШІМ, скільки у вас є шпильки GPIO.
Якщо ви хочете керувати сервомотором з жорсткими вимогами до реагування в режимі реального часу, вам знадобиться використовувати апаратну ШІМ. Вже тоді у вас можуть виникнути проблеми із забезпеченням реагування в режимі реального часу на цикл сервоприводу, який зв'язує вхід кодера з вихідним ШІМ.
Стійкий цикл серво потрібно прочитати кодеров на регулярній швидкості (низький джиттер), виписати переглянуті вихідні значення ШІМ на регулярній швидкості і затримки між ними повинні бути зафіксовані (низький джиттер в цілому). Якщо ви не можете цього зробити, тоді вам доведеться перенастроїти (м'яку настройку) мотора, щоб запобігти його нестабільності під навантаженням. Це важко зробити з багатозадачною операційною системою без низького рівня підтримки.
Якщо вам потрібно запустити більше циклів сервоприводу, ніж у вас є апаратні вихідні ШІМ, то, ймовірно, вам знадобиться перевантажити їх на інший пристрій, щоб забезпечити високу продуктивність у режимі реального часу, передавши Raspberry Pi на м'який керівник у реальному часі .
Один з варіантів - це щось на зразок 16-канального 12-розрядного PWM / серво драйвера Adafruit - драйвер сервоприводу - I²C - PCA9685, який дозволить вам керувати 16 виводами ШІМ за допомогою декількох штифтів GPIO для шини I²C. Для прикладу його використання ознайомтеся з I ²C 16-канальним ШІМ / сервоприводом - робочий пост на форумах Raspberry Pi.
1. Завдяки dm76 за пропозицію, проте верес каже , що RPIO.PWM більше не може працювати для нових моделей пі.
Так, є один апаратний вихід ШІМ на Raspberry Pi, підключений до P1-12 (GPIO18). Крім того, вихідні ШІМ можуть бути додані за допомогою інтерфейсу I²C або SPI ; деякі люди мали успіх у цьому ( повідомлення на форумі ).
Ви можете використовувати бібліотеку WiringPi для управління штифтом ШІМ; Ви можете подивитися на код, щоб уникнути включення всієї бібліотеки.
Raspberry Pi не підходить для жодного серйозного програмного забезпечення PWM, оскільки Linux не є операційною системою в режимі реального часу.
Останні Pis мають два апаратні ШІМ-канали. Крім того, імпульси ШІМ з технічним приводом можуть бути незалежно генеровані на всіх GPIO, підключених до 40-контактного заголовка розширення.
На практиці це означає, що є два високоточні ШІМ-канали, а всі інші GPIO можуть мати ШІМ у стилі Arduino (800 Гц, 0 вимкнено - 255 повністю включено).
Наприклад, сервобластер і моя пігпіо та ін.
Не зовсім в режимі реального часу ОС, але RISC OS для Raspberry Pi - це спільна багатозадачність, тому ви можете легко запустити додаток, що має 100% процесора, щоб ви могли керувати часом набагато краще. Просто не сподівайтесь робити щось інше, крім власного коду.
Я знайшов цю бібліотеку ( pi-blaster ), яка стверджує, що "надзвичайно ефективна: не використовує процесор і дає дуже стійкі імпульси".
Я ще не перевіряв його, але оновлюсь, як тільки я це напевно (можливо, сьогодні)