Jeg har brukt en Arduino Nano som en PWM-kontroller for et varmeelement.
Jeg bruker for øyeblikket D11 (PB3). Jeg kunne bytte, selv om alle pinner med PWM er i bruk, og vil kreve omskriving og omledning.
Dette gir et signal ved ~ 490Hz, men jeg vil eksperimentere med å endre dette til en høyere frekvens.
Jeg samler det er mulig å variere frekvensen ved å endre skillelinjen fra standard 64.
Min skisse bruker bruksområder http://playground.arduino.cc/Main/SevenSegmentLibrary og kaller millis () – vil endring av PWM-divisor påvirke noen av disse?
MERKNAD Jeg har lest setPwmFrequency
dokumentasjonen, men finner «forstyrrer den normale driften» lite nyttig – jeg er faktisk ute etter noen forklaringer på den konkrete effekten. Jeg bruker bare millis()
for å trykke på tidsknappen og blinke en LED, som ikke er tidskritisk
Husk at endring av PWM-frekvensen endrer Atmegas tidtakere og forstyrrer den normale driften av mange funksjoner som er avhengige av tid (forsinkelse (), millis (), Servo-bibliotek).
Jeg har gjort noen videre studier. http://playground.arduino.cc/Code/PwmFrequency sier Endringer på pinner 3, 5, 6 eller 11 kan føre til forsinkelse () og millis ( ) fungerer for å slutte å jobbe.
Andre referanser sier 3, 11 bruk timer 2
så de påvirker millis()
eller ikke som andre referanser hevder timer 0
brukes til disse.
Kommentarer
- Ja og nei, avhengig av pwm-tidtakeren som brukes.
Svar
Jeg vet ikke hvor denne feilinformasjonen kommer fra … Svaret er nei , konfigurerer Timer 2 på nytt ikke påvirker millis()
og heller ikke delay()
, da disse funksjonene er avhengige av Timer 0. AFAIK Arduino-kjernen bruker ikke Timer 2 i det hele tatt. Men merk at det kan være andre Arduino- eller tredjepartsbiblioteker som er avhengige av Timer 2.
Du kan her se kildekoden til millis()
og delay()
.
Som MITU RAJ korrekt sier i sitt svar, blir PWM-signalet på pin 11 levert av Timer 2, slik at du kan bruke den trygt.
Kommentarer
- Feilinformasjonen kommer fra lekeplass .arduino.cc / Code / PwmFrequency . Jeg er sikker på at jeg ikke er den eneste brukeren som har blitt villedet. Det andre svaret publiserte nettopp et utdrag av den misvisende dokumentasjonen.
Svar
Svaret er NO , endring av PWM-deleren for pin 11 vil ikke påvirke millis()
-funksjonen (eller delay()
).
Forklaring:
Arduino Nano bruker ATMega328P mikrokontroller, samme som Arduino Uno .
Pin 11 «s PWM styres av Timer 2. Som standard har Timer 2 en forhåndsskala på 64 (dvs. innstilling 0x04). Basisfrekvensen til Timer 2 er 31372,55 Hz, noe som resulterer i en frekvens på 490,2 Hz (dvs. 31372.55 / 64 = 490.1961).
På den annen side er mikrosekundtidsuret (dvs. den som brukes av millis()
, micros()
, delay()
og delayMicroseconds()
) styres av Timer 0.
Så endre prescaler av Timer 2 vil ikke påvirke millis()
.
Det vil imidlertid endre PWM-frekvensen til Pin 3.
Tilbake til spørsmålet ditt:
De mulige PWM-frekvensene til Pin 11 (høyere enn 488 Hz) er:
31373/32 = 980,4 Hz
31373/8 = 3921,6 Hz
31373/1 = 31373 Hz
Der 32, 8, 1 er forkalkeren.
Som tilsvarer til en innstillingsverdi på henholdsvis 0x03, 0x02 & 0x01.
Legg til denne kodelinjen:
TCCR2B = TCCR2B & 0b11111000 | setting;
Hvor setting
er verdien av innstillingen for den 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 || ============================================
Kildekode : https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c
Kommentarer
- Bare nitpicking men … timeren ' s basefrekvens i fasekorrekt PWM-modus er F_CPU / 510 (31373 Hz), ikke F_CPU / 512: det tar 255 sykluser å telle f rom 0 til 255, deretter 255 til for å telle tilbake til null. C.f. ligningen for PWM-frekvensen i databladet.
- @EdgarBonet Bra poeng. Svaret er nå rettet.
- ville det være mulig å gå et trinn langsommere ned til 15.31 Hz?
Svar
Avhenger av nålen du brukte til PWM.
Arduino UNO / NANO spesifikasjoner sier følgende ting:
Basisfrekvensen for pinnene 3, 9, 10 og 11 er 31250 Hz.
Basisfrekvensen for pinnene 5 og 6 er 62500 Hz.
Delene som er tilgjengelige på pinnene 5, 6, 9 og 10 er: 1, 8, 64, 256 og 1024.
Delene som er tilgjengelige på pinnene 3 og 11 er: 1, 8, 32, 64, 128, 256 og 1024.
PWM-frekvenser er bundet sammen i par pinner. Hvis en i et par endres, blir den andre også endret til å matche.
Pins 5 og 6 er paret på timer0.
Pins 9 og 10 er paret på timer1.
Pins 3 og 11 er paret på timer2.
Endringer på pinnene 3, 5, 6 eller 11 kan forårsake forsinkelsen () og millis () funksjoner for å slutte å fungere. Andre tidsrelaterte funksjoner kan også bli berørt.
Kommentarer
- Siden du ' siterer du spesifikasjonene, det ' ville det være fint hvis du også kunne koble til dem? 🙂