I dette prosjektet skal vi bruke en av funksjonene til ATmega32A til å justere lysstyrken på 1 Watt LED. Metoden som brukes til å justere hastigheten på LED er PWM (Pulse Width Modulation). Denne AVR Microcontroller PWM-opplæringen forklarer PWM-konseptet og generering av PWM i detalj (Du kan også sjekke denne enkle PWM-generatorkretsen). Tenk på en enkel krets som vist på figuren.
Nå hvis bryteren i figuren over er stengt kontinuerlig over en periode, vil lyspæren kontinuerlig slå på i løpet av den tiden. Hvis bryteren er lukket i 8 ms og åpnet i 2 ms over en syklus på 10 ms, vil pæren bare være PÅ i løpet av 8 ms. Nå er den gjennomsnittlige terminalen over en periode på 10ms = Slå PÅ tid / (Slå PÅ tid + Slå AV tid), dette kalles driftssyklus og er på 80% (8 / (8 + 2)), så gjennomsnittet utgangsspenningen vil være 80% av batterispenningen.
I det andre tilfellet er bryteren lukket i 5 ms og åpnet i 5 ms over en periode på 10 ms, så den gjennomsnittlige terminalspenningen på utgangen vil være 50% av batterispenningen. Si om batterispenningen er 5V og driftssyklusen er 50%, og så vil den gjennomsnittlige terminalspenningen være 2,5V.
I det tredje tilfellet er driftssyklusen 20% og den gjennomsnittlige terminalspenningen er 20% av batterispenningen.
I ATMEGA32A har vi fire PWM-kanaler, nemlig OC0, OC1A, OC1B og OC2. Her skal vi bruke OC0 PWM-kanal for å variere lysstyrken på LED-en.
Komponenter kreves
Maskinvare:
ATmega32 mikrokontroller
Strømforsyning (5v)
AVR-ISP Programmerer
100uF kondensator, 1Watt LED
TIP127 transistor
Knapper (2 stk)
100nF (104) kondensator (2 stk), 100Ω og 1kΩ motstand (2 deler).
Programvare:
Atmel studio 6.1
Progisp eller flash magi
Kretsdiagram og arbeidsforklaring
Ovenstående figur viser kretsskjemaet for LED-dimmer med AVR Microcontroller (Du kan også sjekke denne enkle LED-dimmerkretsen).
I ATmega, for fire PWM-kanaler, har vi utpekt fire pinner. Vi kan bare ta PWM-utgang på disse pinnene. Siden vi bruker PWM0, bør vi ta PWM-signal på OC0-pin (PORTB 3. PIN-kode). Som vist i figuren kobler vi transistorens base til OC0-pinnen for å drive strøm-LED. Her er en annen ting over fire PWM-kanaler, to er 8-biters PWM-kanaler. Vi skal bruke en 8-biters PWM-kanal her.
En kondensator er koblet til hver av knappene for å unngå sprett. Hver gang du trykker på en knapp vil det være noe støy ved pinnen. Selv om denne støyen stabiliserer seg i millisekunder. For en kontroller fungerer de skarpe toppene før stabilisering som utløsere. Denne effekten kan elimineres enten med programvare eller maskinvare, for at programmet skal være enkelt. Vi bruker maskinvaremetoden ved å legge til avvisende kondensator.
Kondensatorene opphever effekten av sprett av knapper.
I ATMEGA er det noen måter å generere PWM på:
1. Fase riktig PWM
2. Rask PWM
Her skal vi holde alt enkelt, så vi skal bruke FAST PWM-metoden for å generere PWM-signalet.
Først velger du frekvensen til PWM, Dette avhenger vanligvis av applikasjonen, for en LED vil enhver frekvens større enn 50Hz gjøre. Av denne grunn velger vi motklokken 1MHZ. Så vi velger ingen prescalar. En prescalar er et tall som er så valgt for å få en mindre motklokke. For eksempel hvis oscillatorklokken er 8Mhz, kan vi velge en prescalar på '8' for å få en 1MHz klokke for telleren. Prescalar velges basert på frekvens. Hvis vi vil ha flere tidsperioder, må vi velge høyere prescalar.
Nå for å få FAST PWM på 50Hz klokke ut av ATMEGA, må vi aktivere de aktuelle bitene i " TCCR0 " -registeret. Dette er det eneste registeret vi trenger å bry oss for å få 8bit FAST PWM.
Her, 1. CS00, CS01, CS02 (GUL) - velg prescalar for valg av motklokke. Tabellen for passende prescalar er vist i tabellen nedenfor. Så for å forhåndsskalere en (oscillatorklokke = motklokke).
så CS00 = 1, andre to biter er null.
2. WGM01og WGM00 endres for å velge bølgeformgenereringsmodus, basert på tabellen nedenfor, for rask PWM. Vi har WGM00 = 1 og WGM01 = 1;
3. Nå vet vi at PWM er et signal med forskjellig driftsforhold eller forskjellige slå PÅ AV-tider. Inntil nå har vi valgt frekvens og type PWM. Hovedtemaet for dette prosjektet ligger i denne delen. For å få et annet arbeidsforhold, skal vi velge en verdi mellom 0 og 255 (2 ^ 8 på grunn av 8 bit). Si at vi velger en verdi 180, da telleren begynner å telle fra 0 og når verdien 180, kan utgangssvaret utløses. Denne utløseren kan være inverterende eller ikke inverterende. Det vil si at utdataene kan bli fortalt å trekke opp når de når tellingen, eller det kan bli fortalt at de blir trukket ned når de når tellingen.
Dette valget av å trekke opp eller ned er valgt av CM00 og CM01 bits.
Som vist i tabellen, for at utgangen skal gå høyt når du sammenligner, og utdataene vil forbli høye til maksimumsverdien (som vist i figuren nederst). Vi må velge inverteringsmodus for å gjøre det, så COM00 = 1; COM01 = 1.
Som vist i figuren nedenfor, er OCR0 (Output Compare Register 0) byten som lagrer den valgte brukerverdien. Så hvis vi endrer OCR0 = 180, utløser kontrolleren endringen (høy) når telleren når 180 fra 0.
Nå for å variere lysstyrken på LED, må vi endre DUTY RATIO av PWM-signal. For å endre pliktforholdet, må vi endre OCR0-verdien. Når vi endrer denne verdien av OCR0, tar telleren annen tid å nå OCR0. Så kontrolleren trekker utgangen høyt til forskjellige tider.
Så for PWM med forskjellige driftssykluser, må vi endre OCR0-verdien.
I krets har vi to knapper. Én knapp er for å øke OCR0-verdien og så DUTY RATIO for PWM-signal, den andre er for å redusere OCR0-verdien og så DUTY RATIO for PWM-signalet.