- PWM-pinner i AVR-mikrokontroller Atmega16
- Hva er et PWM-signal?
- Komponenter kreves
- Kretsdiagram
- Programmering Atmega16 for PWM
Pulse Width Modulation (PWM) er en kraftig teknikk der pulsens bredde endres ved å holde frekvensen konstant. Teknikken brukes i mange kontrollsystemer i dag. Anvendelsen av PWM er ikke begrenset, og den brukes i et bredt spekter av applikasjoner som motorhastighetskontroll, måling, effektkontroll og kommunikasjon etc. I PWM-teknikk kan man enkelt generere analogt utgangssignal ved hjelp av digitale signaler. Denne opplæringen vil hjelpe deg med å forstå PWM, dets terminologier og hvordan vi kan implementere det ved hjelp av en mikrokontroller. I denne opplæringen vil vi demonstrere PWM med AVR Atmega16 Microcontroller ved å variere intensiteten til en LED.
For å forstå det grunnleggende om PWM i detalj, kan du gå til våre tidligere opplæringsprogrammer om PWM med forskjellige mikrokontrollere:
- ARM7-LPC2148 PWM Opplæring: Kontrollere lysstyrken på LED
- Pulsbreddemodulering (PWM) ved bruk av MSP430G2: Kontrollere lysstyrken på LED
- Genererer PWM ved hjelp av PIC Microcontroller med MPLAB og XC8
- Pulsbreddemodulering (PWM) i STM32F103C8: Kontrollhastighet på DC-vifte
- Genererer PWM-signaler på GPIO-pinner på PIC Microcontroller
- Raspberry Pi PWM opplæring
PWM-pinner i AVR-mikrokontroller Atmega16
Atmega16 har fire dedikerte PWM-pinner. Disse pinnene er PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Også ATmega16 har to 8-bits tidsinnstillinger og en 16 bits tidsuret. Timer0 og Timer2 er 8-biters timere mens Timer1 er 16-biters timer. For å generere PWM må vi ha en oversikt over tidtakere ettersom tidtakere brukes til å generere PWM. Som vi vet at frekvensen er antall sykluser per sekund timeren kjører på. Så høyere frekvens vil gi oss en raskere tidtaker. Ved generering av PWM vil en raskere PWM-frekvens gi bedre kontroll over utgangen fordi den kan reagere raskere på nye PWM-driftssykluser.
I denne Atmega16 PWM-opplæringen bruker vi Timer2. Du kan velge hvilken som helst driftssyklus. Hvis du ikke vet hva som er driftssyklus i PWM, la oss diskutere kort.
Hva er et PWM-signal?
Pulse Width Modulation (PWM) er et digitalt signal som oftest brukes i kontrollkretser. Tiden der signalet holder seg høyt kalles "på tid" og tiden som signalet holder seg lavt kalles "av-tid". Det er to viktige parametere for en PWM som diskutert nedenfor:
Driftssyklus for PWM
Prosentandelen av tid PWM-signalet forblir HØY (i tide) kalles som driftssyklus.
Som i 100ms puls signal, hvis signalet er HØY i 50ms og LAV i 50ms, betyr det at pulsen var halv tid HØY og halv tid LAV. Så vi kan si at arbeidssyklusen er 50%. Tilsvarende hvis pulsen er i 25 ms HØY tilstand og 75 ms i LAV tilstand ut av 100 ms, vil driftssyklusen være 25%. Legg merke til at vi bare beregner varigheten av HIGH-tilstanden. Du kan ta referanse til bildet nedenfor for visuell forståelse. Formelen for driftssyklus er da,
Driftssyklus (%) = På Tid / (På Tid + Av Tid)
Så, ved å endre driftssyklusen, kan vi endre bredden på PWM og dermed resultere i endring av LED-lysstyrken. Vi vil ha en demonstrasjon av å bruke forskjellige driftssykluser for å kontrollere lysstyrken på LED. Sjekk demovideoen på slutten av denne opplæringen.
Etter å ha valgt driftssyklus, vil neste trinn være å velge PWM-modus. PWM-modus spesifiserer at hvordan vil du at PWM skal fungere. Det er hovedsakelig 3 typer PWM-modus. Disse er som følger:
- Rask PWM
- Fasekorrekt PWM
- Fase og frekvens riktig PWM
Rask PWM brukes der faseendringen ikke betyr noe. Ved å bruke Fast PWM kan vi sende ut PWM-verdiene raskt. Rask PWM kan ikke brukes der faseendring påvirker driften, for eksempel motorkontroll, så i en slik applikasjon brukes andre moduser for PWM. Siden vi skal kontrollere lysstyrken på LED der faseendring ikke vil påvirke mye, så vi vil bruke Fast PWM-modus.
Nå for å generere PWM vil vi kontrollere den interne tidtakeren for å telle opp og deretter sette tilbake til null ved et bestemt antall, så tidtakeren vil telle opp og deretter sette tilbake til null om og om igjen. Dette angir perioden. Vi har nå muligheten til å kontrollere en puls, slå en puls PÅ ved et bestemt antall i tidtakeren mens den går opp. Når telleren går tilbake til 0, slår du av pulsen. Det er stor fleksibilitet med dette fordi du alltid kan få tilgang til tidtellingen og gi forskjellige pulser med en enkelt tidtaker. Dette er flott når du vil kontrollere flere lysdioder samtidig. La oss nå begynne å koble en LED med Atmega16 for PWM.
Sjekk alle PWM-relaterte prosjekter her.
Komponenter kreves
- Atmega16 AVR Microcontroller IC
- 16Mhz krystalloscillator
- To kondensatorer på 100nF
- To 22pF kondensatorer
- Trykknapp
- Jumper Wires
- Brettbrett
- USBASP v2.0
- 2 Led (hvilken som helst farge)
Kretsdiagram
Vi bruker OC2 for PWM dvs. Pin21 (PD7). Så koble en LED på PD7-pinnen på Atmega16.
Programmering Atmega16 for PWM
Fullstendig program er gitt nedenfor. Brenn programmet i Atmega16 ved hjelp av JTAG og Atmel studio og se PWM-effekten på LED. Lysstyrken øker og reduseres sakte på grunn av varierende driftssyklus for PWM. Sjekk videoen som er gitt på slutten.
Begynn å programmere Atmega16 med å sette opp Timer2 Register. Timer2-registerbitene er som følger, og vi kan angi eller tilbakestille bits tilsvarende.
Nå skal vi diskutere alle bitene av Timer2 slik at vi kan få ønsket PWM ved hjelp av et skrevet program.
Det er hovedsakelig fire deler i Timer2-registeret:
FOC2 (Force Output Compare for Timer2): FOC2-biten settes når WGM-bitene spesifiserer en ikke-PWM-modus.
WGM2 (Wave Generation Mode for Timer2): Disse bitene kontrollerer telleresekvensen til telleren, kilden for den maksimale (TOP) tellerverdien, og hvilken type bølgeformgenerering som skal brukes.
COM2 (Sammenlign utdatamodus for timer2): Disse bitene styrer utgangsadferden. Den komplette bitbeskrivelsen er forklart nedenfor.
TCCR2 - = (1 <
Sett WGM20 og WGM21 bits som HIGH for å aktivere PWM Fast Mode. WGM står for bølgeformgenereringsmodus. Valgbitene er som nedenfor.
WGM00 |
WGM01 |
Timer2-modus |
0 |
0 |
Normal modus |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
PWM, fasekorrekt |
1 |
1 |
Rask PWM-modus |
For mer informasjon om Waveform Generation Mode, kan du se det offisielle databladet til Atmega16.
TCCR2 - = (1 <
Vi har heller ikke brukt noen forhåndsskalering, så vi har satt Clock source register som '001'.
Boksene til klokkevalg er som følger:
CS22 |
CS21 |
CS20 |
Beskrivelse |
0 |
0 |
0 |
Ingen klokkilde (Timer / Teller stoppet) |
0 |
0 |
1 |
clk T2S / (Ingen forhåndsskalering) |
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) |
OC2 tømmes også ved sammenligningskamp ved å sette COM21-bit som '1' og COM20 som '0'.
Alternativer for sammenligning av utgangsmodus (COM) for rask PWM-modus er gitt nedenfor:
COM21 |
COM21 |
Beskrivelse |
0 |
0 |
Normal portdrift, OC2 frakoblet. |
0 |
1 |
Reservert |
1 |
0 |
Fjern OC2 på Sammenlign kamp, Sett OC2 på TOPP |
1 |
1 |
Sett OC2 på sammenligningskamp, tøm OC2 på TOPP |
Øk driftssyklusen fra 0% til 100%, slik at lysstyrken øker over tid. Ta verdien fra 0-255 og send den til OCR2-pin.
for (duty = 0; duty <255; duty ++) // 0 to max duty cycle { OCR2 = duty; // øke sakte LED-lysstyrken _forsink_ms (10); }
På samme måte reduserer du driftssyklusen fra 100% til 0% for å redusere lysstyrken på LED gradvis.
for (duty = 0; duty> 255; duty--) // max to 0 duty cycle { OCR2 = duty; // reduser sakte LED-lysstyrken _forsink_ms (10); }
Dette avslutter vår veiledning om bruk av PWM i Atmega16 / 32.