Hva er frekvensen av PWM-utgang på Arduino

Hvilken frekvens bruker Arduinos for normal PWM når du bruker analogWrite ()?

Og er det annerledes for forskjellige Arduino-modeller? Jeg er spesielt interessert i Mega 2560, men vil også vite om den samsvarer mellom modellene.

Jeg har sett forbigående referanser til Arduino ved hjelp av 500 Hz, som virker veldig treg.

Kommentarer

  • Det avhenger også av nålen du bruker.

Svar

PWM-signalet genereres av tidtakere på AVR-brikkene. Hver timer kan generere et PWM-signal på to eller tre forskjellige pinner. Hver pinne kan ha sin egen driftssyklus, men de deler PWM-frekvensen. Du kan endre frekvensen på PWM ved å endre tidskilden for tidtakerne. Som standard bruker de CPU-klokken delt på 64, dvs. de har prescaler satt til 64 av Arduino initialiseringskode. For å forvirre ting mer er det to forskjellige PWM-moduser: rask PWM og fasekorrigert PWM. I rask PWM teller tidtakeren til 255, og flyter deretter over og starter på nytt fra 0 (256 forskjellige tilstander). I fasekorrigert PWM teller tidtakeren til 255, endrer deretter retning og teller nedover til null, endrer retning og så videre (510 forskjellige tilstander).

Arduino Mega har 5 tidtakere, timer0 – timer4. Fordi timer0 også brukes til millis og mikrofunksjonene, bruker den rask PWM, mens de andre tidtakerne er konfigurert for fasekorrekt PWM. Dette resulterer i forskjellige frekvenser på forskjellige pinner:

  • Pin 4 og 13, styrt av timer0:
    16 Mhz / 64/256 = 976,56 Hz

  • Andre PWM-pinner, styrt av timer1-4:
    16 Mhz / 64/510 = 490,20 Hz

Beregningen er: Clock / Prescaler / PWM-modus antall tilstander

Situasjonen er den samme for alle andre Arduino-kort jeg kjenner til, bortsett fra at de har færre tidtakere som kobles til forskjellige pinner.

Du kan endre PWM-frekvens ved å endre tidsinnstillingen. Se denne siden: http://playground.arduino.cc/Main/TimerPWMCheatsheet

Det er også mulig å få tidtakerne til å telle til en en annen verdi enn 255. På 8-bit-tidtakerne mister du en utgangspinne, men på 16-bit-tidtakerne kan du bruke Input Capture Register til å definere en TOP-verdi. Inngangsfangstfunksjonaliteten er en funksjon som sjelden brukes i Arduino-samfunnet, så du vil sannsynligvis ikke savne den.

Arduino-bibliotekene lar deg bare bruke 8-biters oppløsning, selv på 16-biters tidtakere. vil du ha høyere oppløsning, må du skrive din egen analoge skriving, eller bruke et bibliotek laget for formålet. På Arduino Mega timer0 og timer2 er 8 bit, mens resten er 16 bit.

Ved å endre modusen til 16-biters tidtakere for å gjøre bruk av full oppløsning, i kombinasjon med å endre prescaler og TOP-verdien, kan du oppnå et veldig bredt spekter av PWM-frekvenser.

Maksimal frekvens du kan oppnå er klokke / 4, ved å sette prescaler til 1 og TOP til 3 i rask PWM-modus – en lavere verdi er ikke tillatt. Dette vil gi deg en 4 MHz PWM med 2 bit oppløsning. Det kan være 0%, 25%, 50% eller 75% av tiden. En høyere TOP-verdi vil gi deg en høyere oppløsning med lavere frekvens.

For en lengre forklaring, les denne artikkelen eller se datablad .

Endring av prescaler, PWM-modus eller TOP-verdi for timer0 vil rote med millis() og micros().

Kommentarer

  • Jeg samler da at den raskeste frekvensen du kan få for PWM er 16Mhz / 256 (prescaler = 1), eller 62,5Khz?
  • Og videre at PWM-frekvensen må være en jevn faktor på 62,5KHz? Noen på en annen tråd ønsket å kontrollere viftehastigheten til en 4-pinners PC-vifte. Tilsynelatende vil den ha et PWM-styresignal på 25 KHz. 62.5 / 25 er 2.5, som ikke er en heltallverdi.
  • Jeg oppdaterte svaret for å utdype mer om mulighetene for å oppnå spesifikke frekvenser,
  • På den lave frekvensenden kan du forhåndsskalere en 16-biters timer i fasekorrigert modus med en 1024 prescaler for å få 16e6 / 1024/2 ^ 16/2 = 0.119Hz, eller 7.1 sykluser / minutt. For lavere enn det, ville man trenge å bytte biter basert på noe som millis (). Eller kanskje utløse telleren på den eksterne inngangspinnen T?.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *