Vilken frekvens använder Arduinos för normal PWM när du använder analogWrite ()?
Och är det annorlunda för olika Arduino-modeller? Jag är särskilt intresserad av Mega 2560, men vill också veta om den överensstämmer mellan modellerna.
Jag har sett förbigående referenser till Arduino med 500 Hz, vilket verkar riktigt långsamt.
Kommentarer
- Det beror också på nålen du använder.
Svar
PWM-signalen genereras av timers på AVR-chipsen. Varje timer kan generera en PWM-signal på två eller tre olika stift. Varje stift kan ha sin egen arbetscykel, men de delar PWM-frekvensen. Du kan ändra frekvensen för PWM genom att ändra klockkällan för timern. Som standard använder de CPU-klockan dividerad med 64, dvs. de har sin förkalkare inställd på 64 med Arduino initialiseringskod. För att förvirra saker finns det två olika PWM-lägen: snabb PWM och faskorrekt PWM. I snabb PWM räknar timern till 255, rinner sedan över och börjar om från 0 (256 olika tillstånd). I faskorrekt PWM räknar timern till 255, ändrar sedan riktning och räknas nedåt till noll, ändrar riktning och så vidare (510 olika tillstånd).
Arduino Mega har 5 timers, timer0 – timer4. Eftersom timer0 också används för millis- och mikrofunktionerna använder den snabb PWM, medan de andra timerna är konfigurerade för faskorrekt PWM. Detta resulterar i olika frekvenser på olika stift:
-
Stift 4 och 13, styrd av timer0:
16 Mhz / 64/256 = 976,56 Hz -
Andra PWM-stift, styrda av timer1-4:
16 Mhz / 64/510 = 490,20 Hz
Beräkningen är: Clock / Prescaler / PWM-läge antal tillstånd
Situationen är densamma för alla andra Arduino-kort som jag känner till, förutom att de har färre tidtagare som ansluter till olika stift.
Du kan ändra PWM-frekvens genom att ändra timerns förkalkare. Se den här sidan: http://playground.arduino.cc/Main/TimerPWMCheatsheet
Det är också möjligt att få timern att räkna till en ett annat värde än 255. På 8-bitstimrarna förlorar du en utgångsstift, men på 16-bitstimern kan du använda Input Capture Register för att definiera ett TOP-värde. Ingångsfångfunktionen är en funktion som sällan används i Arduino-communityn, så du kommer sannolikt inte att missa den.
Arduino-biblioteken låter dig bara använda 8-bitars upplösning, även på 16-bitars timers. Om du vill ha högre upplösning, måste du skriva din egen analoga skrivning, eller använda ett bibliotek som är gjord för ändamålet. På Arduino Mega timer0 och timer2 är 8 bitar, medan resten är 16 bitar.
Genom att ändra läget för 16-bitstimrarna för att använda full upplösning, i kombination med att ändra prescaler och TOP-värdet, kan du uppnå ett mycket brett spektrum av PWM-frekvenser.
Den maximala frekvensen du kan uppnå är klocka / 4, genom att ställa in prescaler till 1 och TOP till 3 i snabb PWM-läge – ett lägre värde är inte tillåtet. Detta ger dig en 4 MHz PWM med 2 bitars upplösning. Det kan vara 0%, 25%, 50% eller 75% av tiden. Ett högre TOP-värde ger dig en högre upplösning med en lägre frekvens.
För en längre förklaring läs denna artikel eller hänvisa till datablad .
Att ändra prescaler, PWM-läge eller TOP-värde för timer0 kommer att röra sig med millis()
och micros()
.
Kommentarer
- Jag samlar då att den snabbaste frekvensen du kan få för PWM är 16Mhz / 256 (prescaler = 1), eller 62,5Khz?
- Och vidare att PWM-frekvensen måste vara en jämn faktor på 62,5KHz? Någon på en annan tråd ville styra fläkthastigheten för en 4-stifts PC-fläkt. Tydligen vill det ha en PWM-styrsignal på 25 KHz. 62.5 / 25 är 2.5, vilket inte är ett heltal.
- Jag uppdaterade svaret för att utarbeta mer om möjligheterna att uppnå specifika frekvenser,
- På lågfrekvensänden kan du förskala en 16-bitars timer i faskorrektionsläge med en 1024 förskalare för att få 16e6 / 1024/2 ^ 16/2 = 0,119Hz, eller 7,1 cykler / minut. För lägre än så skulle man behöva byta bitar baserat på något som millis (). Eller kanske utlösa räknaren på den externa ingångsstiftet T?.