Posso usare GPIO per la modulazione di larghezza di impulso (PWM)?


97

Posso usare GPIO come uscita di modulazione della larghezza di impulso ?

In tal caso, come farei per farlo e quante uscite PWM simultanee e distinte posso avere?


Probabilmente dovrai specificare quale modello stai usando. Sono tutti leggermente diversi.
not2qubit

2
@ user1147688 Questa domanda è stata posta quando c'era un solo modello!
berry120,

Risposte:


76

Come suggerito da Alex Chamberlain , la libreria WiringPi sembra supportare sia l'output PWM hardware su uno o due pin GPIO a seconda del modello, sia il PWM software su uno qualsiasi degli altri pin GPIO. Nel frattempo la libreria RPIO.PWM esegue PWM tramite DMA su qualsiasi pin GPIO. In effetti questa è una casa a metà strada tra hardware e software PWM, fornendo una risoluzione di temporizzazione di 1 µs rispetto a 100 µs con il software PWM [1] di WiringPi .

Quale di questi è adatto per le tue applicazioni dipende da quante uscite PWM ti servono e quali prestazioni desideri da quelle uscite.

Se l'applicazione è tollerante alla risoluzione a basso timing e al jitter elevato, è possibile utilizzare un software o un loop di timing assistito DMA. Se si desidera una PWM di precisione superiore / jitter inferiore, potrebbe essere necessaria assistenza hardware.

Quando potrebbe essere adatto il software PWM?

Se vuoi far lampeggiare un sacco di LED con diverse cadenze visibili umane (10 di Hertz) con requisiti di risposta in tempo reale, il loop del software potrebbe gestire tutti i PWM quanti sono i pin GPIO.

Quando potrebbe essere adatto PWM hardware?

Se si desidera controllare un servomotore con requisiti di risposta in tempo reale difficili, sarà necessario utilizzare PWM hardware. Anche in questo caso potresti avere problemi a garantire una risposta in tempo reale per il servo loop che collega l'ingresso dell'encoder all'uscita PWM.

Un servo loop stabile deve leggere gli encoder a una frequenza regolare (jitter basso), scrivere i valori di uscita PWM revisionati a una velocità regolare e la latenza tra questi dovrebbe essere fissa (jitter basso complessivo). Se non riesci a farlo, dovrai sottotonare (accordare delicatamente) il tuo motore per evitare che diventi instabile sotto carico. Questo è difficile da fare con un sistema operativo multi-tasking senza supporto di basso livello.

Cosa succede se ho bisogno di più uscite PWM hardware?

Se hai bisogno di eseguire più servo loop di quelli che hai output PWM hardware, probabilmente dovrai scaricarli su un altro dispositivo per garantire prestazioni in tempo reale difficili, relegando il tuo Raspberry Pi a un supervisore soft in tempo reale .

Un'opzione, potrebbe essere qualcosa come il driver PWM / servo 12 bit Adafruit a 16 canali - interfaccia I²C - PCA9685 che ti permetterebbe di controllare 16 uscite PWM con pochi pin di GPIO per il bus I²C. Per un esempio del suo utilizzo, dai un'occhiata al post I²C 16 canali PWM / Servo Breakout - Post di lavoro sui forum Raspberry Pi.

1. Grazie a dm76 per il suggerimento, tuttavia heather afferma che RPIO.PWM potrebbe non funzionare più per i nuovi modelli pi.


Posso usare l'approccio software PWM per far funzionare i motori DC?
Gideon,

@gideon - Sì, gli amplificatori di potenza del motore che ho usato hanno preso tutti PWM come input.
Mark Booth,

2
Cordiali saluti, la libreria RPI ( pythonhosted.org/RPIO/pwm_py.html ) sembra avere una risoluzione molto migliore (1us) rispetto a WiringPi con risoluzione 100us
dm76

@MarkBooth - Nessun problema. La libreria è davvero ben scritta e può essere usata come rimpiazzo drop-in per RPi.GPIO che è molto utile se hai avviato un progetto con quest'ultimo e in seguito hai realizzato che erano necessari segnali PWM ...
dm76

RPIO.PWM potrebbe non funzionare più per i nuovi modelli pi, credo.
heather,

39

PWM hardware

Sì, c'è un output PWM hardware su Raspberry Pi, collegato a P1-12 (GPIO18). Inoltre, è possibile aggiungere uscite PWM utilizzando un'interfaccia I²C o SPI ; alcune persone hanno avuto successo con questo ( post sul forum ).

Codice di esempio

È possibile utilizzare la libreria WiringPi per controllare il pin PWM; potresti guardare il codice per evitare di includere l'intera libreria.

Software PWM

Raspberry Pi non è adatto a nessun software PWM serio poiché Linux non è un sistema operativo in tempo reale.


1
Domanda, qual è la definizione o un esempio di software PWM serio? E quali sono i "sistemi operativi in ​​tempo reale" e c'è mai qualche possibilità di ottenerne uno su un Pi
AnthonyBlake,

@AnthonyBlake Beh, probabilmente puoi controllare la luminosità di una luce usando il software PWM, ma sospetto che un motore si fermerà. Non è necessario eseguire software PWM, tuttavia l'hardware è più semplice ed efficace. Google spiegherà meglio i sistemi operativi in ​​tempo reale; garantiscono alcune cose su quanto a lungo e spesso viene eseguito il software.
Alex Chamberlain,

2
@AnthonyBlake Un "sistema operativo in tempo reale" (RTOS) è un sistema operativo che offre una garanzia sul limite massimo di esecuzione. Come dire al programma "Sì, avrai un tempo di esecuzione di 33ms (dai o dai 2ms di tolleranza) per capovolgere quel bit pin GPIO per dare al tuo motore passo-passo un segnale nella finestra temporale esatta quando ne ha bisogno. E puoi fare affidamento su quello!" C'è un RT Linux là fuori. Non so se è stato portato su RPi (ancora).
Orithena,

Scusa Alex, non ho rubato intenzionalmente un'altra parte della tua risposta, ma ho appena notato che siamo arrivati ​​allo stesso post sul forum tramite percorsi diversi.
Mark Booth,

2
I modelli più recenti con 40 pin hanno un secondo PWM hardware collegato a GPIO19 (pin 35).
Kevin

12

I Pis recenti hanno due canali PWM hardware. Inoltre, gli impulsi PWM con temporizzazione hardware possono essere generati in modo indipendente su tutti i GPIO collegati all'intestazione di espansione a 40 pin.

In pratica questo significa che ci sono due canali PWM altamente precisi e tutti gli altri GPIO possono avere PWM in stile Arduino (800 Hz, 0 spento - 255 completamente acceso).

Ad esempio servoblaster e il mio pigpio , ecc.


Bella risposta! Come posso usare quei due PWM HW? Devo controllare 2 servi, so che dici che servoblaster e pigpio sono OK per questo, ma mi chiedo solo il PWM HW, perché non riesco a trovare nulla su di loro ... ci sono alcuni documenti per questo là fuori? Ho un RPi 2 V1.1 per i test.
Kozuch,


2
Il carico pesante della CPU non dovrebbe fare la differenza. Un carico di rete pesante può fare la differenza per gpioServo, specialmente se si esegue il campionamento a 1 MHz anziché i 200 kHz predefiniti. La frequenza è 50 (Hz), l'intervallo dei cicli di lavoro sarà 0 - 1000000 (mappato al valore sottostante reale di 0 - 5000000). 1 ms è 1 ms in 20 ms, quindi un ciclo di funzionamento del 5%, quindi 50000, 1,5 ms-> 7,5% -> 75000, 2 ms-> 10% -> 100000.
joan

1
La pagina 102 di BCM2835 Periferiche ARM mostra le varie modalità che è possibile assegnare al GPIO. Cerca on-line per quale GPIO viene portato alle varie intestazioni di espansione del modello Pi.
joan

1
@ user1147688 PLLD (500MHz) viene utilizzato come clock PWM principale. A causa del modo in cui "funziona", la frequenza del core PWM è di 250 MHz. Per poter accendere e spegnere (abbastanza essenziale per PWM) il massimo è 125 MHz. È possibile raddoppiare le cifre utilizzando PLLC (1000 MHz) ma tale PLL varia con la velocità di clock principale.
Giovanni,

2

Non proprio un sistema operativo in tempo reale, ma RISC OS per Raspberry Pi è un multitasking cooperativo, quindi puoi facilmente eseguire un'applicazione con CPU al 100% in modo da poter gestire i tuoi tempi molto meglio. Non aspettarti di fare altro che il tuo codice.


Ho letto da qualche parte che esiste anche un limite hardware per quanto riguarda la frequenza di commutazione di un pin di uscita. Penso che fosse di circa 20 MHz. Quindi non aspettarti di essere in grado di estrarre PWM da 300 MHz o qualcosa del genere, anche con un utilizzo della CPU al 100%.
Ponkadoodle,

@Wallacoloo: quali applicazioni richiedono PWM a 300 MHz?
Peter Mortensen,

2
@PeterMortensen: Beh, non so come trasmettitori radio e simili generino i loro segnali, ma alcuni potrebbero farlo con PWM. PiFM lo fa a 100 MHz. Ciò sembra contraddire il mio commento, quindi mi chiedo se forse il pin può ancora essere comandato a quella frequenza, ma è solo che la capacità del pin attenua tali segnali, in modo che un'onda quadra a 100 MHz potrebbe effettivamente oscillare ad es. (1,0 V , 2,3 V) anziché l'intera gamma (0 V, 3,3 V).
Ponkadoodle,

2

Ho trovato questa libreria ( pi-blaster ) che afferma di essere "estremamente efficiente: non usa la CPU e dà impulsi molto stabili".

Non l'ho ancora testato, ma aggiornerò non appena lo faccio (probabilmente oggi)


Ci ho provato ma finora non ho avuto fortuna. Per quanto ne so, non cambia l'hardware?
MrMowgli,

1
Voglio solo sbatterlo. Pi-blaster ha funzionato per me, dove queste altre risposte no.
Seph Reed,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.