- PWM kaiščiai „AVR“ mikrovaldiklyje „Atmega16“
- Kas yra PWM signalas?
- Būtini komponentai
- Grandinės schema
- „Atmega16“ programavimas PWM
Pulso pločio moduliacija (PWM) yra galinga technika, kai impulso plotis keičiamas išlaikant pastovų dažnį. Ši technika šiandien naudojama daugelyje valdymo sistemų. PWM taikymas nėra ribojamas ir jis naudojamas įvairiose srityse, tokiose kaip variklio greičio valdymas, matavimas, galios valdymas ir ryšys ir kt. PWM technikoje galima lengvai generuoti analoginį išėjimo signalą naudojant skaitmeninius signalus. Ši pamoka padės jums suprasti PWM, jo terminologiją ir kaip mes galime ją įgyvendinti naudodami mikrovaldiklį. Šioje pamokoje mes parodysime PWM su AVR Atmega16 mikrovaldikliu, keisdami šviesos diodo intensyvumą.
Norėdami išsamiai suprasti PWM pagrindus, eikite į ankstesnes PWM pamokas su įvairiais mikrovaldikliais:
- „ARM7-LPC2148 PWM“ pamoka: LED ryškumo valdymas
- Impulso pločio moduliacija (PWM) naudojant MSP430G2: LED ryškumo valdymas
- PWM generavimas naudojant PIC mikrovaldiklį su MPLAB ir XC8
- Impulso pločio moduliacija (PWM) sistemoje STM32F103C8: nuolatinės srovės ventiliatoriaus greičio valdymas
- PWM signalų generavimas ant PIC mikrovaldiklio GPIO kaiščių
- „Raspberry Pi PWM“ pamoka
PWM kaiščiai „AVR“ mikrovaldiklyje „Atmega16“
„Atmega16“ turi keturis specialius PWM kaiščius. Šie kaiščiai yra PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Taip pat „ Atmega16“ turi du 8 bitų laikmačius ir vieną 16 bitų laikmatį. „Timer0“ ir „Timer2“ yra 8 bitų laikmačiai, o „Timer1“ yra 16 bitų laikmačiai. Norėdami sukurti PWM, turime turėti laikmačių apžvalgą, nes laikmačiai naudojami PWM generuoti. Kaip žinome, kad dažnis yra ciklų skaičius per sekundę, kuriuo veikia laikmatis. Taigi didesnis dažnis suteiks mums greitesnį laikmatį. Kuriant PWM, greitesnis PWM dažnis leis geriau valdyti išvestį, nes jis gali greičiau reaguoti į naujus PWM darbo ciklus.
Šioje „ Atmega16 PWM“ pamokoje naudosime „Timer2“. Galite pasirinkti bet kurį darbo ciklą. Jei nežinote, koks yra PWM darbo ciklas, aptarkime trumpai.
Kas yra PWM signalas?
Pulso pločio moduliacija (PWM) yra skaitmeninis signalas, kuris dažniausiai naudojamas valdymo grandinėse. Laikas, per kurį signalas išlieka aukštas, vadinamas „įjungimo laiku“, o laikas, per kurį signalas lieka žemas, vadinamas „išjungimo laiku“. Yra du svarbūs PWM parametrai, kaip aptarta toliau:
PWM darbo ciklas
Laiko procentas, per kurį PWM signalas lieka AUKŠTAS (laiku), vadinamas darbo ciklu.
Kaip ir 100 ms pulso signalu, jei signalas yra HIGH 50ms ir LOW 50ms, tai reiškia, kad impulsas buvo pusę laiko HIGH ir pusę laiko LOW. Taigi galime sakyti, kad darbo ciklas yra 50%. Panašiai, jei impulsas yra 25 ms HIGH būsenoje ir 75 ms LOW būsenoje iš 100 ms, tada darbo ciklas būtų 25%. Atkreipkite dėmesį, kad mes apskaičiuojame tik AUKŠTOS būsenos trukmę. Norėdami vizualiai suprasti, galite pasinaudoti žemiau esančia nuotrauka. Tada darbo ciklo formulė yra
Darbo ciklas (%) = įjungimo laikas / (įjungimo laikas + išjungimo laikas)
Taigi, keisdami darbo ciklą, galime pakeisti PWM plotį ir taip pakeisti LED ryškumą. Turėsime demonstraciją, kaip naudoti skirtingą darbo ciklą valdant šviesos diodų ryškumą. Patikrinkite demonstracinį vaizdo įrašą šios pamokos pabaigoje.
Pasirinkus darbo ciklą, kitas žingsnis būtų PWM režimo pasirinkimas. PWM režimas nurodo, kaip norite, kad PWM veiktų. Yra daugiausia 3 PWM režimų tipai. Tai yra šie:
- Greitas PWM
- Teisingas fazės PWM
- Teisingas fazės ir dažnio PWM
Greitas PWM naudojamas ten, kur fazių pakeitimas neturi reikšmės. Naudodami „Fast PWM“, galime greitai pateikti PWM reikšmes. Greitas PWM negali būti naudojamas ten, kur fazės pakeitimas veikia tokį veiksmą kaip variklio valdymas, todėl tokioje programoje naudojami kiti PWM režimai. Kadangi mes valdysime šviesos diodų ryškumą ten, kur fazių pasikeitimas neturės didelės įtakos, naudosime greitojo PWM režimą.
Dabar, norėdami generuoti PWM, mes kontroliuosime vidinį laikmatį, kad jis suskaičiuotų ir tada nustatytu skaičiumi vėl nustatytume nulį, taigi laikmatis skaičiuos ir vėl nustatys nulį. Tai nustato laikotarpį. Dabar mes turime galimybę valdyti impulsą, įjungti impulsą pagal tam tikrą laikmačio skaičių, kol jis pakyla. Kai skaitiklis grįžta į 0, išjunkite pulsą. Tai yra labai lankstus, nes visada galite pasiekti laikmačio skaičių ir pateikti skirtingus impulsus su vienu laikmačiu. Tai puiku, kai norite vienu metu valdyti kelis šviesos diodus. Dabar pradėkime susieti vieną šviesos diodą su „Atmega16“, skirtu PWM.
Čia patikrinkite visus su PWM susijusius projektus.
Būtini komponentai
- „Atmega16 AVR“ mikrovaldiklio IC
- 16Mhz kristalinis osciliatorius
- Du 100nF kondensatoriai
- Du 22pF kondensatoriai
- Paspauskite mygtuką
- Šuolių laidai
- Bandomoji Lenta
- „USBASP v2.0“
- 2 LED (bet kokios spalvos)
Grandinės schema
Mes naudojame OC2 PWM, ty Pin21 (PD7). Taigi prijunkite vieną šviesos diodą prie „Atmega16“ PD7 kaiščio.
„Atmega16“ programavimas PWM
Visa programa pateikiama žemiau. Įrašykite programą „Atmega16“ naudodami „JTAG“ ir „Atmel“ studiją ir pamatykite PWM efektą LED. Jo ryškumas lėtai didės ir mažės dėl skirtingo PWM darbo ciklo. Patikrinkite vaizdo įrašą, pateiktą pabaigoje.
Pradėkite programuoti „Atmega16“ nustatydami „Timer2 Register“. „Timer2“ registro bitai yra tokie ir mes galime atitinkamai nustatyti arba iš naujo nustatyti bitus.
Dabar aptarsime visus „Timer2“ bitus, kad galėtume gauti norimą PWM naudodami rašytinę programą.
„Timer2“ registre daugiausia yra keturios dalys:
FOC2 („Force Output Compare for Timer2“): FOC2 bitai nustatomi, kai WGM bitai nurodo ne PWM režimą.
WGM2 („Wave Generation Mode for Timer2“): Šie bitai valdo skaitiklio skaičiavimo seką, didžiausios (TOP) skaitiklio vertės šaltinį ir tai, kokio tipo bangos generavimą naudoti.
COM2 (Palyginti „Timer2“ išvesties režimą): Šie bitai kontroliuoja išvesties veikimą. Visas bitų aprašymas paaiškintas toliau.
TCCR2 - = (1 <
Norėdami suaktyvinti PWM greitąjį režimą, nustatykite WGM20 ir WGM21 bitus kaip HIGH. WGM reiškia bangų formos generavimo režimą. Pasirinkimo bitai yra tokie, kaip nurodyta toliau.
WGM00 |
WGM01 |
„Timer2“ režimo veikimas |
0 |
0 |
Normalus režimas |
0 |
1 |
CTC (išvalyti laikmatį palyginus rungtynes) |
1 |
0 |
PWM, fazė teisinga |
1 |
1 |
Greitas PWM režimas |
Norėdami gauti daugiau informacijos apie bangos formos generavimo režimą, galite rasti oficialų „Atmega16“ duomenų lapą.
TCCR2 - = (1 <
Taip pat nenaudojome jokio išankstinio mastelio keitimo, todėl laikrodžio šaltinio registrą nustatėme kaip „001“.
Laikrodžio pasirinkimo bitai yra šie:
CS22 |
CS21 |
CS20 |
apibūdinimas |
0 |
0 |
0 |
Nėra laikrodžio šaltinio (laikmatis / skaitiklis sustabdytas) |
0 |
0 |
1 |
CLK T2S / (Nėra Prescaling) |
0 |
1 |
0 |
Clk T2S / 8 (iš preskalerio) |
0 |
1 |
1 |
Clk T2S / 32 (iš preskalerio) |
1 |
0 |
0 |
Clk T2S / 64 (iš preskalerio) |
1 |
0 |
1 |
Clk T2S / 128 (iš preskalerio) |
1 |
1 |
0 |
Clk T2S / 256 (iš preskalerio) |
1 |
1 |
1 |
Clk T2S / 1024 (iš preskalerio) |
OC2 taip pat išvalomas lyginant rungtynes nustatant COM21 bitą kaip „1“ ir COM20 kaip „0“.
Žemiau pateikiamos „Fast PWM Mode“ palyginimo išvesties režimo (COM) parinktys:
COM21 |
COM21 |
apibūdinimas |
0 |
0 |
Įprastas prievado veikimas, atjungus OC2. |
0 |
1 |
Rezervuota |
1 |
0 |
Išvalykite OC2 palygindami rungtynes, nustatykite OC2 viršuje |
1 |
1 |
Nustatykite OC2 palyginimo rungtyje, išvalykite OC2 viršuje |
Padidinkite darbo ciklą nuo 0% iki 100%, taigi laikui bėgant ryškumas padidės. Paimkite vertę nuo 0 iki 255 ir nusiųskite ją į OCR2 kaištį.
už (muitas = 0; darbas <255; darbas ++) // 0 iki maksimalaus darbo ciklo { OCR2 = darbas; // lėtai didinkite šviesos diodų ryškumą _delay_ms (10); }
Panašiai sumažinkite darbo ciklą nuo 100% iki 0%, kad palaipsniui sumažintumėte šviesos diodų ryškumą.
už (muitas = 0; darbas> 255; darbas -) // maksimalus iki 0 darbo ciklo { OCR2 = darbas; // lėtai mažinkite šviesos diodų ryškumą _delay_ms (10); }
Tai baigs mūsų „ PWM“ naudojimo instrukciją „Atmega16 / 32“.