Qual è la frequenza di uscita PWM su Arduino

Quale frequenza usa Arduino per PWM normale quando usi analogWrite ()?

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

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

Commenti

  • Dipende anche dal pin che stai utilizzando.

Risposta

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. Per impostazione predefinita usano il clock della CPU diviso per 64, ad es. hanno il loro prescaler impostato su 64 dal codice di inizializzazione di Arduino. Per confondere di più le cose ci sono due diverse modalità PWM: PWM veloce e PWM a correzione di fase. In PWM veloce il timer conta fino a 255, quindi va in overflow e ricomincia da 0 (256 stati diversi). In PWM corretto in fase il timer conta fino a 255, quindi cambia direzione e conta 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 micro, utilizza PWM veloce, mentre gli altri timer sono configurati per PWM corretto di fase. Ciò si traduce in frequenze diverse su pin diversi:

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

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

Il calcolo è: Clock / Numero di stati modalità 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 pin diversi.

Puoi cambiare il Frequenza PWM modificando il timer prescaler. Vedi questa pagina: http://playground.arduino.cc/Main/TimerPWMCheatsheet

È anche possibile fare in modo che i timer contino fino a valore diverso da 255. Sui temporizzatori a 8 bit perderai un pin di uscita, ma sui temporizzatori a 16 bit puoi utilizzare lInput Capture Register per definire un valore TOP. La funzionalità di acquisizione dellinput è una caratteristica usata raramente nella comunità Arduino, quindi probabilmente non te la perderai.

Le librerie Arduino ti consentono di utilizzare solo una risoluzione a 8 bit, anche sui timer a 16 bit. vuoi la risoluzione più alta, dovrai scrivere la tua analogWrite, oppure utilizzare una libreria fatta apposta. Su Arduino Mega timer0 e timer2 sono a 8 bit, mentre il resto sono a 16 bit.

Cambiando 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 si può ottenere è clock / 4, impostando il prescaler su 1 e TOP su 3 in modalità PWM veloce – un valore inferiore non è consentito. Questo ti darà un PWM a 4 MHz con risoluzione a 2 bit. Può essere impostato 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 leggi questo articolo o fai riferimento a datasheet .

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

Commenti

  • Mi risulta, quindi, che la frequenza più veloce che potresti ottenere per PWM è 16Mhz / 256 (prescaler = 1) o 62,5Khz?
  • E inoltre che la frequenza PWM deve essere un fattore pari di 62,5KHz? 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.
  • Ho aggiornato la risposta per approfondire maggiormente le possibilità di ottenere frequenze specifiche,
  • Allestremità delle frequenze basse, potresti prescalare un timer a 16 bit in modalità a correzione di fase da un prescaler 1024 per ottenere 16e6 / 1024/2 ^ 16/2 = 0,119 Hz o 7,1 cicli / minuto. Per un valore inferiore a quello, è necessario alternare i bit in base a qualcosa come millis (). O forse attivare il contatore sul pin di ingresso esterno T ?.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *