Fråga:
Varför har vissa stift en annan PWM-frekvens?
Peter Bloomfield
2014-02-14 21:08:10 UTC
view on stackexchange narkive permalink

Enligt Arduino-referensen för analogWrite () är PWM-frekvensen på de flesta stift ~ 490 Hz. Det är dock ~ 980 Hz för stift 5 och 6 på Uno och för stift 3 och 11 på Leonardo.

Varför är dessa olika? Är det en avsiktlig designfunktion, eller dikteras den på något sätt av hårdvaran?

Två svar:
#1
+24
Ricardo
2014-02-14 22:00:19 UTC
view on stackexchange narkive permalink

Det är inte de enda frekvenser som finns tillgängliga för PWM-signalerna. Det är emellertid de frekvenser som bestäms av den applicerade förskalningsapparaten (som du enkelt kan ändra enligt detaljer nedan).

Var och en av de tre par PWM-stiften är bunden till en timer, som alla har sina egna basfrekvens enligt följande:

  • Pins 5 och 6 är ihopkopplade på timer0, med basfrekvens på 62500Hz
  • Pins 9 och 10 är parade på timer1, med basfrekvens på 31250Hz
  • Pins 3 och 11 är ihopkopplade på timer2, med basfrekvens på 31250Hz

Sedan har varje uppsättning stift ett antal förkalkningsvärden som kan väljas, att kommer att dela basfrekvensen för det stiftparet. De tillgängliga förskalningsvärdena är:

  • Stift 5 och 6 har förskalningsvärden 1, 8, 64, 256 och 1024
  • Stift 9 och 10 har förskalningsvärden 1 , 8, 64, 256 och 1024
  • Pins 3 och 11 har förkalkningsvärden 1, 8, 32, 64, 128, 256 och 1024

olika kombinationer ger olika frekvenser i en given PWM-stift. Lägg märke till att timer 2 (knuten till stift 3 och 11) har fler förskalningsvärden tillgängliga, vilket resulterar i fler tillgängliga frekvenser.

Varför timer 2 nu är annorlunda, det är en separat fråga.

Redigera: Här är en lista över möjliga PWM-frekvenser per stift (från den här artikeln):

För stift 6 och 5 (OC0A och OC0B):

  • Om TCCR0B = xxxxx001 är frekvensen 64 kHz
  • Om TCCR0B = xxxxx010 är frekvensen 8 kHz
  • Om TCCR0B = xxxxx011 är frekvensen 1 kHz (detta är standard från Diecimila bootloader)
  • Om TCCR0B = xxxxx100 är frekvensen 250Hz
  • Om TCCR0B = xxxxx101 är frekvensen 62,5 Hz

För stift 9 , 10, 11 och 3 (OC1A, OC1B, OC2A, OC2B):

  • Om TCCRnB = xxxxx001 är frekvensen 32 kHz
  • Om TCCRnB = xxxxx010 är frekvensen 4 kHz
  • Om TCCRnB = xxxxx011 är frekvensen 500Hz (detta är standard från Diecimila bootloader)
  • Om TCCRnB = xxxxx100 är frekvensen 125Hz
  • Om TCCRnB = xxxxx101 är frekvensen 31,25 Hz

TCCRnB är där du ställer in förkalkningsbitar för timer n och ersätter n med 0, 1 eller 2, beroende på timern du vill ställa in. Om du fortfarande är osäker på bitvisa operationer, läs den här bitmatematiska självstudien.

Mina källor:

Observera att det verkar finnas avvikelser i dessa källor om huruvida stiften 9 och 10 har samma beteende som 5 och 6 eller 3 och 11, men du får tanken ändå. Jag läser datapaketet för att försöka ta reda på vilken som är korrekt, eller om det är en skillnad mellan kort.

Vilket ATmega hänvisar detta svar till? Jag kollade inte, men jag slår vad om att det skiljer sig något per styrenhet.
@jippie Bra poäng! Källorna hänvisar till ATmega168 och 328.
@jippie Bara för att klargöra, i mitt svar, hänvisar stiftnumren till hur de är tilldelade på Uno-kortet (stift 1 betyder till exempel Digital stift 1 eller D1), inte IC (ATmega328 stift 1 återställs).
Jag tror att dessa detaljer ändras också med brädor, Uno, Duemilanove, Mega, ...
@jippie Definitivt, ja.
Detta svar är helt enkelt fel. Timarna använder samma förinställningsinställning. Den enda skillnaden är att timer 1 och 2 är inställda på faskorrekt PWM, medan timer 0 är inställd på snabb PWM, vilket fördubblar frekvensen.
#2
+8
jippie
2014-02-14 21:57:57 UTC
view on stackexchange narkive permalink

Jag känner inte till designhänsynen, men om du kontrollerar databladet för mikrokontrollern på din Arduino kommer du att märka att PWM-stift är grupperade och per grupp ansluten till en timer. Hastigheten med vilken denna timer ökar varierar beroende på den konfigurerade förkalkeraren. Om du byter prescaler för en viss timer ändrar du PWM-frekvensen för de relaterade PWM-stiften. Jag tror att vissa timers fördubblas för andra ändamål som millis (); -funktionen. Om du byter prescaler för den timern kommer värden som returneras med millis () att vara av med samma faktor.

Du kan beräkna inställningen för prescaler enligt följande:

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

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

Kontrollera datablad och du kommer att upptäcka att 128 verkligen är ett av de förskalningsvärden du kan välja.

Pojke, saknar vi MathJax eller vad? Jag hoppas att vi får det aktiverat efter betaversionen.
@Ricardo Jag har en MathJax-knapp i min webbläsare; o) http://meta.arduino.stackexchange.com/questions/13/is-there-an-easy-way-to-enter-formulas-in-questions/51# 51


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...