Come può Arduino Uno supportare fino a 12 servi se ha solo 6 pin PWM digitali?


10

Secondo questo :

La libreria Servo supporta fino a 12 motori sulla maggior parte delle schede Arduino e 48 su Arduino Mega. Su schede diverse da Mega, l'uso della libreria disabilita la funzionalità analogWrite () (PWM) sui pin 9 e 10, indipendentemente dal fatto che sia presente un servo su tali pin. Su Mega, è possibile utilizzare fino a 12 servi senza interferire con la funzionalità PWM; l'uso di motori da 12 a 23 disabiliterà PWM sui pin 11 e 12.

Tuttavia, secondo questo :

Pin I / O digitali 14 (di cui 6 forniscono uscita PWM)

Quindi come può Uno controllare più di 6 servi se ha solo 6 pin I / O digitali in grado di fornire uscita PWM?

Risposte:


8

La libreria Servo non utilizza PWM. Quando si chiama write () , calcola una larghezza di impulso in microsecondi e la memorizza in un array globale. Quindi c'è un singolo timer che attiva regolarmente un interrupt che modifica i segnali di uscita in base all'ampiezza dell'impulso desiderata di ciascun canale.

Di seguito è riportato il codice sorgente: collegamento Github


1
Quindi simula essenzialmente PWM? Qual è il punto dei pin digitali con i canali PWM allora?
user41158

2
In generale, i servoimpulsi sono lunghi circa 1 ms. Pertanto devono essere guidati da frequenze intorno a 1 kHz, che è molto facile da generare tramite software su qualsiasi uscita con un micro che funziona a diversi MHz. Le uscite AVR PWM sono generate da hardware dedicato e possono raggiungere la frequenza della CPU ma il numero di canali è limitato. Suppongo che gli autori del modulo Servo abbiano deciso di utilizzare un singolo timer per gestire tanti canali quanti pin e salvare l'hardware PWM per altri usi.
Grapsus,

1
Il PWM delle uscite Arduino è per uscite a potenza variabile con cicli di lavoro compresi tra 0 e 100%. Il controllo "PWM" in stile RC ha una gamma di cicli di lavoro molto limitata: 1000 us a 50 Hz sono il 5%, 2000 us a 50 Hz sono il 10%. Pensa a RC PWM come a un "treno di impulsi" piuttosto che al tradizionale "PWM".
Jon Watte,

@ user41158 Se hai un tempo di CPU illimitato, puoi usare qualsiasi uscita digitale come PWM e controllarli nel software, non solo PWM, in teoria puoi creare qualsiasi sistema di comunicazione digitale scrivendo un programma e alternando queste uscite, si chiama " bit- sbattere ". Ma in pratica, il tempo della CPU non è illimitato ed è meglio risolvere i compiti hardware dall'hardware. Per il servocontrollo, la frequenza PWM è piuttosto bassa, quindi è pratico eseguire il bit-bang del PWM nel software per creare output aggiuntivi.
比尔 盖子

2

I 6 pin PWM usano l'UART incorporato sull'ATmega328P per produrre il loro output. Ciò rende gli impulsi molto veloci per un'uscita "analogica" di qualità superiore. Poiché i servi comunicano a una velocità abbastanza bassa, possono essere guidati utilizzando gli interrupt software. Gli interrupt software vanno via dal codice che stai eseguendo ed eseguono il codice incluso con la libreria dei servo. Questo codice usa mezzi standard per cambiare lo stato dei pin. Facendolo usando gli interrupt piuttosto che usare l'UART, perdi un po 'di tempo di elaborazione ma ottieni la capacità di guidare più servi.


Puoi spiegare (o linkare) di più? Come viene utilizzato l'UART per PWM?
Martin Thompson,

Penso che sarebbe meglio dire che la libreria PWM può usare i pin I / O UART se lo si desidera. la libreria PWM non utilizzerà l'UART stesso, ma i pin utilizzati da UART possono anche essere usati come I / O digitali standard se non richiesti per l'UART.
Peter Bennett,
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.