Welke frequentie gebruiken Arduinos voor normale PWM wanneer je analogWrite () gebruikt?
En is het anders voor verschillende Arduino-modellen? Ik ben specifiek geïnteresseerd in de Mega 2560, maar wil ook weten of deze consistent is tussen de modellen.
Ik heb passerende verwijzingen gezien naar de Arduino met 500 Hz, wat erg traag lijkt.
Reacties
- Dat hangt ook af van de pin die je gebruikt.
Antwoord
Het PWM-signaal wordt gegenereerd door timers op de AVR-chips. Elke timer kan een PWM-signaal genereren op twee of drie verschillende pinnen. Elke pin kan zijn eigen duty-cycle hebben, maar ze delen de PWM-frequentie. U kunt de frequentie van de PWM wijzigen door de klokbron voor de timers te wijzigen. Standaard gebruiken ze de CPU-klok gedeeld door 64, dwz. ze hebben hun voorschrijver ingesteld op 64 door de Arduino-initialisatiecode. Om de zaken nog meer te verwarren, zijn er twee verschillende PWM-modi: snelle PWM en fasecorrectie PWM. In snelle PWM telt de timer tot 255, loopt dan over en begint opnieuw vanaf 0 (256 verschillende toestanden). In fase-correcte PWM telt de timer tot 255, verandert dan van richting en telt af naar nul, verandert van richting enzovoort (510 verschillende toestanden).
De Arduino Mega heeft 5 timers, timer0 – timer4. Omdat timer0 ook wordt gebruikt voor de millis- en micros-functies, gebruikt het snelle PWM, terwijl de andere timers zijn geconfigureerd voor fase-correcte PWM. Dit resulteert in verschillende frequenties op verschillende pinnen:
-
Pin 4 en 13, aangestuurd door timer0:
16 Mhz / 64/256 = 976,56 Hz -
Andere PWM-pinnen, aangestuurd door timer1-4:
16 Mhz / 64/510 = 490,20 Hz
De berekening is: Clock / Prescaler / PWM-modus aantal toestanden
De situatie is hetzelfde voor alle andere Arduino-boards die ik ken, behalve dat ze minder timers hebben die verbinding maken met verschillende pinnen.
Je kunt de PWM-frequentie door de timer-presaler te wijzigen. Zie deze pagina: http://playground.arduino.cc/Main/TimerPWMCheatsheet
Het is ook mogelijk om de timers te laten tellen voor een andere waarde dan 255. Op de 8 bit timers verliest u een output pin, maar op de 16 bit timers kunt u het Input Capture Register gebruiken om een TOP waarde te definiëren. De functie voor het vastleggen van invoer is een functie die zelden wordt gebruikt in de Arduino-gemeenschap, dus u zult het waarschijnlijk “niet missen.
In de Arduino-bibliotheken kunt u alleen een 8-bits resolutie gebruiken, zelfs op de 16-bits timers. wil je de hogere resolutie, dan moet je je eigen analogWrite schrijven, of een bibliotheek gebruiken die voor dit doel is gemaakt. Op de Arduino Mega zijn timer0 en timer2 8 bit, terwijl de rest 16 bit is.
Door te veranderen de modus van de 16 bit timers om gebruik te maken van de volledige resolutie, in combinatie met het veranderen van de Prescaler en de TOP waarde, kun je een zeer breed scala aan PWM frequenties bereiken.
De maximale frequentie die je kunt bereiken is klok / 4, door de voorschaler in te stellen op 1 en TOP op 3 in snelle PWM-modus – een lagere waarde is niet toegestaan. Dit geeft je een 4 MHz PWM met 2 bit resolutie. Het kan op 0%, 25%, 50% of 75% van de tijd staan. Een hogere TOP-waarde geeft u een hogere resolutie bij een lagere frequentie.
Lees voor een langere uitleg dit artikel of verwijs naar het datasheet .
Het wijzigen van de voorschaler, PWM-modus of TOP-waarde voor timer0 zal knoeien met millis()
en micros()
.
Reacties
- Ik begrijp dus dat de snelste frequentie die je kunt krijgen voor PWM is 16Mhz / 256 (Prescaler = 1), of 62,5Khz?
- En verder dat de PWM-frequentie een even factor moet zijn van 62,5KHz? Iemand op een andere thread wilde de ventilatorsnelheid van een 4-pins pc-ventilator regelen. Blijkbaar wil het een PWM-stuursignaal van 25 KHz. 62,5 / 25 is 2,5, wat geen geheel getal is.
- Ik heb het antwoord bijgewerkt om meer uit te leggen over de mogelijkheden om specifieke frequenties te bereiken,
- Aan de lage frequentiezijde zou je voorschaal een 16-bits timer in fasecorrectiemodus door een 1024-voorschaler om 16e6 / 1024/2 ^ 16/2 = 0,119Hz of 7,1 cycli / minuut te krijgen. Voor lager dan dat, zou men de bits moeten wisselen op basis van zoiets als millis (). Of activeer misschien de teller op de externe ingangspen T ?.