Чи можу я використовувати GPIO для модуляції ширини імпульсу (ШІМ)?


97

Чи можу я використовувати GPIO як вихід модуляції ширини імпульсу ?

Якщо так, то як би я пішов робити це і скільки одночасних, чітких ШІМ-результатів я можу мати?


Можливо, вам потрібно вказати, яку модель ви використовуєте. Всі вони трохи різні.
not2qubit

2
@ user1147688 Це питання було задано назад, коли була лише одна модель!
berry120

Відповіді:


76

Як запропонував Алекс Чемберлен , бібліотека 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 більше не може працювати для нових моделей пі.


Чи можу я використовувати програмний підхід ШІМ для роботи двигунів постійного струму?
gideon

@gideon - Так, підсилювачі потужності двигуна, якими я користувався, сприймали ШІМ як їх вхід.
Марк Бут

2
FYI, бібліотека RPI ( pythonhosted.org/RPIO/pwm_py.html ), схоже, має набагато кращу роздільну здатність (1ус) порівняно з WiringPi з роздільною здатністю 100us
dm76

@MarkBooth - Немає проблем. Бібліотека справді добре написана і може бути використана в якості заміни для RPi.GPIO, що дуже зручно, якщо ви розпочали проект з останнім і пізніше зрозуміли, що ШІМ-сигнали були потрібні ...
dm76

RPIO.PWM може більше не працювати для нових пі-моделей, я думаю.
верес

39

Апаратна ШІМ

Так, є один апаратний вихід ШІМ на Raspberry Pi, підключений до P1-12 (GPIO18). Крім того, вихідні ШІМ можуть бути додані за допомогою інтерфейсу I²C або SPI ; деякі люди мали успіх у цьому ( повідомлення на форумі ).

Приклад коду

Ви можете використовувати бібліотеку WiringPi для управління штифтом ШІМ; Ви можете подивитися на код, щоб уникнути включення всієї бібліотеки.

Програмне забезпечення ШІМ

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


1
Питання, що таке визначення чи приклад серйозного програмного забезпечення PWM? І що таке "операційні системи в режимі реального часу" і чи є коли-небудь шанс потрапити на Pi
AnthonyBlake

@AnthonyBlake Ну, напевно, ви можете керувати яскравістю світла за допомогою програмного PWM, але я підозрюю, що мотор затримається. Немає потреби робити програмне забезпечення ШІМ, проте апаратне забезпечення простіше та ефективніше. Операційні системи в режимі реального часу будуть краще пояснені Google; вони гарантують певні речі щодо того, як довго і часто працює програмне забезпечення.
Алекс Чемберлен

2
@AnthonyBlake "ОС у режимі реального часу" (RTOS) - це операційна система, яка дає гарантію на верхній часовий межа виконання. Як скажіть програмі "Так, у вас буде деякий час виконання за 33 мс (надайте або візьміть 2 секунди допуску), щоб перевернути цей штифт GPIO, щоб подати сигналу вашого крокового двигуна в точно встановленому часовому вікні, коли йому це потрібно. І ви можете розраховувати на тому!" Там є RT Linux. Не знаю, чи перенесено його в RPi (поки що).
orithena

Вибачте Алекс, я навмисно не вкрав іншої частини вашої відповіді, але я щойно помітив, що ми прийшли до одного і того ж допису на форумі різними маршрутами.
Марк Бут

2
Новіші моделі з 40 штифтами мають другий апаратний ШІМ, підключений до GPIO19 (контакт 35).
Кевін

12

Останні Pis мають два апаратні ШІМ-канали. Крім того, імпульси ШІМ з технічним приводом можуть бути незалежно генеровані на всіх GPIO, підключених до 40-контактного заголовка розширення.

На практиці це означає, що є два високоточні ШІМ-канали, а всі інші GPIO можуть мати ШІМ у стилі Arduino (800 Гц, 0 вимкнено - 255 повністю включено).

Наприклад, сервобластер і моя пігпіо та ін.


Гарна відповідь! Як я можу скористатися цими двома ШВМ? Мені потрібно керувати 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 периферія показує різні режими, які можна призначити GPIO. Дивіться в режимі он-лайн, для якого GPIO виведені в різні заголовки розширення моделі Pi.
joan

1
@ user1147688 PLLD (500 МГц) використовується як основний тактовий ШІМ. Через те, як він працює, частота ШІМ є 250 МГц. Щоб мати можливість вмикати та вимикати (що дуже важливо для ШІМ), максимум - 125 МГц. Ви можете подвоїти цифри за допомогою PLLC (1000 МГц), але PLL змінюється залежно від основної тактової частоти.
joan

2

Не зовсім в режимі реального часу ОС, але RISC OS для 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 ), яка стверджує, що "надзвичайно ефективна: не використовує процесор і дає дуже стійкі імпульси".

Я ще не перевіряв його, але оновлюсь, як тільки я це напевно (можливо, сьогодні)


Я намагався це зробити, але поки що не пощастило. Наскільки я можу сказати, це насправді не перемикає обладнання?
MrMowgli

1
Просто хочу оббити це. Пі-бластер працював на мене там, де цих інших відповідей не було.
Seph Reed
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.