- PWM csapok az AVR mikrokontroller Atmega16-ban
- Mi az a PWM jel?
- Szükséges alkatrészek
- Kördiagramm
- Az Atmega16 programozása a PWM számára
Az impulzusszélesség-moduláció (PWM) egy erőteljes technika, ahol az impulzus szélességét a frekvencia állandó tartásával változtatják meg. A technikát manapság számos vezérlőrendszerben alkalmazzák. Az alkalmazás a PWM nem korlátozott, és ez használt széles körben alkalmazható, mint a motor fordulatszám-szabályozás, mérés, teljesítmény vezérlő és kommunikációs stb PWM-eljárás, egy könnyen generál analóg kimeneti jelet használ a digitális jelek. Ez az oktatóanyag segít megérteni a PWM-et, annak terminológiáját és miként tudjuk azt mikrokontrollerrel megvalósítani. Ebben az oktatóanyagban bemutatjuk a PWM-et az AVR Atmega16 mikrovezérlővel egy LED intenzitásának változtatásával.
A PWM alapjainak részletes megértéséhez keresse fel a PWM-ről szóló korábbi oktatóanyagainkat különböző mikrovezérlőkkel:
- ARM7-LPC2148 PWM oktatóanyag: A LED fényerejének szabályozása
- Pulzusszélesség-moduláció (PWM) az MSP430G2 segítségével: A LED fényerejének szabályozása
- PWM előállítása PIC mikrokontrollerrel MPLAB és XC8 segítségével
- Impulzusszélesség-moduláció (PWM) az STM32F103C8-ban: Az egyenáramú ventilátor sebességének szabályozása
- PWM jelek generálása a PIC mikrokontroller GPIO csapjain
- Raspberry Pi PWM bemutató
PWM csapok az AVR mikrokontroller Atmega16-ban
Az Atmega16 négy dedikált PWM tűvel rendelkezik. Ezek a csapok PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Az Atmega16 két 8 bites és egy 16 bites időzítővel is rendelkezik. A Timer0 és a Timer2 8 bites időzítők, míg az Timer1 16 bites időzítő. A PWM előállításához áttekintéssel kell rendelkeznünk az időzítőkről, mivel az időzítőket használják a PWM előállításához. Mint tudjuk, hogy a frekvencia az másodpercenkénti ciklusok száma, amelyen az időzítő fut. Tehát a magasabb frekvencia gyorsabb időzítőt ad nekünk. A PWM előállításakor a gyorsabb PWM frekvencia finomabb ellenőrzést biztosít a kimenet felett, mert gyorsabban tud reagálni az új PWM munkaciklusokra.
Ebben az Atmega16 PWM oktatóanyagban a Timer2-t fogjuk használni. Bármely működési ciklust választhat. Ha nem tudja, mi az a munkakör a PWM-ben, akkor beszéljünk röviden.
Mi az a PWM jel?
Az impulzusszélesség-moduláció (PWM) egy digitális jel, amelyet leggyakrabban a vezérlő áramkörökben használnak. Azt az időtartamot, amely alatt a jel magas marad, „bekapcsolási időnek” nevezzük, és azt az időt, amely alatt a jel alacsony marad, „kikapcsolási időnek”. A PWM-nek két fontos paramétere van, az alábbiak szerint:
A PWM munkaciklusa
Az az idő százalékos aránya, amelyben a PWM jel HIGH marad (időben), ciklusnak számít.
A 100 ms-os impulzusjelhez hasonlóan, ha a jel HIGH 50 ms-ig és LOW 50 ms-ig, ez azt jelenti, hogy az impulzus félig HIGH és félig LOW volt. Tehát azt mondhatjuk, hogy az üzemi ciklus 50%. Hasonlóképpen, ha az impulzus 100 ms-ból 25 ms HIGH állapotban és 75 ms LOW állapotban van, akkor a munkaciklus 25% lenne. Vegye figyelembe, hogy csak a HIGH állapot időtartamát számoljuk ki. A vizuális megértés érdekében hivatkozhat az alábbi képre. A munkaciklus képlete ekkor:
Üzemidő (%) = Bekapcsolási idő / (Bekapcsolási idő + Kikapcsolási idő)
Tehát az üzemi ciklus megváltoztatásával megváltoztathatjuk a PWM szélességét, ezáltal megváltoztatva a LED fényerejét. Bemutatjuk, hogy a LED fényerejének szabályozásához különböző munkaciklusokat használunk. Ellenőrizze a bemutató videót a bemutató végén.
Az üzemi ciklus kiválasztása után a következő lépés a PWM mód kiválasztása. A PWM mód megadja, hogy hogyan szeretné a PWM működését. Főleg 3 típusú PWM mód van. Ezek a következők:
- Gyors PWM
- Fázis helyes PWM
- Fázis és frekvencia helyes PWM
Gyors PWM- et használnak, ahol a fázisváltás nem számít. A Fast PWM használatával gyorsan kiadhatjuk a PWM értékeket. A gyors PWM nem használható, ha a fázisváltás hatással van a működésre, például a motor vezérlésére, ezért ilyen alkalmazásban a PWM más módjait is használják. Mivel a LED fényerejét ott fogjuk szabályozni, ahol a fázisváltás nem sokat fog befolyásolni, ezért a Fast PWM módot fogjuk használni.
Most a PWM előállításához vezéreljük a belső időzítőt, hogy számláljon, majd nullára állítson egy adott számláláskor, így az időzítő számolni fog, majd újra és újra nullára áll. Ez határozza meg az időszakot. Most lehetőségünk van egy impulzus vezérlésére, az impulzus ON bekapcsolására az időzítő meghatározott számával, miközben az felfelé megy. Amikor a számláló 0-ra tér vissza, kapcsolja ki az impulzust. Nagy rugalmasság van ezzel, mert mindig hozzáférhet az időzítő számához, és egyetlen impulzussal különböző impulzusokat adhat meg. Ez nagyszerű, ha egyszerre több LED-et akar vezérelni. Most kezdjük el összekapcsolni az egyik LED-et az Atmega16-tal a PWM számára.
Itt tekintheti meg az összes PWM-mel kapcsolatos projektet.
Szükséges alkatrészek
- Atmega16 AVR mikrokontroller IC
- 16Mhz kristályoszcillátor
- Két 100nF kondenzátor
- Két 22pF kondenzátor
- Nyomógomb
- Jumper huzalok
- Kenyérlemez
- USBASP v2.0
- 2 Led (bármilyen színű)
Kördiagramm
Az OC2-t használjuk a PWM-hez, azaz a Pin21-et (PD7). Csatlakoztasson tehát egy LED-et az Atmega16 PD7 tűjéhez.
Az Atmega16 programozása a PWM számára
A teljes program alább található. Írd le a programot az Atmega16-ban a JTAG és az Atmel stúdió segítségével, és nézd meg a PWM effektust a LED-en. Fényereje lassan növekszik és csökken a PWM változó munkaciklusa miatt. Ellenőrizze a végén megadott videót.
Indítsa el az Atmega16 programozását a Timer2 Register beállításával. A Timer2 regiszterbitek a következők, és ennek megfelelően beállíthatjuk vagy visszaállíthatjuk a biteket.
Most megvitatjuk a Timer2 összes bitjét, így írásos program segítségével megszerezhetjük a kívánt PWM-et.
A Timer2 regiszterben főleg négy rész van:
FOC2 (Force Output Compare for Timer2): Az FOC2 bit akkor lesz beállítva, ha a WGM bitek nem PWM módot határoznak meg.
WGM2 (Wave Generation Mode for Timer2): Ezek a bitek vezérlik a számláló számlálási sorrendjét, a maximális (TOP) számláló értékét és azt, hogy milyen típusú hullámforma generálást kell használni.
COM2 (a Timer2 kimeneti módjának összehasonlítása): Ezek a bitek vezérlik a kimeneti viselkedést. Az alábbiakban a teljes bites leírást ismertetjük.
TCCR2 - = (1 <
Állítsa a WGM20 és WGM21 biteket HIGH értékre a PWM Fast Mode aktiválásához. A WGM a hullámforma-előállítási módot jelenti. A kiválasztó bitek az alábbiak.
WGM00 |
WGM01 |
Timer2 mód működése |
0 |
0 |
Normál mód |
0 |
1 |
CTC (Időzítő törlése a mérkőzés összehasonlításakor) |
1 |
0 |
PWM, fázis helyes |
1 |
1 |
Gyors PWM mód |
A hullámforma létrehozási módjáról az Atmega16 hivatalos adatlapján olvashat.
TCCR2 - = (1 <
Emellett nem használtunk előméretezést, ezért az Óra forrásregisztert '001' -nek állítottuk be.
Az Óra kiválasztó bitek a következők:
CS22 |
CS21 |
CS20 |
Leírás |
0 |
0 |
0 |
Nincs órajelforrás (az időzítő / számláló leállt) |
0 |
0 |
1 |
clk T2S / (nincs előméretezés) |
0 |
1 |
0 |
Clk T2S / 8 (Prescaler-től) |
0 |
1 |
1 |
Clk T2S / 32 (Prescaler-től) |
1 |
0 |
0 |
Clk T2S / 64 (Prescaler-től) |
1 |
0 |
1 |
Clk T2S / 128 (Prescaler-től) |
1 |
1 |
0 |
Clk T2S / 256 (a Prescaler-től) |
1 |
1 |
1 |
Clk T2S / 1024 (Prescaler-től) |
Az OC2 is törlődik az összehasonlító egyezésen úgy, hogy a COM21 bitet „1” -nek, a COM20 bitet pedig „0” -nak állítja be.
A Kimeneti mód összehasonlítása (COM) választási lehetőségek a gyors PWM módhoz az alábbiak:
COM21 |
COM21 |
Leírás |
0 |
0 |
Normál port működés, OC2 lekapcsolva. |
0 |
1 |
Fenntartott |
1 |
0 |
Törölje az OC2-t az Összehasonlít, az OC2-t állítsa a tetején |
1 |
1 |
Állítsa be az OC2-t az összehasonlító mérkőzésen, törölje az OC2-t a TOP-on |
Növelje az üzemi ciklust 0% -ról 100% -ra, így a fényerő az idő múlásával növekszik. Vegyünk 0–255 értéket, és küldjük el az OCR2 tűre.
for (szolgálat = 0; terhelés <255; terhelés ++) // 0 - a maximális munkaciklusig { OCR2 = terhelés; // lassan növelje a LED fényerejét _delay_ms (10); }
Hasonlóképpen csökkentse az üzemi ciklust 100% -ról 0% -ra, hogy fokozatosan csökkentse a LED fényerejét.
for (szolgálat = 0; szolgálat> 255; terhelés--) // max. 0 munkaciklus { OCR2 = szolgálat; // lassan csökkenti a LED fényerejét _delay_ms (10); }
Ezzel befejezzük az oktatóanyagunkat a PWM használatáról az Atmega16 / 32-ben.