I dette projekt skal vi bruge en af funktionerne i ATmega32A til at justere lysstyrken på 1 W LED. Metoden, der bruges til at justere LED-hastigheden, er PWM (Pulse Width Modulation). Denne AVR Microcontroller PWM-tutorial forklarer PWM-konceptet og generering af PWM i detaljer (Du kan også kontrollere dette enkle PWM-generatorkredsløb). Overvej et simpelt kredsløb som vist i figuren.
Hvis kontakten i ovenstående figur nu lukkes kontinuerligt over en periode, vil pæren kontinuerligt tænde i løbet af denne tid. Hvis kontakten er lukket i 8 ms og åbnet i 2 ms over en cyklus på 10 ms, vil pæren kun være TÆNDT i løbet af 8 ms. Nu er den gennemsnitlige terminal over hele en periode på 10 ms = Tænd tid / (Tænd tid + Sluk tid), dette kaldes driftscyklus og er på 80% (8 / (8 + 2)), så gennemsnittet udgangsspændingen vil være 80% af batterispændingen.
I det andet tilfælde lukkes kontakten i 5 ms og åbnes i 5 ms over en periode på 10 ms, så den gennemsnitlige terminalspænding ved udgangen vil være 50% af batterispændingen. Sig, om batterispændingen er 5V, og driftscyklussen er 50%, og så vil den gennemsnitlige terminalspænding være 2,5V.
I det tredje tilfælde er driftscyklussen 20%, og den gennemsnitlige terminalspænding er 20% af batterispændingen.
I ATMEGA32A har vi fire PWM-kanaler, nemlig OC0, OC1A, OC1B og OC2. Her skal vi bruge OC0 PWM-kanal til at variere lysstyrken på LED'en.
Komponenter, der kræves
Hardware:
ATmega32 mikrokontroller
Strømforsyning (5v)
AVR-ISP programmør
100uF kondensator, 1 watt LED
TIP127 transistor
Knapper (2 stykker)
100nF (104) kondensator (2 stykker), 100Ω og 1kΩ modstande (2 stykker).
Software:
Atmel studio 6.1
Progisp eller flash magi
Kredsløbsdiagram og arbejdsforklaring
Ovenstående figur viser kredsløbsdiagrammet for LED-lysdæmper med AVR Microcontroller (Du kan også kontrollere dette enkle LED-lysdæmperkredsløb).
I ATmega har vi til fire PWM-kanaler udpeget fire ben. Vi kan kun tage PWM-output på disse ben. Da vi bruger PWM0 bør vi tage PWM signal på OC0 ben (PORTB 3 rd PIN-kode). Som vist i figur forbinder vi transistorens base til OC0-pin for at drive strøm-LED'en. Her er en anden ting over fire PWM-kanaler, to er 8-bit PWM-kanaler. Vi skal bruge en 8-bit PWM-kanal her.
En kondensator er forbundet til hver af knapperne for at undgå at hoppe. Hver gang der trykkes på en knap, vil der være noget støj ved stiften. Selvom denne støj stabiliseres i millisekunder. For en controller fungerer de skarpe toppe før stabilisering som udløsere. Denne effekt kan elimineres enten af software eller hardware, for at programmet skal være enkelt. Vi bruger hardwaremetoden ved at tilføje afvisende kondensator.
Kondensatorerne ophæver effekten af hoppende knapper.
I ATMEGA er der et par måder at generere PWM på:
1. Fasekorrekt PWM
2. Hurtig PWM
Her skal vi holde alt simpelt, så vi bruger FAST PWM-metoden til at generere PWM-signalet.
Først vælger du frekvensen af PWM. Dette afhænger normalt af applikationen, for en LED vil enhver frekvens større end 50Hz gøre. Af denne grund vælger vi tælleruret 1MHZ. Så vi vælger ingen prescalar. En prescalar er et tal, der er valgt således at få et mindre mod ur. For eksempel, hvis oscillatoruret er 8MHz, kan vi vælge en prescalar på '8' for at få et 1MHz ur til tæller. Prescalar vælges ud fra frekvens. Hvis vi ønsker flere tidsperiodeimpulser, skal vi vælge højere prescalar.
Nu for at få FAST PWM på 50Hz ur ud af ATMEGA, er vi nødt til at aktivere de relevante bits i " TCCR0 " -registret. Dette er det eneste register, vi skal genere for at få 8bit FAST PWM.
Her, 1. CS00, CS01, CS02 (GUL) - vælg prescalar til valg af tællerur. Tabellen for passende prescalar er vist i nedenstående tabel. Så til forudskalning af en (oscillatorur = mod ur).
så CS00 = 1, andre to bits er nul.
2. WGM01og WGM00 ændres til at vælge bølgeformgenereringstilstande, baseret på nedenstående tabel, for hurtig PWM. Vi har WGM00 = 1 og WGM01 = 1;
3. Nu ved vi, at PWM er et signal med forskellige driftsforhold eller forskellige tænd / sluk-tider. Indtil nu har vi valgt frekvens og type PWM. Hovedtemaet for dette projekt ligger i dette afsnit. For at få et andet toldforhold skal vi vælge en værdi mellem 0 og 255 (2 ^ 8 på grund af 8 bit). Sig, at vi vælger en værdi 180, da tælleren begynder at tælle fra 0 og når værdien 180, kan udgangssvaret muligvis udløses. Denne trigger kan være inverterende eller ikke inverterende. Det vil sige, at produktionen kan blive fortalt at trækkes op, når den når tællingen, eller den kan blive fortalt at trækkes ned, når den når tællingen.
Dette valg af at trække op eller ned vælges af CM00 og CM01 bits.
Som vist i tabel, for at output skal gå højt ved sammenligning, og output forbliver højt indtil maksimumsværdi (som vist i figuren nederst). Vi er nødt til at vælge inverterende tilstand for at gøre det, så COM00 = 1; COM01 = 1.
Som vist i nedenstående figur er OCR0 (Output Compare Register 0) den byte, der gemmer den brugervalgte værdi. Så hvis vi ændrer OCR0 = 180, udløser controlleren ændringen (høj), når tælleren når 180 fra 0.
Nu for at variere lysstyrken på LED er vi nødt til at ændre DUTY RATIO for PWM-signal. For at ændre toldforholdet skal vi ændre OCR0-værdien. Når vi ændrer denne værdi af OCR0, tager tælleren anden tid at nå OCR0. Så controlleren trækker output højt på forskellige tidspunkter.
Så for PWM med forskellige driftscyklusser er vi nødt til at ændre OCR0-værdi.
I kredsløb har vi to knapper. Én knap er til forøgelse af OCR0-værdien, og således er DUTY RATIO for PWM-signal, den anden er for at mindske OCR0-værdien, og så DUTY RATIO for PWM signal.