V tem projektu bomo uporabili eno od značilnosti ATmega32A za prilagoditev svetlosti 1 W LED. Za nastavitev hitrosti LED se uporablja PWM (Pulse Width Modulation). Ta vadnica PWM za mikrokrmilnik AVR podrobno razlaga koncept PWM in generiranje PWM (lahko tudi preverite to preprosto vezje generatorja PWM). Razmislite o preprostem vezju, kot je prikazano na sliki.
Če je stikalo na zgornji sliki v določenem časovnem obdobju neprekinjeno zaprto, bo žarnica v tem času neprekinjeno svetila. Če je stikalo zaprto za 8 ms in odprto za 2 ms v ciklu 10 ms, bo žarnica vklopljena šele v času 8 ms. Zdaj je povprečni terminal čez 10 ms = čas vklopa / (čas vklopa + čas izklopa), to se imenuje delovni cikel in je 80% (8 / (8 + 2)), tako da je povprečje izhodna napetost bo 80% napetosti akumulatorja.
V drugem primeru je stikalo zaprto za 5 ms in odprto za 5 ms v obdobju 10 ms, tako da bo povprečna napetost na izhodu 50% napetosti akumulatorja. Recimo, če je napetost akumulatorja 5V in je delovni cikel 50%, tako da bo povprečna napetost terminala 2,5V.
V tretjem primeru je delovni cikel 20%, povprečna napetost sponke pa 20% napetosti akumulatorja.
V ATMEGA32A imamo štiri PWM kanale, in sicer OC0, OC1A, OC1B in OC2. Tu bomo uporabili OC0 PWM kanal za spreminjanje svetlosti LED.
Potrebne komponente
Strojna oprema:
Mikrokrmilnik ATmega32
Napajanje (5v)
Programer AVR-ISP
Kondenzator 100uF, 1W LED
TIP127 tranzistor
Gumbi (2 kosa)
100nF (104) kondenzator (2 kosa), Upori 100Ω in 1kΩ (2 kosa).
Programska oprema:
Atmel studio 6.1
Progisp ali flash magija
Shema vezja in delovna razlaga
Zgornja slika prikazuje shemo vezja zatemnitve LED z mikrokrmilnikom AVR (lahko preverite tudi to preprosto vezje zatemnitve LED).
V ATmegi smo za štiri PWM kanale določili štiri nožice. Izhod PWM lahko sprejemamo samo na teh zatičih. Ker smo z PWM0 moramo vzeti PWM signala na OC0 pin (PORTB 3 rd PIN). Kot je prikazano na sliki, povezujemo dno tranzistorja z zatičem OC0 za pogon napajalne LED. Tu je še ena stvar pri štirih PWM kanalih, dva sta 8-bitna PWM kanala. Tu bomo uporabili 8-bitni PWM kanal.
Na vsak gumb je priključen kondenzator, da se izognete odbijanju. Vsakič, ko pritisnete gumb, se na zatiču zasliši nekaj zvoka. Čeprav se ta hrup ustali v milisekundah. Za krmilnik ostri vrhovi pred stabilizacijo delujejo kot sprožilci. Ta učinek je mogoče odpraviti s programsko ali strojno opremo, da je program enostaven. Uporabljamo strojno metodo z dodajanjem razbremenilnega kondenzatorja.
Kondenzatorji izničijo učinek poskakovanja gumbov.
V ATMEGA obstaja nekaj načinov za ustvarjanje PWM, in sicer:
1. Fazna korekcija PWM
2. Hiter PWM
Tu bomo naredili vse preprosto, zato bomo uporabili metodo FAST PWM za generiranje PWM signala.
Najprej izberemo frekvenco PWM. To je običajno odvisno od aplikacije, če bi LED uporabili katero koli frekvenco, večjo od 50 Hz. Iz tega razloga izberemo števec ur 1MHZ. Torej ne izbiramo nobenega predkalarja. Predkalar je številka, ki je izbrana tako, da dobimo manjši števec ur. Na primer, če je takt oscilatorja 8 MHz, lahko izberemo preskalnik '8', da dobimo 1MHz uro za števec. Predkalar se izbere glede na frekvenco. Če želimo več impulzov v časovnem obdobju, moramo izbrati višji predkalar.
Zdaj, da iz ATMEGA izvlečemo FAST PWM s 50 Hz ure, moramo v registru “ TCCR0 ” omogočiti ustrezne bite. To je edini register, ki ga moramo skrbeti za pridobivanje 8-bitnega FAST PWM.
Tukaj, 1. CS00, CS01, CS02 (RUMENA) - izberite preskala za izbiro števca. Tabela ustreznih predkalarjev je prikazana v spodnji tabeli. Torej za predkaliranje ene (oscilator ura = števec).
torej CS00 = 1, druga dva bita sta nič.
2. WGM01 in WGM00 sta spremenjena tako, da izbereta načina generiranja valovnih oblik na podlagi spodnje tabele za hitri PWM. Imamo WGM00 = 1 in WGM01 = 1;
3. Zdaj vemo, da je PWM signal z drugačnim razmerjem obratovanja ali različnimi časi vklopa in izklopa. Do zdaj smo izbirali frekvenco in vrsto PWM. Glavna tema tega projekta je v tem poglavju. Za pridobitev drugačnega razmerja dajatev bomo izbrali vrednost med 0 in 255 (2 ^ 8 zaradi 8 bitov). Recimo, da izberemo vrednost 180, saj števec začne šteti od 0 in doseže vrednost 180, se lahko sproži izhodni odziv. Ta sprožilec je lahko obračalni ali neobratni. To pomeni, da se lahko pri doseganju štetja izpiše, ali naj se potegne navzdol, ko dosežemo štetje.
To izbiro vlečenja navzgor ali navzdol izberejo bit CM00 in CM01.
Kot je prikazano v tabeli, se bo rezultat pri primerjavi primerjal visoko, rezultat pa bo ostal visok do največje vrednosti (kot je prikazano na sliki spodaj). Za to moramo izbrati način invertiranja, zato je COM00 = 1; COM01 = 1.
Kot je prikazano na spodnji sliki, je OCR0 (Output Compare Register 0) bajt, ki shrani uporabniško izbrano vrednost. Torej, če spremenimo OCR0 = 180, krmilnik sproži spremembo (visoko), ko števec doseže 180 od 0.
Zdaj za spreminjanje svetlosti LED moramo spremeniti DUTY RATIO OF PWM signala. Če želimo spremeniti razmerje dajatev, moramo spremeniti vrednost OCR0. Ko spremenimo to vrednost OCR0, števec potrebuje drugačen čas, da doseže OCR0. Torej krmilnik v različnih časih potegne izhod visoko.
Za PWM različnih delovnih ciklov moramo spremeniti vrednost OCR0.
V vezju imamo dva gumba. Eden gumb je za povečanje vrednosti OCR0 in tako DUTY RATIO PWM signala, drugi pa za zmanjšanje OCR0 vrednosti in tako DUTY RATIO PWM signala.