Arduino Nano PWM-frekvens (Svenska)

Jag har använt en Arduino Nano som en PWM-styrenhet för ett värmeelement.

Jag använder för närvarande D11 (PB3). Jag skulle kunna byta, även om alla stift med PWM används, och skulle kräva en omskrivning och trådanslutning.

Detta ger en signal vid ~ 490Hz, men jag skulle vilja experimentera med att ändra detta till en högre frekvens.

Jag samlar in det är möjligt att variera frekvensen genom att ändra divisorn från standard 64.

Min skiss använder användningar http://playground.arduino.cc/Main/SevenSegmentLibrary och ringer till millis () – kommer förändring av PWM-divisor att påverka någon av dessa?

OBS! Jag har läst setPwmFrequency -dokumentationen, men tycker att ”stör den normala driften” inte till hjälp – jag är faktiskt ute efter någon förklaring av den konkreta effekten. Jag använder bara millis() för att trycka på tidsknappen och blinka en lysdiod som inte är tidskritisk

Tänk på att ändring av PWM-frekvensen ändrar Atmegas timrar och stör normal funktion för många funktioner som är beroende av tid (fördröjning (), millis (), servobibliotek).

Jag har gjort ytterligare studier. http://playground.arduino.cc/Code/PwmFrequency anger Ändringar på stift 3, 5, 6 eller 11 kan orsaka fördröjning () och millis ( ) fungerar för att sluta fungera.

Andra referenser säger 3, 11 använder timer 2 de påverkar millis() eller inte eftersom andra referenser hävdar att timer 0 används för dessa.

Kommentarer

  • Ja och nej, beroende på vilken pwm-timer som används.

Svar

Jag vet inte var denna felinformation kommer ifrån … Svaret är nej , omkonfigurering av timer 2 gör inte påverkar millis() eller delay(), eftersom dessa funktioner är beroende av Timer 0. AFAIK Arduino-kärnan använder inte Timer 2 alls. Men observera att det kan finnas andra Arduino- eller tredjepartsbibliotek som förlitar sig på Timer 2.

Du kan se här källkoden för millis() och delay() .

Som MITU RAJ korrekt anger i sitt svar tillhandahålls PWM-signalen på stift 11 av Timer 2 så att du kan använda den på ett säkert sätt.

Kommentarer

  • Felinformationen kommer från lekplats .arduino.cc / Code / PwmFrequency . Jag är säker på att jag inte är den enda användaren som har blivit vilseledd. Det andra svaret publicerade precis ett utdrag av den vilseledande dokumentationen.

Svar

Svaret är NEJ , ändring av PWM-avdelaren för stift 11 påverkar inte funktionen millis() (eller delay()).


Förklaring:
Arduino Nano använder ATMega328P mikrokontroller, samma som Arduino Uno .

Stift 11 ”s PWM styrs av Timer 2. Timer 2 har som standard en förskalning på 64 (dvs. inställning 0x04). Basfrekvensen för Timer 2 är 31372,55 Hz vilket resulterar i en frekvens på 490,2 Hz (dvs. 31372.55 / 64 = 490.1961).

Å andra sidan är mikrosekundtimern (dvs. den som används av millis(), micros(), delay() och delayMicroseconds()) styrs av Timer 0.

Så ändra prescaler för Timer 2 påverkar inte millis().

Det ändrar dock PWM-frekvensen för stift 3.


Tillbaka till din fråga:
De möjliga PWM-frekvenserna för stift 11 (högre än 488 Hz) är:

31373/32 = 980,4 Hz
31373/8 = 3921,6 Hz
31373/1 = 31373 Hz

Där 32, 8, 1 är förskalaren.
Vilket motsvarar till ett inställningsvärde på 0x03, 0x02 & 0x01 respektive.

Lägg till denna kodrad:

TCCR2B = TCCR2B & 0b11111000 | setting; 

Där setting är värdet på inställningen för respektive prescaler.

============================================ || Frequency [Hz] || Prescaler || Setting || ============================================ || 31373.55 || 1 || 0x01 || || 3921.57 || 8 || 0x02 || || 980.39 || 32 || 0x03 || || 490.20 || 64 || 0x04 || || 245.10 || 128 || 0x05 || || 122.55 || 256 || 0x06 || || 30.64 || 1024 || 0x07 || ============================================ 

Källkod : https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c

Kommentarer

  • Bara nitpicking men … timern ' basfrekvens i fas korrekt PWM-läge är F_CPU / 510 (31373 Hz), inte F_CPU / 512: det tar 255 cykler att räkna f rom 0 till 255, sedan 255 mer för att räkna tillbaka till noll. C.f. ekvationen för PWM-frekvensen i databladet.
  • @EdgarBonet Bra poäng. Svaret har nu rättats.
  • skulle det vara möjligt att gå ner ett steg långsammare till 15,31 Hz?

Svar

Beror på nålen du använde för PWM.

Arduino UNO / NANO-specifikationer säger följande saker:

Basfrekvensen för stift 3, 9, 10 och 11 är 31250 Hz.

Basfrekvensen för stift 5 och 6 är 62500 Hz.

De tillgängliga delarna på stift 5, 6, 9 och 10 är: 1, 8, 64, 256 och 1024.

De delare som finns på stift 3 och 11 är: 1, 8, 32, 64, 128, 256 och 1024.

PWM-frekvenser är sammanbundna i par stift. Om det ena i ett par ändras ändras det andra också så att det matchar.

Pins 5 och 6 är ihopkopplade på timer0.

Pins 9 och 10 är ihopkopplade på timer1.

Pins 3 och 11 är ihopkopplade på timer2.

Ändringar på stiften 3, 5, 6 eller 11 kan orsaka fördröjningen () och millis () funktioner för att sluta fungera. Andra tidsrelaterade funktioner kan också påverkas.

Kommentarer

  • Eftersom du ' citerar du specifikationerna, det ' skulle det vara trevligt om du också kunde länka till dem? 🙂

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *