Vraag:
Waarom hebben sommige pinnen een andere PWM-frequentie?
Peter Bloomfield
2014-02-14 21:08:10 UTC
view on stackexchange narkive permalink

Volgens de Arduino-referentie voor analogWrite () is de PWM-frequentie op de meeste pinnen ~ 490 Hz. Het is echter ~ 980 Hz voor pinnen 5 en 6 op de Uno, en voor pinnen 3 en 11 op de Leonardo.

Waarom zijn deze verschillend? Is het een opzettelijke ontwerpfunctie of wordt het op de een of andere manier bepaald door de hardware?

Twee antwoorden:
#1
+24
Ricardo
2014-02-14 22:00:19 UTC
view on stackexchange narkive permalink

Dat zijn niet de enige beschikbare frequenties voor de PWM-signalen. Het zijn echter de frequenties zoals bepaald door de toegepaste voorschrijver (die u gemakkelijk kunt wijzigen zoals hieronder beschreven).

Elk van de 3 paar PWM-pinnen is gekoppeld aan één timer, die elk zijn eigen timer heeft. basisfrequentie, als volgt:

  • Pinnen 5 en 6 zijn gekoppeld op timer0, met een basisfrequentie van 62500Hz
  • Pinnen 9 en 10 zijn gekoppeld op timer1, met basisfrequentie van 31250Hz
  • Pinnen 3 en 11 zijn gekoppeld op timer2, met een basisfrequentie van 31250Hz

Vervolgens heeft elke set pinnen een aantal presalerwaarden die kunnen worden gekozen, dat verdeelt de basisfrequentie van dat paar pinnen. De beschikbare voorschalerwaarden zijn:

  • De pinnen 5 en 6 hebben de voorschalerwaarden van 1, 8, 64, 256 en 1024
  • De pinnen 9 en 10 hebben de voorschalerwaarden van 1 , 8, 64, 256 en 1024
  • Pinnen 3 en 11 hebben presalerwaarden van 1, 8, 32, 64, 128, 256 en 1024

De verschillende combinaties leveren verschillende frequenties op in een bepaalde PWM-pin. Merk op dat timer 2 (gekoppeld aan pennen 3 en 11) meer presalerwaarden beschikbaar heeft, wat resulteert in meer beschikbare frequenties.

Nu, waarom timer 2 anders is, dat is een aparte vraag.

Bewerken: hier is een lijst met mogelijke PWM-frequenties per pin (uit dit artikel):

Voor pin 6 en 5 (OC0A en OC0B):

  • Als TCCR0B = xxxxx001, frequentie is 64 kHz
  • Als TCCR0B = xxxxx010, frequentie is 8 kHz
  • Als TCCR0B = xxxxx011, frequentie is 1 kHz (dit is de standaard van de Diecimila-bootloader)
  • Als TCCR0B = xxxxx100, frequentie is 250 Hz
  • Als TCCR0B = xxxxx101, frequentie is 62,5 Hz

Voor pinnen 9 , 10, 11 en 3 (OC1A, OC1B, OC2A, OC2B):

  • Als TCCRnB = xxxxx001, frequentie is 32 kHz
  • Als TCCRnB = xxxxx010, frequentie is 4 kHz
  • Als TCCRnB = xxxxx011, is de frequentie 500Hz (dit is de standaardinstelling van de Diecimila-bootloader)
  • Als TCCRnB = xxxxx100, frequentie is 125 Hz
  • Als TCCRnB = xxxxx101, frequentie is 31,25 Hz

TCCRnB is waar je de presaler-bits instelt voor timer n , waarbij je n vervangt door 0, 1 of 2, afhankelijk van de timer die je wilt instellen. Als je nog steeds niet zeker bent van bitgewijze bewerkingen, lees dan deze tutorial over bit-wiskunde.

Mijn bronnen:

Merk op dat er divergentie lijkt te zijn in die bronnen over of pinnen 9 en 10 hetzelfde gedrag hebben als 5 en 6 of 3 en 11, maar je snapt het toch wel. Ik lees de datashet om erachter te komen welke correct is, of dat dit een verschil is tussen boards.

Naar welke ATmega verwijst dit antwoord? Ik heb niet gecheckt, maar ik wed dat het iets verschilt per controller.
@jippie Goed punt! De bronnen verwijzen naar ATmega168 en 328.
@jippie Ter verduidelijking, in mijn antwoord verwijzen de pincodes naar hoe ze toewijzen op het Uno-bord (pin 1 betekent digitale pin 1 of D1 bijvoorbeeld), niet het IC (ATmega328 pin 1 wordt gereset).
Ik geloof dat die details ook veranderen met borden, Uno, Duemilanove, Mega, ...
@jippie Absoluut, ja.
Dit antwoord is simpelweg fout. De timers gebruiken dezelfde instelling van de voorschrijver. Het enige verschil is dat timer 1 en 2 zijn ingesteld op fasecorrectie PWM, terwijl timer 0 is ingesteld op snelle PWM, waardoor de frequentie wordt verdubbeld.
#2
+8
jippie
2014-02-14 21:57:57 UTC
view on stackexchange narkive permalink

Ik ben me niet bewust van de overwegingen bij het ontwerp, maar als je de datasheet voor de microcontroller op je Arduino bekijkt, zul je zien dat PWM-pinnen gegroepeerd zijn en per groep verbonden zijn met een timer. De snelheid waarmee deze timer wordt verhoogd, is afhankelijk van de geconfigureerde voorschrijver. Als u de voorschrijver voor een bepaalde timer wijzigt, wijzigt u de PWM-frequentie voor de gerelateerde PWM-pinnen. Ik geloof dat sommige timers verdubbelen voor andere doeleinden, zoals de functie millis (); . Als u de voorschrijver voor die timer wijzigt, zullen waarden die worden geretourneerd door millis () met dezelfde factor afwijken.

U kunt de instelling voor de voorschaler als volgt berekenen:

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

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

Controleer de datasheet en u zult zien dat 128 inderdaad een van de presalerwaarden is die u kunt selecteren.

Jongen, missen we MathJax of wat? Ik hoop dat we het na de bèta kunnen inschakelen.
@Ricardo Ik heb een MathJax-knop in mijn browser; o) http://meta.arduino.stackexchange.com/questions/13/is-there-an-easy-way-to-enter-formulas-in-questions/51# 51


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...