- PWM-stift i AVR-mikrokontroller Atmega16
- Vad är en PWM-signal?
- Komponenter krävs
- Kretsschema
- Programmering Atmega16 för PWM
Pulsbreddsmodulering (PWM) är en kraftfull teknik där pulsens bredd ändras genom att hålla frekvensen konstant. Tekniken används i många styrsystem idag. Tillämpningen av PWM är inte begränsad och används i ett brett spektrum av applikationer såsom motorhastighetskontroll, mätning, effektstyrning och kommunikation etc. I PWM-teknik kan man enkelt generera analog utsignal med digitala signaler. Denna handledning hjälper dig att förstå PWM, dess terminologier och hur vi kan implementera det med en mikrokontroller. I denna handledning kommer vi att demonstrera PWM med AVR Atmega16 Microcontroller genom att variera intensiteten på en LED.
För att förstå grunderna för PWM i detalj, gå till våra tidigare handledning om PWM med olika mikrokontroller:
- ARM7-LPC2148 PWM Handledning: Kontrollera ljusstyrka hos LED
- Pulsbreddsmodulering (PWM) med MSP430G2: Kontroll av ljusstyrka hos LED
- Generera PWM med PIC Microcontroller med MPLAB och XC8
- Pulsbreddsmodulering (PWM) i STM32F103C8: Styrhastighet för DC-fläkt
- Generera PWM-signaler på GPIO-stift på PIC Microcontroller
- Raspberry Pi PWM-handledning
PWM-stift i AVR-mikrokontroller Atmega16
Atmega16 har fyra dedikerade PWM-stift. Dessa stift är PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Även ATmega16 har två 8-bitars timer och en 16-bitars timer. Timer0 och Timer2 är 8-bitars timers medan Timer1 är 16-bitars timer. För att generera PWM måste vi ha en översikt över timers eftersom timers används för att generera PWM. Som vi vet att frekvensen är antalet cykler per sekund som timern körs på. Så den högre frekvensen ger oss en snabbare timer. Vid generering av PWM ger en snabbare PWM-frekvens finare kontroll över utgången eftersom den kan svara snabbare på nya PWM-driftscykler.
I denna Atmega16 PWM-handledning kommer vi att använda Timer2. Du kan välja vilken arbetscykel som helst. Om du inte vet vad som är arbetscykel i PWM, låt oss diskutera i korthet.
Vad är en PWM-signal?
Pulsbreddsmodulering (PWM) är en digital signal som oftast används i styrkretsar. Tiden under vilken signalen förblir hög kallas "i tid" och den tid under vilken signalen förblir låg kallas "avstängningstid". Det finns två viktiga parametrar för en PWM som diskuteras nedan:
PWM: s arbetscykel
Procentandelen tid under vilken PWM-signalen förblir HÖG (i tid) kallas som arbetscykel.
Liksom vid 100 ms pulssignal, om signalen är HÖG för 50 ms och LÅG för 50 ms, betyder det att pulsen var halvtid HÖG och halvtid LÅG. Så vi kan säga att arbetscykeln är 50%. På samma sätt om pulsen är i 25ms HIGH-tillstånd och 75ms i LOW-tillstånd av 100ms, skulle arbetscykeln vara 25%. Observera att vi bara beräknar varaktigheten för HIGH-tillståndet. Du kan ta referens till bilden nedan för visuell förståelse. Formeln för arbetscykel är då,
Driftscykel (%) = On Time / (On Time + Off Time)
Så genom att ändra arbetscykeln kan vi ändra bredden på PWM och därmed resultera i förändring av LED-ljusstyrkan. Vi kommer att ha en demonstration av att använda olika arbetscykler för att kontrollera ljusstyrkan på LED. Kolla demo-videon i slutet av denna handledning.
Efter att ha valt arbetscykeln skulle nästa steg vara att välja PWM-läge. PWM-läget anger att hur vill du att PWM ska fungera. Det finns huvudsakligen tre typer av PWM-lägen. Dessa är som följer:
- Snabb PWM
- Faskorrekt PWM
- Fas- och frekvenskorrekt PWM
Snabb PWM används där fasförändringen inte spelar någon roll. Genom att använda snabb PWM kan vi mata ut PWM-värdena snabbt. Snabb PWM kan inte användas där fasförändring påverkar operationen, såsom motorstyrning, så i en sådan applikation används andra lägen för PWM. Eftersom vi kommer att kontrollera ljusstyrkan på LED där fasförändring inte påverkar mycket, så vi kommer att använda snabb PWM-läge.
Nu för att generera PWM kommer vi att styra den interna timern för att räkna upp och sedan sätta tillbaka till noll vid ett visst antal, så timern kommer att räkna upp och sedan återställa till noll om och om igen. Detta ställer in perioden. Vi har nu möjlighet att styra en puls, sätta en puls PÅ vid ett specifikt antal i timern medan den går upp. När räknaren går tillbaka till 0 stänger du sedan av pulsen. Det finns mycket flexibilitet med detta eftersom du alltid kan få tillgång till tidräknaren och ge olika pulser med en enda timer. Det här är bra när du vill styra flera lysdioder samtidigt. Låt oss nu börja koppla ihop en LED med Atmega16 för PWM.
Kontrollera alla PWM-relaterade projekt här.
Komponenter krävs
- Atmega16 AVR Microcontroller IC
- 16Mhz kristalloscillator
- Två 100nF kondensatorer
- Två 22pF kondensatorer
- Tryckknapp
- Bygeltrådar
- Bakbord
- USBASP v2.0
- 2 Led (valfri färg)
Kretsschema
Vi använder OC2 för PWM dvs Pin21 (PD7). Så anslut en LED på Atmega16-stiftet PD7.
Programmering Atmega16 för PWM
Komplett program ges nedan. Bränn programmet i Atmega16 med JTAG och Atmel studio och se PWM-effekten på LED. Dess ljusstyrka ökar och minskar långsamt på grund av varierande arbetscykel för PWM. Kontrollera videon som ges i slutet.
Börja programmera Atmega16 med att ställa in Timer2 Register. Timer2-registerbitarna är följande och vi kan ställa in eller återställa bitar i enlighet därmed.
Nu kommer vi att diskutera om alla bitar av Timer2 så att vi kan få önskad PWM med hjälp av skrivet program.
Det finns huvudsakligen fyra delar i Timer2-registret:
FOC2 (Force Output Compare for Timer2): FOC2-biten ställs in när WGM-bitarna anger ett icke-PWM-läge.
WGM2 (Wave Generation Mode for Timer2): Dessa bitar styr räknarens räknesekvens, källan för det maximala (TOP) räknarvärdet och vilken typ av vågformgenerering som ska användas.
COM2 (Jämför utmatningsläge för Timer2): Dessa bitar styr utgångsbeteendet. Den fullständiga bitbeskrivningen förklaras nedan.
TCCR2 - = (1 <
Ställ in WGM20- och WGM21-bitarna som HÖG för att aktivera PWM-snabbläge. WGM står för Waveform Generation Mode. Urvalsbitarna är som nedan.
WGM00 |
WGM01 |
Timer2-läge |
0 |
0 |
Normalt läge |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
PWM, fas korrekt |
1 |
1 |
Snabbt PWM-läge |
För mer information om Waveform Generation Mode kan du hänvisa till det officiella databladet för Atmega16.
TCCR2 - = (1 <
Vi har inte heller använt någon förskalning så vi har ställt klockkällregistret till '001'.
Klockvalets bitar är som följer:
CS22 |
CS21 |
CS20 |
Beskrivning |
0 |
0 |
0 |
Ingen klockkälla (timer / räknare stoppad) |
0 |
0 |
1 |
clk T2S / (Ingen förskalning) |
0 |
1 |
0 |
Clk T2S / 8 (från prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (från prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (från prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (från prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (från prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (från prescaler) |
OC2 rensas också vid jämförelsematchning genom att ställa in COM21-bit som '1' och COM20 som '0'.
Alternativen för jämför utmatningsläge (COM) för snabb PWM-läge ges nedan:
COM21 |
COM21 |
Beskrivning |
0 |
0 |
Normal portdrift, OC2 frånkopplad. |
0 |
1 |
Reserverad |
1 |
0 |
Rensa OC2 på Jämför match, Ställ OC2 som TOPP |
1 |
1 |
Ställ OC2 på jämförelsematch, rensa OC2 vid TOP |
Öka arbetscykeln från 0% till 100% så att ljusstyrkan ökar med tiden. Ta värde från 0-255 och skicka det till OCR2-stift.
för (duty = 0; duty <255; duty ++) // 0 till max duty cycle { OCR2 = duty; // öka långsamt LED-ljusstyrkan _fördröj_ms (10); }
På samma sätt minskar arbetscykeln från 100% till 0% för att gradvis minska ljusstyrkan på LED.
för (duty = 0; duty> 255; duty--) // max to 0 duty cycle { OCR2 = duty; // sakta sänka LED-ljusstyrkan _fördröj_ms (10); }
Detta avslutar vår handledning om användning av PWM i Atmega16 / 32.