Hvilken frekvens bruger Arduinos til normal PWM, når du bruger analogWrite ()?
Og er det anderledes for forskellige Arduino-modeller? Jeg er specielt interesseret i Mega 2560, men vil også gerne vide, om den er konsistent mellem modeller.
Jeg har set en forbipasserende henvisning til Arduino ved hjælp af 500 Hz, hvilket virker virkelig langsomt.
Kommentarer
- Det afhænger også af nålen, du bruger.
Svar
PWM-signalet genereres af timere på AVR-chipsene. Hver timer kan generere et PWM-signal på to eller tre forskellige ben. Hver pin kan have sin egen driftscyklus, men de deler PWM-frekvensen. Du kan ændre frekvensen af PWM ved at ændre urkilden til timerne. Som standard bruger de CPU-uret divideret med 64, dvs. de har deres prescaler indstillet til 64 ved Arduino initialiseringskode. For at forvirre ting mere er der to forskellige PWM-tilstande: hurtig PWM og fasekorrekt PWM. I hurtig PWM tæller timeren til 255, løber derefter over og starter forfra fra 0 (256 forskellige tilstande). I fasekorrekt PWM tæller timeren til 255, ændrer derefter retning og tæller nedad til nul, ændrer retning og så videre (510 forskellige tilstande).
Arduino Mega har 5 timere, timer0 – timer4. Da timer0 også bruges til millis og mikrofunktionerne, bruger den hurtig PWM, mens de andre timere er konfigureret til fasekorrekt PWM. Dette resulterer i forskellige frekvenser på forskellige ben:
-
Pin 4 og 13, styret af timer0:
16 Mhz / 64/256 = 976,56 Hz -
Andre PWM-ben, styret af timer1-4:
16 Mhz / 64/510 = 490,20 Hz
Beregningen er: Ur / Prescaler / PWM mode antal stater
Situationen er den samme for alle andre Arduino-kort, jeg kender til, bortset fra at de har færre timere, der forbinder til forskellige ben.
Du kan ændre PWM-frekvens ved at ændre tidsindstillingen. Se denne side: http://playground.arduino.cc/Main/TimerPWMCheatsheet
Det er også muligt at få timerne til at tælle til en en anden værdi end 255. På 8 bit timerne mister du en output pin, men på 16 bit timerne kan du bruge Input Capture Register til at definere en TOP-værdi. Funktionerne til indfangning af input er en funktion, der sjældent bruges i Arduino-samfundet, så du vil sandsynligvis ikke gå glip af den.
Arduino-bibliotekerne giver dig kun mulighed for at bruge 8 bit opløsning, selv på 16 bit timere. Hvis du ønsker den højere opløsning, bliver du nødt til at skrive din egen analogWrite eller bruge et bibliotek lavet til formålet. På Arduino Mega timer0 og timer2 er 8 bit, mens resten er 16 bit.
Ved at ændre tilstanden af 16 bit timere til at gøre brug af den fulde opløsning, i kombination med ændring af prescaler og TOP-værdi, kan du opnå et meget bredt udvalg af PWM-frekvenser.
Den maksimale frekvens, du kan opnå er ur / 4 ved at indstille prescaler til 1 og TOP til 3 i hurtig PWM-tilstand – en lavere værdi er ikke tilladt. Dette giver dig en 4 MHz PWM med 2 bit opløsning. Det kan være 0%, 25%, 50% eller 75% af tiden. En højere TOP-værdi giver dig en højere opløsning ved en lavere frekvens.
For en længere forklaring kan du læse denne artikel eller henvise til datablad .
Hvis du ændrer prescaler, PWM-tilstand eller TOP-værdi for timer0, rodes med millis()
og micros()
.
Kommentarer
- Jeg samler derefter, at den hurtigste frekvens du kunne få for PWM er 16Mhz / 256 (prescaler = 1) eller 62.5Khz?
- Og yderligere, at PWM-frekvensen skal være en jævn faktor på 62,5KHz? Nogen på en anden tråd ønskede at kontrollere blæserhastigheden på en 4-polet pc-blæser. Det ønsker tilsyneladende et PWM-styresignal på 25 KHz. 62.5 / 25 er 2.5, hvilket ikke er en heltalsværdi.
- Jeg opdaterede svaret for at uddybe mere om mulighederne for at opnå specifikke frekvenser,
- I den lave frekvens ende kunne du prescale en 16 bit timer i fase-korrekt tilstand ved hjælp af en 1024 prescaler for at få 16e6 / 1024/2 ^ 16/2 = 0.119Hz eller 7.1 cyklusser / minut. For lavere end det, ville man være nødt til at skifte bits baseret på noget som millis (). Eller måske udløse tælleren på den eksterne indgangsstift T?.