Qual è la frequenza di uscita PWM su Arduino


22

Che frequenza usano Arduinos per PWM normale quando usi analogWrite ()?

Ed è diverso per i diversi modelli di Arduino? Sono interessato in particolare al Mega 2560, ma voglio anche sapere se è coerente tra i modelli.

Ho visto riferimenti di passaggio ad Arduino usando 500 Hz, che sembra molto lento.


Dipende anche dal pin che stai usando.
Gerben,

Risposte:


31

Il segnale PWM è generato dai timer sui chip AVR. Ogni timer può generare un segnale PWM su due o tre pin diversi. Ogni pin può avere il proprio ciclo di lavoro, ma condividono la frequenza PWM. È possibile modificare la frequenza del PWM modificando la sorgente di clock per i timer. Di default usano il clock della CPU diviso per 64, cioè. hanno il loro prescaler impostato su 64 dal codice di inizializzazione di Arduino. Per confondere le cose di più ci sono due diverse modalità PWM: PWM veloce e PWM corretto in fase. Nel PWM veloce il timer conta fino a 255, quindi trabocca e ricomincia da 0 (256 stati diversi). Nella PWM corretta in fase il timer conta fino a 255, quindi cambia direzione e conta verso il basso fino a zero, cambia direzione e così via (510 stati diversi).

Arduino Mega ha 5 timer, timer0 - timer4. Poiché timer0 viene utilizzato anche per le funzioni millis e micros, utilizza PWM veloce, mentre gli altri timer sono configurati per PWM a fase corretta. Ciò si traduce in frequenze diverse su pin diversi:

  • Pin 4 e 13, controllati da timer0:
    16 Mhz / 64/256 = 976,56 Hz

  • Altri pin PWM, controllati da timer 1-4:
    16 Mhz / 64/510 = 490,20 Hz

Il calcolo è: numero di stati della modalità Clock / Prescaler / PWM

La situazione è la stessa per tutte le altre schede Arduino che conosco, tranne per il fatto che hanno meno timer che si collegano a diversi pin.

È possibile modificare la frequenza PWM modificando il prescaler del timer. Vedi questa pagina: http://playground.arduino.cc/Main/TimerPWMCheatsheet

È anche possibile fare in modo che i timer contino su un valore diverso da 255. Sui timer a 8 bit si perderà un pin di uscita, ma sui timer a 16 bit è possibile utilizzare Input Capture Register per definire un valore TOP. La funzionalità di acquisizione dell'input è una funzione raramente utilizzata nella comunità di Arduino, quindi probabilmente non ti perderai.

Le librerie di Arduino ti consentono di utilizzare solo la risoluzione a 8 bit, anche con i timer a 16 bit. Se si desidera una risoluzione più elevata, è necessario scrivere il proprio analogWrite o utilizzare una libreria creata allo scopo. Su Arduino Mega timer0 e timer2 sono 8 bit, mentre il resto è 16 bit.

Modificando la modalità dei timer a 16 bit per sfruttare la piena risoluzione, in combinazione con la modifica del prescaler e del valore TOP, è possibile ottenere una gamma molto ampia di frequenze PWM.

La frequenza massima che puoi ottenere è clock / 4, impostando il prescaler su 1 e TOP su 3 in modalità PWM veloce - non è consentito un valore inferiore. Questo ti darà un PWM a 4 MHz con risoluzione a 2 bit. Può essere sullo 0%, 25%, 50% o 75% delle volte. Un valore TOP più alto ti darà una risoluzione più alta a una frequenza più bassa.

Per una spiegazione più lunga leggere questo articolo o consultare la scheda tecnica .

La modifica del prescaler, della modalità PWM o del valore TOP per timer0 si guasterà con millis()e micros().


1
Ho capito, quindi, che la frequenza più veloce che potresti ottenere per PWM è 16Mhz / 256 (prescaler = 1) o 62,5Khz?
Duncan C,

E inoltre che la frequenza PWM deve essere un fattore pari a 62,5 KHz? Qualcuno su un altro thread voleva controllare la velocità della ventola di una ventola per PC a 4 pin. Apparentemente vuole un segnale di controllo PWM di 25KHz. 62.5 / 25 è 2.5, che non è un valore intero.
Duncan C,

Ho aggiornato la risposta per approfondire le possibilità di raggiungere frequenze specifiche,
user2973

Sull'estremità a bassa frequenza, è possibile pre-preparare un timer a 16 bit in modalità correzione di fase da un prescaler 1024 per ottenere 16e6 / 1024/2 ^ 16/2 = 0,119Hz o 7,1 cicli / minuto. Per un valore inferiore a quello, si dovrebbe attivare / disattivare i bit in base a qualcosa come millis (). O forse attivare il contatore sul pin di ingresso esterno T ?.
Dave X,
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.