Perché alcuni pin hanno una frequenza PWM diversa?


Risposte:


23

Quelle non sono le uniche frequenze disponibili per i segnali PWM. Tuttavia, sono le frequenze determinate dal prescaler applicato (che è possibile modificare facilmente come descritto di seguito).

Ognuna delle 3 coppie di pin PWM è legata a un timer, ognuno dei quali ha una propria frequenza di base, come segue:

  • I pin 5 e 6 sono accoppiati su timer0, con frequenza base di 62500Hz
  • I pin 9 e 10 sono accoppiati su timer1, con frequenza base di 31250Hz
  • I pin 3 e 11 sono accoppiati su timer2, con frequenza base di 31250Hz

Quindi ogni set di pin ha un numero di valori prescaler che possono essere scelti, che divideranno la frequenza di base di quella coppia di pin. I valori prescaler disponibili sono:

  • I pin 5 e 6 hanno valori prescaler di 1, 8, 64, 256 e 1024
  • I pin 9 e 10 hanno valori prescaler di 1, 8, 64, 256 e 1024
  • I pin 3 e 11 hanno valori prescaler di 1, 8, 32, 64, 128, 256 e 1024

Le diverse combinazioni producono frequenze diverse in un dato pin PWM. Si noti che il timer 2 (legato ai pin 3 e 11) ha più valori prescaler disponibili, risultando in più frequenze disponibili.

Ora, perché il timer 2 è diverso, questa è una domanda separata.

Modifica: ecco un elenco di possibili frequenze PWM per pin (da questo articolo ):

Per i pin 6 e 5 (OC0A e OC0B):

  • Se TCCR0B = xxxxx001, la frequenza è 64kHz
  • Se TCCR0B = xxxxx010, la frequenza è 8 kHz
  • Se TCCR0B = xxxxx011, la frequenza è 1kHz (questa è l'impostazione predefinita dal bootloader Diecimila)
  • Se TCCR0B = xxxxx100, la frequenza è 250Hz
  • Se TCCR0B = xxxxx101, la frequenza è 62,5 Hz

Per pin 9, 10, 11 e 3 (OC1A, OC1B, OC2A, OC2B):

  • Se TCCRnB = xxxxx001, la frequenza è 32kHz
  • Se TCCRnB = xxxxx010, la frequenza è 4 kHz
  • Se TCCRnB = xxxxx011, la frequenza è 500Hz (questa è l'impostazione predefinita dal bootloader Diecimila)
  • Se TCCRnB = xxxxx100, la frequenza è 125Hz
  • Se TCCRnB = xxxxx101, la frequenza è 31,25 Hz

TCCRnBè dove si impostano i bit prescaler per il timer n, sostituendoli ncon 0, 1 o 2, a seconda del timer che si desidera impostare. Se non sei ancora sicuro delle operazioni bit per bit, leggi questo tutorial di matematica bit .

Le mie fonti:

Si noti che sembra esserci divergenza in quelle fonti sul fatto che i pin 9 e 10 abbiano lo stesso comportamento di 5 e 6 o 3 e 11, ma si ottiene comunque l'idea. Sto leggendo il datashet per provare a capire quale sia corretta o se questa è una differenza tra le schede.


1
A quale ATmega si riferisce questa risposta? Non ho controllato, ma scommetto che differisce leggermente per controller.
jippie,

@jippie Un buon punto! Le fonti si riferiscono ad ATmega168 e 328.
Ricardo,

@jippie Giusto per chiarire, nella mia risposta, i numeri dei pin si riferiscono al modo in cui sono assegnati alla scheda Uno (il pin 1 significa Digital Pin 1 o D1, ad esempio), non l'IC (il pin 1 ATmega328 viene ripristinato).
Ricardo,

1
Credo che anche questi dettagli cambino con le schede, Uno, Duemilanove, Mega, ...
jippie

@jippie Sicuramente sì.
Ricardo,

8

Non sono a conoscenza delle considerazioni di progettazione, ma se si controlla il foglio dati per il microcontrollore sul proprio Arduino, si noterà che i pin PWM sono raggruppati e per gruppo collegati a un timer. La velocità con cui questo timer viene aumentato varia in base al prescaler configurato. Se si cambia il prescaler per un determinato timer, si modifica la frequenza PWM per i pin PWM correlati. Credo che alcuni timer raddoppino per altri scopi come la millis();funzione. Se si cambia il prescaler per quel timer, i valori restituiti da millis()saranno disattivati ​​dallo stesso fattore.

È possibile calcolare l'impostazione per il prescaler come segue:

$$ \ text {prescaler} = \ dfrac {f_ {CPU}} {PWMresolution × f_ {PWM}} = \ dfrac {16 \ text {MHz}} {256 × 490} \ circa 128 $$

prescaler = f [CPU] / (PWMresolution × f [PWM]) = 16000000 / (256 × 490) = circa 128.

Controlla la scheda tecnica e scoprirai che 128 è davvero uno dei valori prescaler che puoi selezionare.


2
Ragazzo, ci manca MathJax o cosa? Spero di averlo abilitato dopo la beta.
Ricardo,

1
@Ricardo Ho un pulsante MathJax nel mio browser; o) meta.arduino.stackexchange.com/questions/13/…
jippie
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.