- PWM-stifter i AVR-mikrocontroller Atmega16
- Hvad er et PWM-signal?
- Komponenter, der kræves
- Kredsløbsdiagram
- Programmering af Atmega16 til PWM
Pulsbreddemodulation (PWM) er en kraftfuld teknik, hvor pulsens bredde ændres ved at holde frekvensen konstant. Teknikken bruges i mange kontrolsystemer i dag. Anvendelsen af PWM er ikke begrænset, og den bruges i en lang række applikationer såsom motorhastighedskontrol, måling, effektstyring og kommunikation osv. I PWM-teknik kan man nemt generere analogt udgangssignal ved hjælp af digitale signaler. Denne vejledning hjælper dig med at forstå PWM, dets terminologier og hvordan vi kan implementere det ved hjælp af en mikrokontroller. I denne vejledning demonstrerer vi PWM med AVR Atmega16 Microcontroller ved at variere intensiteten af en LED.
For at forstå det grundlæggende i PWM i detaljer skal du gå til vores tidligere tutorials om PWM med forskellige mikrokontroller:
- ARM7-LPC2148 PWM Vejledning: Styring af lysstyrke på LED
- Pulsbreddemodulation (PWM) ved hjælp af MSP430G2: Styring af lysstyrke på LED
- Generering af PWM ved hjælp af PIC Microcontroller med MPLAB og XC8
- Pulsbreddemodulation (PWM) i STM32F103C8: Styringshastighed for DC-ventilator
- Generering af PWM-signaler på GPIO-ben på PIC Microcontroller
- Raspberry Pi PWM-vejledning
PWM-stifter i AVR-mikrocontroller Atmega16
Atmega16 har fire dedikerede PWM-ben. Disse ben er PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Også atmega16 har to 8-bit timere og en 16 bit timer. Timer0 og Timer2 er 8-bit timere, mens Timer1 er 16-bit timer. For at generere PWM skal vi have et overblik over timere, da timere bruges til at generere PWM. Som vi ved, at frekvensen er antallet af cyklusser pr. Sekund, som timeren kører på. Så den højere frekvens giver os en hurtigere timer. Ved generering af PWM giver en hurtigere PWM-frekvens finere kontrol over output, fordi den kan reagere hurtigere på nye PWM-driftscyklusser.
I denne Atmega16 PWM-tutorial bruger vi Timer2. Du kan vælge en hvilken som helst arbejdscyklus. Hvis du ikke ved, hvad der er pligtcyklus i PWM, så lad os diskutere kort.
Hvad er et PWM-signal?
Pulse Width Modulation (PWM) er et digitalt signal, der oftest bruges i kontrolkredsløb. Den tid, hvorunder signalet forbliver højt, kaldes "til tiden" og den tid, hvor signalet forbliver lavt, kaldes "slukketid". Der er to vigtige parametre for en PWM som beskrevet nedenfor:
PWM's driftscyklus
Den procentdel af tid, hvor PWM-signalet forbliver HØJ (til tiden) kaldes som driftscyklus.
Som i 100 ms pulssignal, hvis signalet er HØJ i 50 ms og LAV i 50 ms, betyder det, at pulsen var halv tid HØJ og halv tid LAV. Så vi kan sige, at toldcyklussen er 50%. Tilsvarende hvis impulsen er i 25 ms HIGH-tilstand og 75 ms i LOW-tilstand ud af 100 ms, ville driftscyklussen være 25%. Bemærk, at vi kun beregner varigheden af HIGH-tilstand. Du kan tage reference til nedenstående billede for visuel forståelse. Formlen for driftscyklus er derefter
Arbejdscyklus (%) = On Time / (On Time + Off Time)
Så ved at ændre driftscyklussen kan vi ændre bredden på PWM, hvilket resulterer i ændring af LED-lysstyrke. Vi vil have demo om at bruge forskellige driftscyklusser til styring af lysstyrken på LED. Tjek demo-videoen i slutningen af denne tutorial.
Efter valg af driftscyklus ville næste trin være at vælge PWM-tilstand. PWM-tilstanden specificerer, hvordan ønsker du, at PWM skal fungere. Der er hovedsageligt 3 typer PWM-tilstande. Disse er som følger:
- Hurtig PWM
- Fasekorrekt PWM
- Fase og frekvens Korrekt PWM
Hurtig PWM bruges, hvor faseændringen ikke betyder noget. Ved at bruge Hurtig PWM kan vi hurtigt sende PWM-værdierne. Hurtig PWM kan ikke bruges, hvor faseændring påvirker operationen, såsom motorstyring, så i en sådan applikation anvendes andre PWM-tilstande. Da vi vil kontrollere lysstyrken på LED, hvor faseændring ikke påvirker meget, så vi bruger hurtig PWM-tilstand.
For at generere PWM vil vi styre den interne timer til at tælle op og derefter sætte tilbage til nul ved et bestemt antal, så timeren tæller op og sætter derefter tilbage til nul igen og igen. Dette indstiller perioden. Vi har nu muligheden for at kontrollere en puls, tænde en puls TIL et bestemt antal i timeren, mens den går op. Når tælleren går tilbage til 0, skal du slukke for pulsen. Der er masser af fleksibilitet med dette, fordi du altid kan få adgang til timeren og give forskellige impulser med en enkelt timer. Dette er fantastisk, når du vil styre flere lysdioder på én gang. Lad os nu begynde at interfacere en LED med Atmega16 til PWM.
Tjek alle PWM-relaterede projekter her.
Komponenter, der kræves
- Atmega16 AVR Microcontroller IC
- 16Mhz krystaloscillator
- To 100nF kondensatorer
- To 22pF kondensatorer
- Trykknap
- Jumper Wires
- Brødbræt
- USBASP v2.0
- 2 Led (enhver farve)
Kredsløbsdiagram
Vi bruger OC2 til PWM dvs. Pin21 (PD7). Så tilslut en LED ved PD7-stift på Atmega16.
Programmering af Atmega16 til PWM
Komplet program er angivet nedenfor. Brænd programmet i Atmega16 ved hjælp af JTAG og Atmel studio og se PWM-effekten på LED. Dens lysstyrke vil stige og falde langsomt på grund af varierende arbejdscyklus for PWM. Tjek den video, der er givet i slutningen.
Start programmeringen af Atmega16 med opsætning af Timer2 Register. Timer2-registerbitene er som følger, og vi kan indstille eller nulstille bits i overensstemmelse hermed.
Nu vil vi diskutere alle bitene i Timer2, så vi kan få ønsket PWM ved hjælp af et skrevet program.
Der er hovedsageligt fire dele i Timer2-registeret:
FOC2 (Force Output Compare for Timer2): FOC2-bit indstilles, når WGM-bitene angiver en tilstand, der ikke er PWM.
WGM2 (Wave Generation Mode for Timer2): Disse bits styrer tællers tællesekvens, kilden til den maksimale (TOP) tællerværdi og hvilken type bølgeformgenerering, der skal bruges.
COM2 (sammenlign outputmodus for timer2): Disse bits styrer outputadfærden. Den komplette bitbeskrivelse forklares nedenfor.
TCCR2 - = (1 <
Indstil WGM20 og WGM21 bits som HIGH for at aktivere PWM Fast Mode. WGM står for Waveform Generation Mode. Markeringsbitene er som nedenfor.
WGM00 |
WGM01 |
Betjening af timer2-tilstand |
0 |
0 |
Normal tilstand |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
PWM, fase korrekt |
1 |
1 |
Hurtig PWM-tilstand |
For flere detaljer om Waveform Generation Mode kan du se det officielle datablad for Atmega16.
TCCR2 - = (1 <
Vi har heller ikke brugt nogen forskalering, så vi har indstillet urkildereegistret som '001'.
Urets valgbit er som følger:
CS22 |
CS21 |
CS20 |
Beskrivelse |
0 |
0 |
0 |
Ingen urkilde (timer / tæller stoppet) |
0 |
0 |
1 |
clk T2S / (Ingen forudskalering) |
0 |
1 |
0 |
Clk T2S / 8 (fra prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (fra prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (fra prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (fra prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (fra prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (fra prescaler) |
Også OC2 ryddes ved sammenligningskamp ved at indstille COM21 bit som '1' og COM20 som '0'.
Valgmulighederne for sammenligning af outputmodus (COM) til hurtig PWM-tilstand er angivet nedenfor:
COM21 |
COM21 |
Beskrivelse |
0 |
0 |
Normal portdrift, OC2 afbrudt. |
0 |
1 |
Reserveret |
1 |
0 |
Ryd OC2 på Sammenlign match, Indstil OC2 som TOP |
1 |
1 |
Indstil OC2 på sammenligningskamp, ryd OC2 ved TOP |
Forøg driftscyklussen fra 0% til 100%, så lysstyrken stiger med tiden. Tag værdi fra 0-255 og send den til OCR2-pin.
for (duty = 0; duty <255; duty ++) // 0 til max duty cycle { OCR2 = duty; // øg langsomt LED-lysstyrken _forsink_ms (10); }
På samme måde sænkes arbejdscyklussen fra 100% til 0% for gradvist at reducere lysstyrken på LED.
for (duty = 0; duty> 255; duty--) // max til 0 duty cycle { OCR2 = duty; // sænk langsomt LED-lysstyrken _forsink_ms (10); }
Dette afslutter vores tutorial om brug af PWM i Atmega16 / 32.