itthon / Közösségi média / Shim megvalósítása megszakítással. Szoftver PWM (PWM). A PWM szoftveres megvalósítása

Shim megvalósítása megszakítással. Szoftver PWM (PWM). A PWM szoftveres megvalósítása

A digitális eszközök, például egy mikrokontroller csak két jelszinttel tud működni, pl. nulla és egy vagy ki és be. Így egyszerűen használhatja a terhelés állapotának figyelésére, például egy LED be- vagy kikapcsolására. Bármilyen elektromos eszköz vezérlésére is használható a megfelelő meghajtók segítségével (tranzisztor, triac, relé, stb.) De néha többre van szükség, mint az eszköz „bekapcsolására” és „kikapcsolására”. Tehát ha egy LED (vagy lámpa) fényerejét vagy egy egyenáramú motor sebességét szeretné szabályozni, akkor a digitális jelek egyszerűen nem tudják ezt megtenni. Ez a helyzet nagyon gyakori a digitális technológiában, és ún Impulzusszélesség-moduláció (PWM).

Szinte minden modern mikrokontroller rendelkezik speciális hardverrel a PWM jel generálására. Ebben az oktatóanyagban megtanuljuk a PWM-technika alapjait, majd később látni fogjuk, hogyan valósítsuk meg a PWM-et AVR mikrokontrollerekkel.

Az olyan digitális eszközök, mint a mikrokontroller, csak két szintet tudnak generálni a kimeneti vonalakon, magas = 5 V és alacsony = 0 V. De mi van akkor, ha 2,5 vagy 3,1 vagy bármilyen 0-5 V közötti feszültséget szeretnénk kapni? Ehhez ahelyett, hogy állandó egyenfeszültséget generálnánk a kimeneten, négyszöghullámot generálunk, amelynek magas = 5 V és alacsony = 0 V szintje van (lásd 1. ábra).

1. ábra

Az ábra azt mutatja, hogy a jel felváltva alacsony és magas szinten marad egy ideig. T0 - alacsony szint, T1 - magas szint. A jel időtartama egyenlő lesz T = T0+T1. Pulzus periódus- ez az időintervallum két szomszédos impulzus két jellemző pontja között. Általában az időszakot a szomszédos impulzusok két emelkedése vagy csökkenése között mérik, és nagy T betűvel jelölik.

Az impulzusismétlési periódus közvetlenül összefügg az impulzussorozat frekvenciájával, és a következő képlettel számítható ki: T = 1/F

Ha a T1 impulzushossz pontosan egyenlő a T periódus felével, akkor az ilyen jelet gyakran „négyzethullámnak” nevezik.

Az impulzusok munkaciklusa az impulzusismétlési periódus és az időtartam aránya, és S betűvel jelöljük: S = T/T1

Az igénybevételi tényező egy dimenzió nélküli mennyiség, és nincs mértékegysége, de százalékban kifejezhető. A kifejezés gyakran megtalálható az angol szövegekben Üzemi ciklus, ez az úgynevezett munkaciklus vagy PWM munkaciklus értéke. A D munkaciklus a munkaciklus reciproka.

Kitöltési tényezőáltalában százalékban fejezik ki és a következő képlettel számítják ki: D=1/S vagy úgy D = T1/T*100%

A fenti ábrán (1. ábra) látható, hogy T1 = T0, ez egyenlő az időtartam felével. Tehát a PWM munkaciklusa 50%. Ha az ilyen impulzusok frekvenciája elég magas (mondjuk 5000 Hz), akkor az 5V felét kapjuk, azaz. 2,5V. Így, ha a vezérlő kimenete a motorhoz van kapcsolva (megfelelő meghajtók használatával), akkor a teljes fordulatszám 50%-án fog működni. A PWM technika ezt a tényt arra használja, hogy bármilyen feszültséget hozzon létre két szint között (például 0-12 V között). A trükk az, hogy amikor a munkaciklus értéke 0-100% között változik, akkor a bemeneti feszültség azonos százalékát kapjuk a kimeneten. Az alábbiakban bemutatunk néhány példát a különböző munkaciklusú PWM jelekre.

Ha R/C szűrőt telepít a kimenetre, akkor a négyszöghullámok helyett tiszta DC jelszintet kaphat. Ez azonban nem szükséges a kefés motorokhoz vagy a LED-ek fényerejének szabályozásához. Ehhez közvetlenül a meghajtóra (például bipoláris tranzisztorra, MOSFET-re stb.) alkalmazhat PWM jelet.


16 bites működési mód alatt. Az időzítő alatt a számláló algoritmusát és a hozzá tartozó impulzusformáló kimenet viselkedését értjük, amelyet az időzítő működési módját (WGMn3-0) és a kimeneti jel generálási módját (COMnx1:0) meghatározó bitek kombinációja határoz meg. . Ebben az esetben a kimeneti jel generálási mód beállítására szolgáló bitek nem befolyásolják a számláló algoritmust, mert A számláló algoritmus csak az időzítő üzemmód beállításához szükséges bitek állapotától függ. PWM módokban a COMnx1:0 bitek lehetővé teszik az inverzió engedélyezését/letiltását a generált PWM kimeneten (azaz válassza ki a PWM inverzióval vagy PWM inverzió nélkül). Nem PWM módok esetén a COMnx1:0 bitek határozzák meg, hogy mit kell tenni egyezés esetén: alaphelyzetbe állítani, beállítani vagy megfordítani a kimenetet (lásd még „Kimeneti jel kondicionáló blokk” és „16 bites időzítő-számláló időzítési diagramok”). .

Normál működés

A legegyszerűbb működési mód a normál üzemmód (WGMn3-0 = 0b0000). Ebben az üzemmódban a számláló összegző (növekvő) számlálóként működik, és a számláló nem nullázódik. A számláló túlcsordul, amikor áthalad a maximális 16 biten. értéket (0xFFFF) az alsó számlálási határig (0x0000). Normál működés közben az időzítő-számláló TOVn túlcsordulási jelzője ugyanarra az óraciklusra lesz beállítva, amikor a TCNTn eléri a nullát.

Valójában a TOVn túlcsordulás jelzője az időzítő számlálójának 17. bitje, kivéve, hogy csak be van állítva, és nem törlődik. Ez a tulajdonság azonban programozottan használható az időzítő felbontásának növelésére egy időzítő túlcsordulási megszakítás használatával, amelyre a TOVn jelző automatikusan visszaáll. A normál működéshez nincsenek különleges helyzetek, így bármikor új mérőállapot rögzíthető.

Normál módban használhatja a rögzítési blokkot. Biztosítani kell azonban, hogy a külső események bekövetkezése közötti maximális időintervallum ne haladja meg a számláló túlcsordulási időszakát. Ha ez a feltétel nem teljesül, akkor időzítő-számláló túlcsordulási megszakítást vagy előskálázót kell használni.

Az összehasonlító blokk használható megszakítások generálására. Nem ajánlott az OCnx kimenetet normál üzemben jelek generálására használni, mert ebben az esetben a processzoridő jelentős részét el kell tölteni.

Match timer reset mode (CTC)

CTC módban (WGM01, WGM00 =0b10) az OCR0 regisztert használják a számláló felbontásának beállítására. Ha a CTC mód be van állítva, és a számláló értéke (TCNT0) megegyezik az OCR0 regiszter értékével, a számláló nullázódik (TCNT0=0). Így az OCR0 meghatározza a számláló felső számát, és ennek következtében a felbontását. Ez a mód a generált téglalap alakú impulzusok frekvenciájának szélesebb beállítási tartományát biztosítja. Leegyszerűsíti a külső eseményszámláló működését is.

Az időzítő visszaállítása egyeztetési módban (WGMn3-0 = 0b0100 vagy 0b1100) az időzítő felbontását az OCRnA vagy ICRn regiszterek állítják be. CTC módban a számláló (TCNTn) alaphelyzetbe áll, ha értéke megegyezik az OCRnA regiszter (WGMn3-0 = 0b0100) vagy az ICRn (WGMn3-0 = 0b1100) értékével. Az OCRnA vagy ICRn regiszter értéke határozza meg a számlálás felső határát, így az időzítő felbontását. Ez a mód a generált téglalap alakú impulzusok frekvenciájának szélesebb beállítási tartományát biztosítja. Leegyszerűsíti a külső eseményszámláló működését is. Az 1. ábrán látható az időzítő működésének idődiagramja CTC módban. A számláló (TCNTn) addig növeli állapotát, amíg egyezés nem következik be az OCRnA vagy ICRn értékével, majd a számláló (TCNTn) nullázódik.

1. ábra – STS mód időzítési diagramja

A felső számlálási határ elérésekor megszakítás generálható az OCFnA vagy ICFn jelzők segítségével, amelyek megfelelnek a felső számlálási korlát beállításához használt regisztereknek. Ha a megszakítás engedélyezve van, akkor a megszakítási rutin használható a szám felső határának frissítésére. A számláló felső értékének a számláló alsó határértékéhez közeli beállítását azonban, ha a számláló előskálázás nélkül vagy kis előskálával működik, rendkívül óvatosan kell végezni, mert CTC módban nincs kettős pufferelés. Ha az OCRnA-ba vagy ICRn-be írt érték kisebb, mint a TCNTn aktuális értéke, a számláló alaphelyzetbe áll, amikor az egyezési feltétel bekövetkezik, amikor eléri a maximális értéket (0xFFFF), majd visszaáll 0x0000-re, és eléri az OCRnA vagy ICRn új értékét. Sok esetben ez a helyzet nem kívánatos. Alternatív megoldás a gyors PWM mód, ahol az OCRnA regiszter határozza meg a szám felső határát (WGMn3-0 = 0b1111), mert ebben az esetben az OCRnA duplán pufferelt.

Jel generálásához CTC módban az OCnA kimenet felhasználható a logikai szint megváltoztatására minden egyes mérkőzésen a kapcsolási mód beállításával (COMnA1, COMnA0 = 0b01). Az OCnA érték csak akkor lesz jelen a porton, ha a kimeneti irány meg van adva az adott érintkezőhöz. A generált jel maximális frekvenciája fOC0 = fclk_I/O/2, ha OCRnA = 0x0000. Más OCRn értékek esetén a generált jel frekvenciája a következő képlettel határozható meg:

ahol az N változó az előskálázó osztási tényezőjét adja meg (1, 8, 32, 64, 128, 256 vagy 1024).

A normál működéshez hasonlóan a TOV0 jelző is ugyanarra az időzítőre van beállítva, amikor értéke 0xFFFF-ről 0x0000-re változik.

Gyors PWM mód

A gyors impulzusszélesség-modulációs (PWM) módot (WGMn3-0 = 0b0101, 0b0110, 0b0111, 0b1110, 0b1111) úgy tervezték, hogy megnövelt frekvenciájú PWM-impulzusokat hozzon létre. Más üzemmódoktól eltérően ez egyirányú számlálóműködést használ. A számlálás az alsó számlálási határtól a felső határig történik.

Ha nem invertáló kimeneti mód van beállítva, akkor amikor a TCNTn és az OCRnx egybeesik, az OCnx jel beállítása és alaphelyzetbe áll a számlálás felső határán. Ha az invertáló mód meg van adva, az OCnx kimenet visszaállításra kerül, és a magas számlálókorlátra állítja. Az egyirányú számlálás miatt ennek az üzemmódnak a működési frekvenciája kétszer olyan magas, mint a fáziskorrekciós PWM üzemmódban, ahol kétirányú számlálást alkalmaznak. A nagyfrekvenciás PWM-jelek generálásának képessége hasznossá teszi ennek az üzemmódnak a használatát a teljesítménystabilizálás, az egyenirányítás és a digitális-analóg átalakítás során. A nagy frekvencia ugyanakkor lehetővé teszi a fizikailag kis méretű külső elemek (induktorok, kondenzátorok) használatát, ezáltal csökkentve a rendszer összköltségét.

A PWM felbontás fix 8, 9 vagy 10 bites, vagy beállítható az ICRn vagy OCRnA regiszterrel, de nem kevesebb, mint 2 bit (ICRn vagy OCRnA = 0x0003) és legfeljebb 16 bit (ICRn vagy OCRnA = 0xFFFF). A PWM felbontást egy adott felső határértéknél (UL) a következőképpen számítjuk ki:

Gyors PWM módban a számláló addig növekszik, amíg az értéke meg nem egyezik a 0x00FF, 0x01FF vagy 0x03FF rögzített értékek egyikével (ha WGMn3:0 = 0b0101, 0b0110 vagy 0b0111), az ICRn értékével (ha WGMn3:0 = 0 0b1110) vagy az OCRnA értékét (ha WGMn3:0 = 0b1111), majd állítsa vissza az időzítő következő órájával. A gyors PWM mód időzítési diagramja a 2. ábrán látható. Az ábra a gyors PWM módot mutatja, amikor az OCRnA vagy ICRn regisztert használják a felső határ beállítására. Az idődiagram TCNTn értéke függvénygrafikonként jelenik meg az egyirányú számlálás szemléltetésére. A diagram az invertált és nem invertált PWM kimeneteket egyaránt mutatja. Egy rövid vízszintes vonal a TCNTn grafikon azon pontjait mutatja, ahol az OCRnx és a TCNTnx értékek egybeesnek. Az OCnx megszakítási jelző egyezés esetén kerül beállításra.

2. ábra – A gyors PWM mód időzítési diagramja

Az időzítő-számláló túlcsordulás (TOVn) jelzője akkor kerül beállításra, amikor a számláló eléri a felső határt. Ezenkívül ugyanaz az órajel impulzus a TOVn jelzővel együtt beállíthatja az OCnA vagy ICFn jelzőket, ha az OCRnA vagy ICRn regisztert használják a felső határ beállítására. Ha ezen megszakítások egyike engedélyezett, a megszakítási rutin frissítheti a felső számlálási határt és az összehasonlítási küszöbértékeket.

Ha a szám felső határértéke megváltozik, akkor annak a feltételnek kell teljesülnie, hogy az új felső határérték nagyobb vagy egyenlő legyen, mint az összes összehasonlítási küszöbregiszterben található érték. Ellenkező esetben a TCNTn és az OCRnx között soha nem lesz egyezés. Vegye figyelembe, hogy rögzített felső határértékek használatakor a fel nem használt bitek 0-ra vannak maszkolva, amikor az OCRnx regiszterekbe írnak.

Az ICRn regiszter módosítási mechanizmusa eltér az OCRnA-tól, ha azt a felső határ beállítására használják. Az ICRn regiszter nem dupla pufferelt. Ez azt jelenti, hogy ha egy kis értéket írunk be az ICRn-be, miközben a számláló csekély vagy semmilyen előskálázással fut, fennáll annak a veszélye, hogy az ICRn regiszterbe olyan értéket írunk, amely kisebb, mint a TCNTn aktuális értéke. Ennek eredményeként ebben a helyzetben a szám élén álló mérkőzés elmarad. Ebben az esetben a számláló eléri a maximális értékét (0xFFFF), újraindul 0x0000-nél, és csak ezután generál egyezést. Az OCRnA regiszter kettős pufferelési sémát tartalmaz, így bármikor módosítható.

class="eliadunit">

Ha írás történik az OCRnA címre, az érték ténylegesen az OCRnA pufferregiszterbe kerül. Ha egyezés történik a TCNTn és a számlálás csúcsa között, akkor az időzítő következő óraciklusa a pufferregiszter átmásolása az OCRnA összehasonlítási küszöbregiszterbe. A regiszter frissítése ugyanabban az óraciklusban történik, amikor a TCNTn alaphelyzetbe áll és a TOVn jelző beáll.

Javasoljuk, hogy az ICRn regiszterrel állítsa be a felső határt, ha a szám felső határa állandó. Ebben az esetben az OCRnA regiszter is felszabadul, hogy PWM jelet generáljon az OCnA kimeneten. Ha azonban a PWM frekvencia dinamikusan változik (a felső határ változása miatt), akkor ebben az esetben előnyösebb az OCRnA regisztert használni a felső határ beállításához, mert támogatja a dupla pufferelést.

Gyors PWM módban az összehasonlító egységek lehetővé teszik PWM jelek generálását az OCnx lábakon. Ha COMnx1:0 = 0b10, akkor a PWM kimenet inverzió nélkül van beállítva, ha pedig COMnx1:0 = 0b11, akkor a PWM mód kimenet inverzióval van beállítva (lásd 59. táblázat). A tényleges OCnx érték a port tűjén figyelhető meg, ha az kimeneti irányra (DDR_OCnx) van beállítva. A PWM jelet az OCnx regiszter beállításával (visszaállításával) állítják elő, amikor az OCRnx és a TCNTn között egyezés történik, valamint az OCnx regiszter alaphelyzetbe állításával (beállításával) a számláló nullázásával együtt (a felső határról az alsó határra váltás).

A kimeneti jel PWM frekvenciáját egy adott felső határértékhez (UL) a következő kifejezés határozza meg:

ahol N egy olyan változó, amely az előreosztási együttható értékét adja meg (1, 8, 32, 64, 128, 256 vagy 1024).

A határértékek írása az OCRnx regiszterbe a PWM impulzusok generálásának speciális eseteihez kapcsolódik. Ha az OCRnx értéke egyenlő az alsó határértékkel (0x0000), akkor az időzítő minden (VP+1) órajelciklusában egy rövid impulzus jelenik meg a kimeneten. Ha a felső határértékkel egyenlő értéket ír az OCRnx-be, az állandó naplózási szint beállítását eredményezi. 1 vagy 0 a kimeneten (a COMnx1:0 bittel kiválasztott kimeneti jel polaritásától függően).

Ha nagyfrekvenciás négyszöghullám generálásra van szükség (téglalap alakú impulzusok 2 vagy 50%-os kitöltési tényezővel), akkor a gyors PWM módot kell használni a COMnA1:0 = 0b01 bitekkel, ami a logikai szintet okozza az OCnA kimenetet, hogy minden meccsnél váltson (invertáljon). Ez csak akkor alkalmazható, ha az OCRnA-t használja a felső határ beállításához (WGMn3-0 =0b1111). A maximális generált négyszöghullám frekvencia ebben az esetben fOCnA = fclk_I/O/2, ha OCRnA = 0x0000. Ez a funkció hasonló az OCnA kapcsoláshoz CTC módban, kivéve a dupla pufferelést, amely gyors PWM módban jelen van.

Impulzusszélesség-modulációs mód fáziskorrekcióval (Phase Correct)

A fáziskorrigált impulzusszélesség-modulációs (PWM FC) mód (WGMn3-0 = 0b0001, 0b010, 0b0011, 0b1010 vagy 0b1011) nagy felbontású, fáziskorrigált PWM jel generálására szolgál. A PWM FC mód egy időzítő számláló kétirányú működésén alapul. A számláló az alsó határtól (0x0000) a felső határig, majd a felső határtól az alsó határig visszafordul. Ha az impulzusformáló kimenet nem invertáló módra van állítva, akkor az OCnx kimenet visszaáll/beáll, amikor a TCNTn és az OCRnx értékek megegyeznek a fel/le számlálás során. Ha az invertáló kimeneti mód be van állítva, akkor éppen ellenkezőleg, a közvetlen számlálás során a beállítás megtörténik, a fordított számlálás során pedig az OCnx kimenet visszaáll. Kétirányú működés esetén a PWM jel maximális frekvenciája kisebb, mint egyirányú működés esetén, azonban olyan jellemzők miatt, mint a kétirányú működésű PWM módok szimmetriája, ezeket a módokat előnyben részesítik a hajtásvezérlési problémák megoldása során.

A PWM felbontás ebben a módban fix (8, 9 vagy 10 bites), vagy az ICRn vagy OCRnA regiszter segítségével állítható be. A minimális felbontás 2 bit (ICRn vagy OCRnA = 0x0003), a maximális pedig 16 bit (ICRn vagy OCRnA = 0xFFFF). Ha egy felső határ van megadva, akkor a PWM felbontás ebben az üzemmódban a következőképpen kerül meghatározásra:

PWM FC módban a számláló addig növekszik, amíg el nem éri a 0x00FF, 0x01FF vagy 0x03FF rögzített értékek egyikét (WGMn3-0 = 0b0001, 0b0010 vagy 0b0011 esetén), valamint egy ICRn-vel egyenlő értéket (ha WGM-n). 0 = 0b1010) vagy OCRnA (ha WGMn3 :0 = 0b1011). Továbbá a felső határ elérésekor a számláló megváltoztatja a számlálás irányát. A TCNTn értéke a felső határon marad egy időzítő óraciklusig. A PWM PC mód időzítési diagramja a 3. ábrán látható. Az ábra a PWM PC módot mutatja az OCRnA vagy ICRn regiszter használatával a felső határ beállításához. A TCNTn állapotot függvénygrafikonként ábrázoljuk a kétirányú számlálás szemléltetésére. Az ábrán a nem invertált és az invertált PWM kimenet is látható. Rövid vízszintes vonalak jelzik a TCNTn grafikon azon pontjait, ahol egyezés fordul elő az OCRnx értékkel. Az OCnx megszakítási jelző egyezés esetén kerül beállításra.

3. ábra – Időzítési diagram a PWM FC módhoz

Az időzítő-számláló túlcsordulás (TOVn) jelzője akkor kerül beállításra, amikor a számláló eléri az alsó határt. Ha az OCRnA vagy ICRn regisztert használják a felső határ beállítására, akkor az OCnA vagy ICFn jelzőt ennek megfelelően ugyanazzal az órajel impulzussal állítják be, amelynél az OCRnx regiszter a pufferregiszterből frissült (a számlálás tetején). A megszakításjelzők használhatók megszakítás generálására, amikor a számláló elér egy alsó vagy felső határt.

A felső számlálási határ értékének módosításakor gondoskodnia kell arról, hogy az nagyobb vagy egyenlő legyen, mint az összes összehasonlító regiszterben szereplő érték. Ellenkező esetben a TCNTn és az OCRnx között soha nem lesz egyezés. Vegye figyelembe, hogy rögzített felső számértékek használatakor a fel nem használt bitek nullára törlődnek az OCRnx regiszterekbe való íráskor. Az 53. ábra harmadik periódusa azt az esetet szemlélteti, amikor a felső számlálási határ dinamikus változása aszimmetrikus impulzus generálásához vezet. Ez a funkció az OCRnx regiszter frissítési idején alapul. Mivel az OCRnx frissítése a számlálás tetején történik, a PWM periódus a számlálás tetején kezdődik és ér véget. Ez azt jelenti, hogy a visszaszámlálás időtartamát az előző felső határérték, az előre számlálás időtartamát pedig az új felső határérték határozza meg. Ha ez a két érték különbözik, akkor az előre és hátrafelé történő számlálás időtartama is eltérő lesz. Az időtartam különbsége a kimeneti impulzusok aszimmetriájához vezet.

Ha a számláló működése közben a felső határ módosítása a feladat, akkor e mód helyett a PWM PFC mód (fázis- és frekvenciakorrekció) használata javasolt. Ha statikus felső határértéket használunk, akkor gyakorlatilag nincs különbség ezen üzemmódok között.

PWM FC módban az összehasonlító egységek lehetővé teszik PWM jelek generálását az OCnx érintkezőkön. Ha a COMnx1:0 = 0b10 értéket állítja be, akkor a PWM kimenet inverzió nélkül lesz, ha pedig COMnx1:0=0b11, akkor inverzióval. Az OCnx aktuális értéke a port tűjén figyelhető meg, ha az adott port érintkezőjének adatirány-regisztere kimeneti irányra (DDR_OCnx) van beállítva. A PWM jel az OCnx regiszter beállításával (visszaállításával) jön létre, amikor az OCRnx és a TCNTn értéke megegyezik a felfelé számlálás során, és az OCnx regiszter alaphelyzetbe állításával (beállításával), amikor az OCRnx és a TCNTn között egyezés van a downcount alatt. A PWM jel eredő frekvenciája PWM FC módban egy adott felső határon (UL) a következő kifejezéssel számítható ki:

A határértékek írása az OCRnx regiszterbe a PWM jelek PWM FC módban történő generálásának speciális eseteihez kapcsolódik. Ha a PWM módot inverzió nélkül állítja be, és az OCRnx-et az alsó határértékre állítja, akkor a kimenet folyamatosan naplózásra lesz állítva. 0, és ha egyenlő a felső határértékkel, akkor a napló mindig jelen van a kimeneten. 1. Inverziós PWM esetén a jelzett szinteket az ellentétes szintekkel kell helyettesíteni.

Ha megadja az OCnA használatát felső határként (WGMn3:0 = 0b1011), és a COMnA1:0 = 0b01 értéket állítja be, akkor az OCnA kimeneten négyszöghullám jön létre.

Impulzusszélesség-modulációs mód fázis- és frekvenciakorrekcióval (fázis- és frekvenciakorrekció)

Az impulzusszélesség-modulációs mód fázis- és frekvenciakorrekcióval (PWM PFC) (WGMn3-0 = 0b1000 vagy 0b1001) nagy felbontású PWM-impulzusok generálására szolgál fázis- és frekvenciakorrekcióval. A PWM FC módhoz hasonlóan a PWM FC mód is a számláló kétirányú működésén alapul. A számláló az alsó határtól (0x0000) a felső határig, majd a felső határtól az alsó határig visszafordul. Ha a nem invertáló PWM mód meg van adva, az OCnx kimenet alaphelyzetbe áll, ha egyezés történik a TCNTn és az OCRnx között a felfelé számlálás során, és be van állítva, ha egyezés történik a lefelé számlálás során. Invertáló üzemmódban a művelet fordított. A kétirányú működés az egyirányú működéshez képest alacsonyabb frekvenciák generálásával jár. A kétirányú számlálású PWM módok szimmetriája miatt azonban ezek használata előnyösebb a hajtásvezérlési feladatokban.

A fő különbség a PWM FC és a PWM FC mód között az a pillanat, amikor az OCRnx regiszter frissül az OCRnx pufferregiszterből (lásd a 3. és 4. ábrát).

A PWM felbontás ebben a módban az ICRn vagy OCRnA regiszter segítségével állítható be. A minimális felbontás 2 bit (ICRn vagy OCRnA = 0x0003), a maximális felbontás pedig 16 bit (ICRn vagy OCRnA = 0xFFFF). A PWM felbontás bitben a következő kifejezéssel számítható ki:

PWM FCC módban a számláló addig növekszik, amíg meg nem egyezik az ICRn (WGMn3:0 = 0b1000) vagy az OCRnA (WGMn3:0 = 0b1001) értékével. Ez azt jelenti, hogy elérjük a számlálás csúcsát, ami után a számlálás iránya megváltozik. A TCNTn értéke egy időzítő óraciklusig a számlálás tetején marad. A PWM FCC mód időzítési diagramja az 54. ábrán látható. Az ábra a PWM FCC módot mutatja, amikor a számlálási csúcsot az OCRnA vagy ICRn regiszter állítja be. A TCNTn érték függvénygrafikonként jelenik meg a kétirányú számlálás szemléltetésére. A diagram a nem invertáló és az invertáló PWM kimeneteket egyaránt mutatja. A rövid vízszintes vonalak a TCNTn diagram azon pontjait jelzik, ahol az OCRnx és a TCNTn között egyezés fordul elő. Az OCnx megszakítási jelző egyezés után kerül beállításra.

4. ábra – PWM mód időzítési diagramja fázis- és frekvenciakorrekcióval

Az időzítő-számláló túlcsordulási jelzője (TOVn) ugyanabban az óraciklusban van beállítva, amikor a regisztereket frissítik a pufferregiszterből származó értékkel (az alsó számlálási határon). Ha az OCRnA vagy ICRn regisztert használjuk a felső határ beállítására, akkor amikor a számláló eléri a felső határt, az OCnA, illetve az ICFn jelző kerül beállításra. A megszakításjelzők használhatók megszakítás generálására, ha a számláló elér egy felső vagy alsó határt.

A felső határ megváltoztatásakor gondoskodnia kell arról, hogy az új érték nagyobb vagy egyenlő legyen, mint az összes összehasonlítási küszöbregiszterben szereplő érték. Ellenkező esetben, ha a felső határt az összehasonlítási küszöbregiszterek bármelyikénél kisebb értékre állítják be, a TCNTn és az OCRnx között soha nem lesz egyezés.

A 4. ábra azt mutatja, hogy a PWM FC móddal ellentétben a generált kimeneti jel minden periódusban szimmetrikus. Mivel az OCRnx regiszterek frissítése az alsó számlálási határon történik, az előre és hátrafelé történő számlálás időtartama mindig egyenlő. Ennek eredményeként a kimeneti impulzusok szimmetrikus alakúak, és ezért korrigált frekvenciájúak.

Az ICRn regiszter használata a felső határ beállításához ajánlott, ha a felső határérték állandó. Ebben az esetben az OCRnA regiszter is felszabadul az OCnA érintkezőn lévő impulzusok impulzusszélesség-modulációjához. Ha azonban dinamikusan módosítani kell a PWM frekvenciát a felső határ megváltoztatásával, akkor a kettős pufferelés miatt ajánlott az OCRnA regiszter segítségével beállítani a felső határt.

PWM módban az összehasonlító egységek lehetővé teszik PWM impulzusok generálását az OCnx lábon. Ha COMnx1:0 = 0b10, akkor egy nem invertáló PWM kimenet van beállítva, ha pedig COMnx1:0=0b11, akkor egy invertáló (lásd a 60. táblázatot). Az OCnx érték csak akkor lesz jelen a megfelelő port tűjén, ha az kimeneti irányra van állítva. A PWM jel az OCnx regiszter beállításával (visszaállításával) az OCRnx és a TCNTn közötti egyezésre a felfelé számlálás során, és az OCnx regiszter alaphelyzetbe állításával (beállításával) az OCRnx és a TCNTn közötti egyezésre a visszaszámlálás során. A PWM frekvenciát ebben az üzemmódban a számlálás adott felső határával (UP) a következőképpen határozzuk meg:

ahol N az előskálázó osztási tényezője (1, 8, 32, 64, 128, 256 vagy 1024).

Az OCRnx regiszterbe való határértékek írása speciális esetekhez kapcsolódik a PWM jelek generálásakor ebben a módban. Ha az OCRnx-et az alsó határértékre (0x0000) állítja, akkor nem invertáló módban a kimenet folyamatosan alacsony logikai szinttel rendelkezik, és a felső határértékkel egyenlő érték írásakor a kimenet magas logikai szinttel rendelkezik egy hosszú idő. Invertáló módban a megadott szintek ellentétesek lesznek.

Ha az OCRnA-t használjuk a felső határ beállítására (WGMn3:0 = 0b1001) és COMnA1:0 = 0b01, akkor az OCnA kimeneten négyszöghullám jön létre.


A PWM hardveres megvalósítása kétségtelenül előnyökkel jár a szoftverekkel szemben, mivel megszabadítja a processzort a felesleges és nehézkes kódoktól és a karbantartási időtől, valamint több lehetőséget biztosít a PWM-mel végzett munka használatára. Elég inicializálni az időzítőt/számlálót (beírni a szükséges értékeket az időzítő/számláló által használt regiszterekbe), és az időzítő/számláló a processzortól függetlenül működhet, ennek megfelelően a processzor más feladatokkal is foglalkozhat, csak alkalmanként. kapcsolatfelvétel a szükséges pillanatban az üzemmód beállításához vagy megváltoztatásához, vagy az időzítő/számláló eredményének eléréséhez.

A megszakításjelzők leírása

A T1 megszakítást generálhat, ha:

  1. számlálóregiszter TCNT1 túlcsordulás;
  2. ha a TCNT1 számláló regiszter és az OCR1A és OCR1B összehasonlító regiszter egyenlő (minden regiszterhez külön);
  3. miközben a számláló regisztert az ICR1 rögzítési regiszterben tárolja.

A T2 megszakítást generálhat, ha:

  1. TCNT2 számlálóregiszter túlcsordulás;
  2. amikor a TCNT2 számláló regiszter és az OCR2 összehasonlító regiszter egyenlő.

Az összes megszakítás jelzője a TIFR regiszterben, a megszakítás engedélyezése/letiltása pedig a TIMSK regiszterben található.

TIMSK regiszter bitek
Regisztráció7 6 5 4 3 2 1 0
TIMSK OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0* TOIE0
  • OCIE2- Megszakítás engedélyezése jelző a T2 időzítő/számláló „match” eseményéhez
  • TOIE2- T2 időzítő/számláló túlcsordulás megszakítás engedélyezése jelző
  • TICIE1- Megszakítás engedélyezése jelző a T1 időzítő/számláló „rögzítés” eseményéhez
  • OCIE1A- Megszakítás engedélyezése jelző a T1 időzítő/számláló „match A” eseményéhez
  • OCIE1B- Megszakítás engedélyezése jelző a T1 időzítő/számláló „match B” eseményéhez
  • TOIE1- T1 időzítő/számláló túlcsordulás megszakítás engedélyezése jelző
  • OCIE0*- Megszakítás engedélyezése jelző a T0 időzítő/számláló „egybeesése” eseményéhez (* - nem érhető el az ATmega8-ban)
  • TOIE0- Időzítő/számláló túlcsordulás megszakítás engedélyezése jelző T0
  • OCF2- Megszakítás jelző a T2 időzítő/számláló „egybeesése” eseményéhez
  • TOV2- Időzítő/számláló túlcsordulás megszakítás jelző T2
  • ICF1- Megszakítás jelző a T1 időzítő/számláló „rögzítés” eseményéhez
  • OCF1A- Megszakítás jelzője a T1 időzítő/számláló "A egybeesése" eseményéhez
  • OCF1B- Megszakítási jelző a T1 időzítő/számláló "B egybeesése" eseményéhez
  • TOV1- T1 időzítő/számláló túlcsordulás megszakítás jelzője
  • OCF0- Megszakítás jelző a T0 időzítő/számláló „egybeesése” eseményéhez
  • TOV0- Időzítő/számláló túlcsordulás megszakítás jelző T0

A T1 időzítő/számláló működésének leírása az ATmega8/16 vezérlőben

A tizenhat bites T1 időzítő/számláló használható időintervallumok generálására, a külső jelek számának megszámlálására, valamint változó munkaciklusú és időtartamú PWM jelek generálására az OC1A és OC1B érintkezőkön. Ezenkívül az ICP1 érintkezőből vagy egy analóg komparátorból származó külső jellel a T1 elmentheti aktuális állapotát egy külön ICR1 rögzítési regiszterbe.

Regiszter bitek TCCR1A:TCC1B:TCNT1:OCR1A:OCR1B:ICR1
Regisztráció7 6 5 4 3 2 1 0
TCCR1A COM1A1 COM1A0 COM1B1 COM1BO FOC1A FOC1B WGM11 WGM10
TCCR1B ICNC1 ICES1 * WGM13 WGM12 CS12 CS11 CS10
TCNT1:H R/W R/W R/W R/W R/W R/W R/W R/W
TCNT1:L R/W R/W R/W R/W R/W R/W R/W R/W
OCR1A:H R/W R/W R/W R/W R/W R/W R/W R/W
OCR1A:L R/W R/W R/W R/W R/W R/W R/W R/W
OCR1B:H R/W R/W R/W R/W R/W R/W R/W R/W
OCR1B:L R/W R/W R/W R/W R/W R/W R/W R/W
ICR1:H R/W R/W R/W R/W R/W R/W R/W R/W
ICR1:L R/W R/W R/W R/W R/W R/W R/W R/W

Minden 16 bites regiszter fizikailag két 8 bites regiszterben található, így az ezekbe történő bejegyzés beolvasásakor két műveletet kell végrehajtani. Íráskor először a magas bájt kerül betöltésre, majd az alacsony bájt, ellenkezőleg, olvasáskor először az alsó, majd a magas bájt kerül beolvasásra.

TCCR1A:TCCR1B- 8 bites időzítő/számláló vezérlőregiszterek T1

TCNT1- 16 bites időzítő/számláló regiszter T1. Az üzemmódtól függően ennek a regiszternek a tartalma törlődik, növekszik (az érték 1-gyel nő) vagy csökken (az érték 1-gyel csökken) az időzítő/számláló órajel minden impulzusára.

OCR1A:OCR1B- 16 bites összehasonlító regiszterek

ICR1- 16 bites rögzítési regiszter, a TCNT1 értékét tárolja, amikor aktív jelél kerül az ICP1 érintkezőre, vagy a komparátortól érkező jel.

Bit hozzárendelés

COM1A1:COM1A0:COM1B1:COM1B0- Ezek a bitek határozzák meg az OC1A:OC1B láb viselkedését, ha a TCNT1 számlálóregiszter és az OCR1A:OCR1B összehasonlító regiszter értéke egyezik

FOC1A:FOC1B- Ezek a bitek az OC1A:OC1B láb állapotának megváltoztatására szolgálnak

ICNC1- Interferenciaáramkör vezérlő bit, ha a bit „0”, akkor a rögzítés az első aktív élen, „1” esetén a befogás a befogó jel negyedik azonos mintája után történik.

ICES1- A jel aktív élének kiválasztására szolgáló bit, ha értéke „0”, a TCNT1 számlálóregiszter mentése az OCR1 rögzítési regiszterbe a jel lefutó élén lesz, ha „1” a felfutó élen.

WGM13:WGM12:WGM11:WGM10- Ezek a bitek határozzák meg a T1 időzítő/számláló működési módját

CS22:CS21:C20- A T1 időzítő/számláló órajel forrását meghatározó bitek.

Az időzítő/számláló üzemmódjának kiválasztása T1
WGM13WGM12WGM11WGM10ÜzemmódFiókmodul (TOP)
0 0 0 0 Normál $FFFF
0 0 0 1 Fázis helyes PWM

8 bites

00 FF
0 0 1 0 Fázis helyes PWM

9 bites

01FF USD
0 0 1 1 Fázis helyes PWM

10 bites

03 FF
0 1 0 0 CTC (visszaállítás meccskor) OCR1A
0 1 0 1 Gyors PWM

8 bites

00 FF
0 1 1 0 Gyors PWM

9 bites

01FF USD
0 1 1 1 Gyors PWM

10 bites

03 FF
1 0 0 0 ICR1
1 0 0 1 Fázis és frekvencia helyes PWM OCR1A
1 0 1 0 Fázis helyes PWM ICR1
1 0 1 1 Fázis helyes PWM OCR1A
1 1 0 0 CTC (visszaállítás meccskor) ICR1
1 1 0 1 Fenntartott *
1 1 1 0 Gyors PWM ICR1
1 1 1 1 Gyors PWM OCR1A

Óraforrás kiválasztása

Normál mód

A legegyszerűbb üzemmód a T1. Az órajel minden impulzusa esetén a TCNT1 számlálóregiszter növekszik (az érték 1-gyel nő). A számláló modul (TOP) $FFFF értékén való áthaladáskor túlcsordulás következik be, és a következő óraciklus a $0000 értéktől kezdi el a számlálást, ugyanabban a pillanatban a TIFR regiszterben beáll a TOV1=1 jelző, és egy megszakítás lehetséges. akkor jön létre, ha a TOIE1=1 jelző be van állítva a TIMSK regiszterben. Egy adott frekvenciájú jel generálásához ebben az üzemmódban a vezérlő OC1A kimenetére a COM1A1=0:COM1A0=1, illetve az OC1B kimenetére COM1B1=0:COM1B0=1 biteket kell beírni.

Ezen túlmenően minden órajelciklushoz összehasonlítás történik a TCNT1 számláló regiszter és az OCR1A:OCR1B összehasonlító regiszter között; ha van egyezés, akkor az OCF1A=1:OCF1B=1 megszakításjelző kerül beállításra, és ha az OCIE1A=1 bit :OCIE1B=1 a TIMSK regiszterből, megszakítás jön létre. Ugyanakkor az OC1A:OC1B láb állapota a COM1A1:COM1A0:COM1B1:COM1B0 bitek beállításaitól függően változtatható.

CTC mód (visszaállítás meccskor)

Ebben az üzemmódban a T1 ugyanazon az elven működik, mint a normál módban. A különbség az, hogy a TCNT1 számlálóregiszter lehetséges maximális értékét az OCR1A vagy ICR1 összehasonlító regiszter értéke korlátozza (lásd az időzítő/számláló mód kiválasztási táblázatát). Amikor a TCNT1 eléri az OCR1A vagy ICR1 értékét, a TCNT1 értéke visszaáll TCNT1=$0000 értékre. Ezzel egy időben a TOV1=1 jelző COM1A1:COM1A0:COM1B1:COM1B0 Meghatározza az OC1A:OC1B láb viselkedését, amikor van egy meccs.

Gyors PWM mód (gyors PWM)

Ezzel a móddal nagyfrekvenciás PWM jelet generálhat. A működés elve és eljárása nem tér el a normál módtól, kivéve az OCR1A:OCR1B regiszter kettős pufferelését, amely kiküszöböli az aszimmetrikus jelimpulzusok megjelenését, és különbözik az OC1A:OC1B érintkezők viselkedésében is ( lásd a táblázatot).


Fázis helyes PWM mód

E mód és az előzőek közötti különbség az, hogy a számláló regiszter fordított számlálóként működik. Mivel ezt az üzemmódot ajánlja az Atmel, mint a legalkalmasabbat a motorok tuningolására, részletesebben megvizsgáljuk. Amikor a TCNT1 számláló regiszter eléri a számlálási modulus (TOP) értékét (vagy az ICR1 regiszter értékét vagy az OCR1A regiszter értékét, lásd az időzítő/számláló mód kiválasztási táblázatát), a számlálási irány megváltozik. Amikor a TCNT1 számláló regiszter eléri a minimális értéket ($0000), a számlálási irány is megváltozik, és ezzel egyidejűleg beáll a TIFR regiszter TOV1 megszakítási jelzője. Továbbá, ha a TCNT1 számláló regiszter és az OCR1A:OCR1B összehasonlító regiszter tartalma megegyezik, a TIFR regiszter OCF1A:OCF1B jelzője be van állítva, és az OC1A:OC1B kimenet állapota a táblázat szerint változik.

Az aszimmetrikus kibocsátások elkerülése érdekében, amikor egy értéket írunk az OCR1A:OCR1B regiszterbe, ebben a módban kettős írási pufferelés valósul meg. Ennek köszönhetően a regiszterérték tényleges változása abban a pillanatban változik, amikor a TCNT1 számlálóregiszter eléri a számláló modulus (TOP) értékét (vagy az ICR1 regiszter értékét vagy az OCR1A regiszter értékét, lásd az időzítő/számláló mód kiválasztását asztal). Ezért a legelején, amikor az időzítőt/számlálót inicializálják, az OC1A:OC1B érintkező nem változtatja meg állapotát az illesztéskor, amíg a regiszter el nem éri a (TOP) értéket.


Feladat: Fejlesszünk ki egy programot egy 12 V-os izzólámpa fényerejének szabályozására PWM segítségével. Ha megnyomja a „Több” gombot, a lámpa fényereje növekszik, a „Kevesebb” gombra kattintva pedig csökken. Leendő készülékünk diagramja az ábrán látható. Szokás szerint az Atmega8 mikrokontrollert használjuk, ami 4 MHz-es belső oszcillátorról fog órajelezni. Valójában dimmert kapunk, ezeket az eszközöket a világítótestek fényerejének beállítására tervezték. Napjainkban a LED fényerőszabályzók a legelterjedtebbek.

Az egyszerűség kedvéért LED-et is csatlakoztathatunk az áramkörünkhöz, de izzóval áttekinthetőbb lesz. A gombok érintkezőkhöz vannak kötve PD0, PD1. Csatlakoztatjuk a terhelést a kimenethez PB1(OC1A) ellenálláson és MOSFET térhatású tranzisztoron keresztül, ami nekünk kulcsként fog működni (kapcsoló üzemmódban). A térhatású tranzisztor előnyösebb, mivel a kapuja el van választva a tápáramkörtől, és elektromos térrel vezérli, a vezérlőáram pedig eléri a mikroampert. Ez lehetővé teszi egy vagy két tranzisztor használatával hatalmas teljesítményű terhelés (akár több tíz amper és több tíz vagy több száz volt) vezérlését a mikrokontroller terhelése nélkül. Figyelembe véve azt a tényt is, hogy a térhatású tranzisztorok párhuzamosan kapcsolhatók (a bipolárisokkal ellentétben), még erősebb, több száz amperes kaszkád érhető el.

Most nézzük meg, hogyan valósítja meg a mikrokontroller a PWM-et, és írjunk egy programot. Mint korábban említettük, MK-unk 3 időzítővel rendelkezik, és mindegyik képes PWM módban működni. Tizenhat bites időzítővel/számlálóval fogunk dolgozni. Bitok WGM13-10állítsuk be az időzítőnket úgy, hogy a FastPWM működjön egy felső határértékkel ICR1. A program elve a következő: az időzítőnk 0-tól 65535-ig (0xFFFF) számol be a regiszterbe ICR1Írjuk be a 255-ös számot, ez lesz az időzítő számláló (TOP) felső határa, a PWM jel frekvenciája állandó lesz. Az időzítőnk úgy van beállítva, hogy ha a számláló regiszter és az összehasonlító regiszter egyezik (TCNT1 = OCR1A), a vezérlő kimenete átkapcsol OC1A. A PWM munkaciklus az összehasonlító regiszterbe írva módosítható OCR1A egy bizonyos szám 0 és 255 között, minél nagyobb ez a szám, annál nagyobb a kitöltési tényező, annál fényesebben fog égni a lámpa. Attól függően, hogy melyik gombot nyomjuk meg, a változó változik én, majd beírják a regiszterbe OCR1A.

A program teljes szövegét alább közöljük. A megjegyzések részletesebben ismertetik a program működését.

/***8. lecke. PWM jelek generálása***/ #include #beleértve int main(void) ( unsigned int i=0; //i változó meghatározása /***I/O portok konfigurálása***/ PORTB = 0x00; DDRB |= (1<< PB1); PORTD |= (1 << PD1)|(1 << PD0); // подключаем внутренние нагрузочные резисторы DDRD = 0x00; /***Настройка таймера***/ TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // Установим биты COM1A1-COM1A0:0b10, означает сброс вывода канала A при сравнении |(1 << WGM11)|(0 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это TCCR1B |= (1 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1 |(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя TCNT1 = 0x00; // начальная установка счетчика ICR1 = 0xFF; // задаем период ШИМ, здесь у нас число 255, // по формуле fPWM=fclk_I/O/N*(1+ICR1)// вычисляем частоту ШИМ, она будет равна 15625 Hz OCR1A = 0x00; // начальный коэффициент заполнения ШИМ /***Основной цикл программы***/ while(1) { if((PIND&(1 << PD0)) == 0) //если кнопка "больше" нажата { if (i < 254) { // коэффициент заполнения ШИМ изменяется от 0 до 255 i=i+1; // увеличиваем i на единицу OCR1A = i; // записываем переменную в регистр сравнения _delay_ms(30); // задержка 30ms } } if((PIND&(1 << PD1)) == 0) //если кнопка "меньше" нажата { if (i >0) // A PWM munkaciklusa 255-ről 0-ra változik ( i--; // az i-t eggyel csökkenti (ezt is írhatja) OCR1A = i; // Változó írása az összehasonlító regiszterbe _delay_ms(30); // késés 30 ms ) ) ) )

Figyelem! Először a mikrokontroller tápellátását biztosítjuk, majd meg kell győződnie arról, hogy a tranzisztor csatlakozik-e az MK tűhöz, és csak ezután adjuk tápfeszültséggel a lámpával és a térhatású tranzisztorral ellátott áramkört. Ellenkező esetben megégetheti a tranzisztort. Az a tény, hogy kikapcsolt állapotban az MK „lábai” „lelógnak a levegőben” - nem kapcsolódnak semmihez, és interferencia lép fel rajtuk. Ezek a gyenge interferenciák elegendőek egy nagyon érzékeny térhatású tranzisztor részleges megnyitásához. Ekkor az ellenállása a lefolyó és a forrás között több MOhmról több Ohmra vagy Ohm töredékére csökken, és nagy áram folyik rajta keresztül a lámpához. De a tranzisztor nem nyílik meg teljesen, mert ehhez nem 1-3 V-os interferenciát kell alkalmazni a kapura, hanem stabil 5 V-ot, és ellenállása sokkal nagyobb lesz, mint a minimum. Ez nagy mennyiségű hő felszabadulásához vezet, és füstölni fog, és esetleg megég.

PWM időzítők (előadás)

Nyilván szükségünk van valamilyen külső számlálóra, ami a processzor működésétől függetlenül ketyeg, és a processzor bármikor láthatja, hogy mi ketyeg benne. Vagy ha a számláló túlcsordulási vagy alulcsordulási eseményeket generál - emelje fel a jelzőt, vagy generáljon megszakítást. A processzor pedig látni fogja és feldolgozza. És van ilyen számláló, nem is egy - ezek periféria időzítők. Egy AVR-nek több is lehet, különböző bitmélységgel. Az ATmega16 három, az ATmega128 négy. Sőt, az időzítő több is lehet, mint egy számláló, az időzítő az egyik leginkább multifunkcionális (alternatív funkciókat tekintve) periféria.

Mire képesek az időzítők

· Működik külső kvarcról 32768 Hz-en

· Többféle PWM jel generálása

· Megszakítások kiadása (fél tucat különböző esemény) és zászlók beállítása

Időzítő jelforrás

Az időzítő/számláló (a továbbiakban: TC) vagy a beépített óragenerátorból, vagy a számláló bemenetről érkező órajeleket számolja. Megfelelő beállításokkal a jármű vagy a bemenetekre érkező impulzusok elülső élét (éle 0-1-től), vagy a hátsó élét (1-0-ig terjedő éle) számolja. A lényeg az, hogy a bejövő impulzusok frekvenciája ne haladja meg a processzor órajel-frekvenciáját, különben nem lesz ideje feldolgozni az impulzusokat.

Ezenkívül néhány időzítő aszinkron üzemmódban is működik. Vagyis a TS nem a processzor órajel-impulzusait számolja, hanem a saját generátorának impulzusait, amelyet külön kvarc táplál. Erre a célra a jármű külön bemenetekkel rendelkezik, amelyekre kvarc rezonátort csatlakoztathat. Miért van erre szükség? Legalábbis a valós idejű óra megszervezéséhez. Felakasztottam rájuk egy óra kvarcot 32768 Hz-en és lehet mérni az időt - másodpercenként 128 túlcsordulás történik (ha nyolcbites a jármű). Tehát egy túlcsordulás 1/128 másodperc. Ezenkívül az időzítő nem áll le a túlcsordulási megszakítás feldolgozása közben, hanem továbbra is számol.

Előosztó

Ha az időzítő egy óragenerátorból vagy annak belsőjéből számolja az impulzusokat, akkor azok továbbra is átvihetők egy előskálázón. Vagyis még a számláló regiszterbe való belépés előtt az impulzusfrekvencia felosztásra kerül. Oszthat 8-cal, 32-vel, 64-gyel, 128-mal, 256-tal, 1024-gyel. Tehát ha egy órakvarcot akaszt a járműre, és átengedi az előskálázón 128-cal, az időzítő másodpercenként egyszer számol. Akkor is kényelmes az előskálázó használata, ha csak nagy intervallumot kell elérni, és az egyetlen számlálási forrás a processzor órajel-generátora, és ezeket a megahertzeket nehéz számolni, de ha átadja egy előskálázón, akkor minden könnyebb. . Ha azonban előskálázóval futtatunk egy TS-t, akkor az első tick nem feltétlenül a kívánt számú impulzus után érkezik meg a számlálóregiszterbe.

Attól függ, milyen állapotban volt az előskálázó, mi van akkor, ha a bekapcsoláskor már majdnem a beállított értékig számolt? Ez azt jelenti, hogy azonnal kullancs lesz. Az előskálázó folyamatosan működik, függetlenül attól, hogy az időzítő be van-e kapcsolva vagy sem. Ezért az előskálázókat vissza lehet állítani, és vissza kell állítani. Figyelembe kell venni azt is, hogy az előskálázó minden számlálónál ugyanaz, ezért a nullázásnál figyelembe kell venni, hogy egy másik időzítőnek késése lesz a következő tickig.

Például az első időzítő az előskálázó 1:64-es, a második az 1:1024-es tűjén működik. A második majdnem elérte az 1024-et az előskálázóban, és most ott kell lennie az időzítő ketyegésnek, de aztán visszaállítottad az előskálázót, hogy az első időzítőt pontosan a nulláról indítsa el. Mi fog történni? A másodiknál ​​az osztó azonnal visszaáll 0-ra (az előskálázó ugyanaz, egy regiszter van), a második időzítőnek pedig további 1024 órajelet kell várnia, hogy impulzust kapjon! És ha az előskálázót a hurokban, az első időzítő javára, gyakrabban állítja vissza, mint 1024 óraciklusonként, akkor a második időzítő soha nem fog ketyegni. Az előskálázók visszaállításához egyszerűen írja be a PSR10 bitet az SFIOR regiszterbe. A PSR10 bit automatikusan visszaáll a következő órajel ciklusban.

Számlanyilvántartás

A teljes számlálás a TCNTx számlálóregiszterben halmozódik fel, ahol x az időzítő száma. Ez lehet 8 vagy 16 bites, ebben az esetben két regiszterből áll, TCNTxH és TCNTxL - a magas és alsó bájtokból.

És van itt egy fogás. A lényeg pedig az, hogy az időzítő a processzortól függetlenül számol, tehát egy bájtot tehetünk először, az elkezdi számolni, majd a másodikat, és a második bájt figyelembevételével kezdődik az újraszámítás. Az időzítő egy precíz eszköz, így a számláló regisztereit egyszerre kell betölteni! De hogyan? Az Atmel mérnökei pedig egyszerűen megoldották a problémát: A magas regiszterbe (TCNTxH) való írás először a TEMP regiszterben történik. Ez a nyilvántartás tisztán hivatalos, és számunkra semmilyen módon nem hozzáférhető.

Mi az eredmény? A magas bájtot a TEMP regiszterbe írjuk (nálunk ez még mindig TCNTxH), majd az alacsony bájtot. Ebben a pillanatban az előzőleg rögzített érték bekerül a valós TCNTxH-ba. Vagyis két bájt, magas és alacsony, egyszerre íródik! A sorrendet nem tudod megváltoztatni! Ez így néz ki:

Miért kell letiltani a megszakításokat? Igen, hogy az első bájt megírása után véletlenül se hagyja el a program megszakítás nélkül.

Minden ugyanúgy olvasható, csak fordított sorrendben. Először az alacsony bájt (a magas bájttal a TEMP-ben), majd a magas bájt. Ez biztosítja, hogy pontosan azt a bájtot számoljuk, amely éppen a számláló regiszterben volt.

Ellenőrző regiszterek

Az időzítő fő funkciója a számlálás. A fő regiszter a TCCRx. A TC0 esetében ez a TCCR0, a többi időzítőnél a TCCR n illetőleg. Ennek a regiszternek az első 3 bitje: CSx2..CSx0 felelős az előskálázó beállításáért és az órajel forrásáért, x helyett az időzítő száma van helyettesítve. A különböző időzítők kissé eltérőek, ezért a CS02...CS00 biteket csak a timer0-hoz írjuk le.

· 000 - az időzítő leállt

· 001 - az előskálázó egyenlő 1-gyel, azaz kikapcsolva. Az időzítő számolja az óra impulzusait

· 010 - az előskálázó 8, az órajel frekvenciája osztva 8-cal

· 011 - az előskálázó 64, az órajel frekvencia osztva 64-gyel

· 100 - az előskálázó 256, az órajel frekvenciája osztva 256-tal

· 101 - az előskálázó 1024, az órajel frekvenciája osztva 1024-gyel

· 110 - az órajel impulzusok a T0 érintkezőből származnak az 1-ről 0-ra való átmenetnél

· 111 - az órajel impulzusai a T0 érintkezőből származnak a 0-ról 1-re való átmenetnél

Megszakítja

Minden hardveres eseménynek van megszakítása, és ez alól az időzítő sem kivétel. Amint túlcsordulás vagy egyéb esemény történik, azonnal megszakítás jön létre. A TIMSK és TIFR regiszterek felelősek az időzítőkből származó megszakításokért. És a nagy teljesítményű AVR-ek, mint például az ATMega128, rendelkeznek ETIFR-rel és ETIMSK-val is - amolyan folytatásként, mivel ott több időzítő van. A TIMSK egy maszkregiszter. Vagyis a benne lévő bitek lokálisan engedélyezik a megszakításokat. Ha a bit be van állítva, az adott megszakítás engedélyezett. Ha a bit nulla, akkor ez a megszakítás nem kerül feldolgozásra. Alapértelmezés szerint minden bit nulla. A következő bitek felelősek a túlcsordulási megszakításért:

· TOIE – megszakítási engedély a 0. időzítő túlcsordulásakor

· TOIE1 – megszakítási engedély az 1. időzítő túlcsordulásakor

· TOIE2 – megszakítási engedély a 2. időzítő túlcsordulásakor

A TIFR regiszter közvetlenül egy zászlóregiszter. Amikor egy megszakítást kiváltanak, a megszakítási jelző be van állítva. Ezt a jelzőt a hardver alaphelyzetbe állítja, amikor a program elhagyja a vektort. Ha a megszakítások le vannak tiltva, akkor a jelző ott marad mindaddig, amíg a megszakításokat engedélyezik, és a program a megszakításra nem lép. Ennek elkerülése érdekében a jelzőt manuálisan vissza lehet állítani. Ehhez TIFR-ben 1-et kell beleírni!

További információ az A időzítőről TMEGA128később lesz szó.

Impulzus szélesség moduláció

Impulzus szélesség moduláció ( PWM - Impulzus szélesség moduláció) ez az analóg jel megadásának módja digitális módszer , vagyis a csak nullákat és egyeseket adó digitális kimenetről simán változó értékeket kaphatunk. És a lényeg:

Képzeljen el egy nehéz lendkereket, amelyet motorral forgathat. Sőt, be- vagy kikapcsolhatja a motort. Ha folyamatosan bekapcsolja, a lendkerék felpörög a maximális értékre, és tovább pörög. Ha kikapcsolja, a súrlódási erők hatására leáll. De ha a motort percenként tíz másodpercre bekapcsolják, a lendkerék felpörög, de nem teljes sebességgel - a nagy tehetetlenség kisimítja a motor beindításából származó rándulásokat, és a súrlódási ellenállás nem teszi lehetővé, hogy a végtelenségig forogjon. A több BE időtartama motor percenként, annál gyorsabban fog forogni a lendkerék.

Nál nél PWM jelet küldünk a kimenetre, amely magas és alacsony szintekből áll (hasonlatunkra vonatkozik - be- és kikapcsoljuk a motort), azaz nullákat és egyeseket. Ezután mindezt egy integráló láncon (analógiában - lendkeréken) vezetik át. Az integráció eredményeként a kimenet feszültségértéke megegyezik az impulzusok alatti területtel.Változás munkaciklus(a periódus időtartamának és az impulzus időtartamának aránya) simán módosíthatja ezt a területet, így a kimeneti feszültséget. Így, ha a kimenet szilárd 1s, akkor a kimenet magas szintű feszültség (például 12 volt), ha nullák, akkor nulla. És ha a szint az esetek 50%-ában magas, és 50%-ban alacsony, akkor 6 volt. Az integráló lánc itt a motor armatúra tömege lesz, amelynek meglehetősen nagy tehetetlensége van.

Mi történik, ha veszel és adsz PWM - a jel nem nullától maximumig, hanem mínusztól pluszig áll. Mondjuk +12-től -12-ig. És beállíthat változó jelet! Ha nulla van a bemeneten, akkor a kimenet -12V, ha van, akkor +12V. Ha a munkaciklus 50%, akkor a kimenet 0 V. Ha a munkaciklust egy szinuszos törvény szerint maximumról minimumra változtatjuk, akkor váltakozó feszültséget kapunk. És ha veszünk három ilyen PWM generátort, és szinuszokat hajtunk át rajtuk, egymáshoz képest 120 fokkal eltolva, akkor megkapjuk a leggyakoribb háromfázisú feszültséget, ami azt jelenti, helló kefe nélküli aszinkron és szinkron motorok . Minden modern ipari AC hajtás erre az elvre épül. Az RC lánc simító integráló áramkörként használható PWM-ben:

A PWM hardveres megvalósítása

Amikor ATMega Ennek legegyszerűbb módja a PWM generátor, amely az időzítőkbe van beépítve. Ezenkívül az első időzítőnek két csatornája van. Tehát az ATmega négy csatornát tud egyszerre megvalósítani PWM.

Az időzítő speciális összehasonlító regiszterrel rendelkezik OCR. Amikor az időzítő számláló regiszterében lévő érték eléri az összehasonlító regiszterben lévő értéket, a következő hardveres események fordulhatnak elő:

· Véletlen félbeszakítás

· A külső összehasonlító kimenet állapotának megváltoztatása O.C..

Az összehasonlító kimenetek a mikrokontroller érintkezőin kívülre kerülnek. Tegyük fel, hogy a PWM- a generátor így van beállítva hogy amikor a számlálóregiszterben nagyobb az érték, mint az összehasonlító regiszterben, akkor a kimenet 1, és ha kevesebb, akkor 0. Mi lesz? Az időzítő úgy számol, ahogy kell, nullától 256-ig egy frekvenciával, amelyet az időzítő előskálázó bitjeivel fogunk konfigurálni. Túlcsordulás után visszaáll 0-ra, és újra folytatja a számlálást.

Impulzusok jelennek meg a kimeneten. Ha az összehasonlító regiszterben növeljük az értéket, az impulzusszélesség szűkül. Vagyis az összehasonlítási regiszterben lévő érték megváltoztatása, megváltoztathatja a PWM munkaciklust- jel. És ha ezt a PWM jelet egy simító RC láncon (integrátoron) továbbítja, akkor analóg jelet kapunk.

Egy időzítőnek tetszőleges számú összehasonlítási regisztere lehet. Az MK modelltől és az időzítő típusától függ. Az új AVR-ek időzítőnként három összehasonlító regiszterrel is rendelkeznek, ami lehetővé teszi egy MK számára, hogy sok független PWM csatornát szervezzen. Számos PWM mód létezik:

BsPWM vonal (Gyors PWM)

Ebben az üzemmódban a számláló nullától számol 255 , a túlcsordulás elérése után nullázódik, és a számlálás újraindul. Amikor a számlálóban lévő érték eléri az összehasonlító regiszter értékét, a megfelelő kimenet OSxx nullára áll vissza. A számláló nullázásakor ez a tű 1-re áll.

A kapott PWM-jel frekvenciáját egyszerűen meghatározzuk: A processzor frekvenciája például 8 MHz, az időzítő órajel-frekvenciával 256-ra ketyeg. Ez azt jelenti, hogy egy PWM periódus 8000 000/256 = 31250 Hz lesz. Nem lesz gyorsabb – ez a maximális sebesség a belsőn 8 MHzóra generátor. Továbbra is lehetséges a felbontás növelése a számlálás 8, 9, 10 bitesre állításával (ha az időzítő bitmélysége megengedi), de figyelembe kell venni, hogy a bitmélység növelése, valamint a kimeneti analóg diszkrétségének növelése jelet, élesen csökkenti a PWM frekvenciát.

PWM fáziskorrekcióval (Phase Correct PWM)

PWM precíz fázissal. Hasonlóan működik, de itt a számláló egy kicsit másképp számol. Először 0-ról 255-re, majd 255-ről 0-ra. Az OCxx tű az első egyezésnél visszaáll, a másodiknál ​​pedig beáll. De a frekvencia PWM ugyanakkor felére csökken a hosszabb időszak miatt. Fő célja többfázisú PWM jelek, például háromfázisú szinuszhullám készítése. Azok. az impulzusok középpontja a különböző csatornákban és különböző munkaciklusokban egybeesik.


Rizs. Gyors PWM és fáziskorrigált PWM módok

A szükségtelen impulzusok elkerülése érdekében bármely érték egy pufferregiszteren keresztül kerül be az összehasonlító regiszterbe, és csak akkor kerül beadásra, ha a számlálóban lévő érték eléri a maximumot. Azok. egy új időszak kezdetére PWM impulzus.

VisszaállításÁltalvéletlen egybeesés(Időzítő törlése összehasonlításkor)

Összehasonlításkor állítsa vissza. Ez nagy valószínűséggel PFM - impulzusfrekvenciás szimulált jel. Itt egy kicsit másképp működik, mint más módokban. Itt a számláló időzítő nem 0-tól a határig ketyeg, hanem 0-tól az összehasonlító regiszterig! És akkor visszaáll.

Ennek eredményeként a kimenő impulzusok mindig azonos munkaciklusúak, de eltérő frekvenciájúak. És leggyakrabban ezt az üzemmódot használják, amikor meghatározott pontossággal kell időzítővel számolni (és megszakítást generálni).


Például ezredmásodpercenként megszakításra van szükségünk. És hogy biztos legyek. Hogyan lehet ezt könnyebben megtenni? STS módon keresztül! Legyen a frekvencia 8 MHz. Az előskálázó 64 lesz, tehát az időzítő számláló frekvenciája 125000 Hz lesz. És szükségünk van egy 1000 Hz-es megszakításra. Ezért beállítunk egy megszakítást, amely egybeesik a 125-ös számmal. Amikor a számláló eléri a 125-öt, a megszakítás aktiválódik, és a számláló nullára áll. Elérte a 125-öt - megszakítást adott, nullára állította.

8 bites időzítő-számláló 0 PWM-mel és aszinkron órajel funkcióval

A Timer-Counter 0 egy többfunkciós egycsatornás, 8 bites időzítő-számláló modul hardveres kimenettel PWM jel generálására és beépített aszinkron opcionális óragenerátorral, amely kvarc órajel (32768 Hz) használatára van optimalizálva. aszinkron órajel a rendszer szinkronizálásához képest.




Regiszterek

Timer-Counter Register (TCNT0) és Threshold Comparison Register (OCR0) – 8 bites. regisztereket. A megszakításkérés jelei a TIFR regiszterben időzítő megszakítási jelzőként jelennek meg. Minden megszakítást egyedileg maszkolnak az időzítő megszakítási maszk regiszter (TIMSK) segítségével. Az időzítő számláló órajelezhető belsőleg az előskálázón keresztül vagy aszinkron módon a külső TOSC1/2 érintkezőkön keresztül. Az aszinkron működést az ASSR regiszter vezérli. Az órablokk kiválasztja, hogy melyik óraforrást használja. Ha az órajelforrás nincs megadva, az időzítő számláló inaktív állapotban van. A clkT0 kimenet az időzítés kiválasztási logika kimenete.A kettős pufferelt összehasonlítási küszöbregiszter (OCR0) értékét folyamatosan összehasonlítjuk az időzítő számláló értékével. Az összehasonlítás eredménye felhasználható PWM vagy változó frekvenciájú négyszögjelek generálására az OC0 lábon. Ha az összehasonlítási küszöb megegyezik az időzítő számláló értékével, akkor az összehasonlítás eredményjelzője (OCF0) be van állítva, amivel az összehasonlítás eredménye alapján megszakítási kérést generálhatunk.

NP (alsó határ)

A számláló eléri a nullát (0x00)

MAX (maximális érték)

A számláló eléri a 0xFF maximális értéket (255 decimális)

VP (felső határ)

A számláló eléri a számlálás felső határát (számlálás teteje). A számláló teteje lehet a rögzített 0xFF érték vagy az OCR0 regiszter tartalma.

Időzítő-számláló óraforrások 0

A TC0 órajele lehet belsőleg szinkron, vagy külsőleg aszinkron (a belső rendszerórához képest). Az alapértelmezett a clkT0, amely egyenértékű a clkI/O-val. Ha az ASSR regiszter AS0 bitjébe „1” van írva, akkor a TOSC1 és TOSC2 érintkezők generátora szolgál forrásként.

Számláló blokk

A TC0 alapja egy programozható kétirányú számláló.


Jelek leírása (belső jelek):

Számlálás – 1-gyel növeli vagy csökkenti a TCNT0 értéket.

Irány – Beállítja a számlálás irányát: (+1, előre számlálás) vagy (-1, hátrafelé számlálás).

Reset – Visszaállítja a TCNT0 tartalmát (minden bitre 0-t ír).

clkT0 – Időzítő-számláló szinkronizálása.

Felső határérték – A TCNT0 maximális értékét állítja be.

Alsó határérték – A TCNT0 minimális értékét állítja be (0) .

A kiválasztott üzemmódtól függően a számláló minden clkT0 órajelciklusnál nullázódik, növekszik vagy csökken. A clkT0 órajel lehet belső vagy külső, frekvenciáját a CS02-CS00 bitek segítségével választjuk ki. Ha a szinkronizálási forrás nincs megadva (CS02-CS00=0b000), akkor az időzítő leáll. A TCNT0 állapot az időzítéstől függetlenül elérhető a CPU számára.A számlálási sorrendet a TCCR0 regiszter WGM01 és WGM00 bitjeinek beállítása határozza meg. Pontos kapcsolat van a számláló viselkedése és az OC0 kimeneten generált hullámforma között. A TC túlcsordulás jelző (TOV0) az üzemmódnak megfelelően van beállítva, amelyet a WGM01, WGM00 bitek választanak ki. A TOV0 bit CPU megszakítás generálására használható.

Összehasonlító blokk

A 8 bites digitális komparátor folyamatosan összehasonlítja a TCNT0 időzítő-számláló regiszter tartalmát az OCR0 összehasonlítási küszöbregiszterrel. Amikor a TCNT0 értéke megegyezik az OCR0 értékével, a komparátor az OCF0 illesztési jelzőt állítja be az időzítő következő órajelére. Ha a megszakítás engedélyezve van az OCIE0=1 bittel, akkor a match flag beállítása megszakítási kérést okoz. Az OCF0 jelző automatikusan törlődik a megszakítási feldolgozás során. A jelgenerátor az összehasonlító eredményjelet felhasználva téglalap alakú impulzusokat állít elő az egyik algoritmus szerint, amelyet az időzítő WGM01, WGM00 működési mód beállítási bitjei és a kimeneti jelgenerálási mód beállítási bitjei (COM01, COM00) választanak ki. A felső és alsó számlálási határértékek bizonyos üzemmódokban speciális műveletek végrehajtására szolgálnak.

Az OCR0 regiszter kettős pufferelési sémával valósul meg az impulzusszélesség-modulációs (PWM) módok használatakor. Normál és CTC módban a kettős pufferelési áramkör le van tiltva. A kettős pufferelés lehetővé teszi az OCR0 összehasonlító regiszter frissítésének szinkronizálását, amikor eléri a felső vagy alsó számlálási határt. Ez a szinkronizálás megakadályozza a páratlan hosszúságú kiegyensúlyozatlan PWM impulzusok generálását, ezáltal biztosítva, hogy a négyszöghullám-generálás ne sikerüljön.Az OCR0 regiszter elérése bonyolultnak tűnhet, de okkal történik. A kettős pufferelés engedélyezése után a CPU hozzáfér az OCR0 pufferregiszterhez, ha pedig le van tiltva, akkor közvetlenül az OCR0 regiszterhez.

Összehasonlítási eredmény kényszerítése

Az impulzusgenerálási módokban PWM nélkül az impulzusformálóban az összehasonlítás eredményét közvetlenül a FOC0 biten keresztül lehet beállítani. A komparátor összehasonlítási eredményének kényszerítése nem állítja be az OCF0 jelzőt, vagy nem indítja újra az időzítőt, de hatással van az OC0 láb állapotára, amely a COM01 kiválasztott beállításától függően be lesz állítva, törlődik vagy átkapcsol (invertál), COM00 bit. Ez a funkció lehetővé teszi, hogy az OCR0 regisztert a TCNT0 értékével megegyező értékre állítsa anélkül, hogy megszakítási kérést generálna, ha az időzítő-számláló óra engedélyezett.

Összehasonlító blokk használata

Mivel a TCNT0-ra írás blokkol minden, az összehasonlítási eredmény alapján végzett műveletet egy időzítő szinkronizálási ciklusra, az üzemmódtól függetlenül, amikor a TCNT0-t az összehasonlító csatorna használatakor módosítja (függetlenül attól, hogy az időzítő szinkronizálás működik-e vagy sem), a következő jellemzőket kell figyelembe venni. Ha a TCNT0 regiszterbe OCR0-val egyenlő értéket írunk, akkor az egyezés figyelmen kívül hagyása hibás hullámforma generálását eredményezi. Ha a számláló kivonó számlálóként működik, akkor kerülje az alsó határértékkel (0x00) egyenlő érték beírását a TCNT0-ba. Az OC0 beállítását meg kell tenni, mielőtt az I/O vonalat az irányregiszterben történő kimenetre állítaná.

Kimeneti jel generáló blokk

A kimeneti jelgenerálási mód beállítási bitjei (COM01:0) kettős célt szolgálnak. Egyrészt a COM01, COM00 biteket használja a jelkondicionáló, és meghatározza, hogy a következő egyezés bekövetkezésekor milyen logikai állapotnak kell lennie az OC0 kimeneten. Másrészt a COM01, COM00 bitek az OC0 port alternatív kimeneti funkciójának engedélyezésére/letiltására szolgálnak. Az ábrán a COM01, COM00 bitek által érintett egyszerűsített logikai diagram látható. P Csak azok az I/O portvezérlő regiszterek (DDR és PORT) állnak rendelkezésre, amelyeket a COM01, COM00 bitek érintenek.


Az univerzális I/O port vonalfunkcióját felváltja az OC0 jelkondicionáló kimeneti funkciója, ha a COM01, COM00 bitek legalább egyike egyenlő 1-gyel. Az OC0 kimeneti irányának vezérlése azonban (bemenet vagy kimenet) ebben az esetben a B port adatirány-regiszterének megfelelő bitjénél marad (DDRB.4). Ahhoz, hogy az OC0 regiszter értéke jelen legyen az OC0 lábon, ezt a sort kell kimenetként konfigurálni (a DDRB.4 bitet beállítani). Az alternatív funkció bemeneti vezérlése független a jelgenerálási módtól.

Időzítő-számláló üzemmódok 0

Időzítő üzemmód, beleértve Az időzítő számláló és a hozzá tartozó jelkondicionáló kimenet viselkedését az időzítő működési módját (WGM01, WGM00) és a kimeneti jel generálási módját (COM01, COM00) meghatározó bitek kombinációja állítja be. Ebben az esetben a kimeneti jel generálási mód beállítására szolgáló bitek nem befolyásolják a számláló algoritmust, mert A számláló algoritmus csak az időzítő mód beállítási bitjeinek állapotától függ. PWM módban a COM01, COM00 bitek lehetővé teszik az inverzió engedélyezését/letiltását a generált PWM kimeneten (azaz válassza ki a PWM inverzióval vagy PWM inverzió nélkül). Nem PWM módok esetén a COM01:0 bitek határozzák meg, hogy milyen műveletet kell végrehajtani, ha az összehasonlítási feltétel teljesül: alaphelyzetbe állítás, beállítás vagy a kimenet megfordítása.

Az időzítő működési módjait fent leírtuk (normál (számlálás), egyidejű reset, gyors PWM és fáziskorrigált PWM).

A 0 időzítő számláló aszinkron működése

Ha az időzítő 0 számlálója aszinkron módon működik, akkor néhány jellemzőt figyelembe kell venni. Az aszinkron és a szinkron időzítő-számláló órajelforrások közötti váltáskor a TCNT0, OCR0 és TCCR0 regiszterek tartalma megsérülhet. Ennek elkerülése érdekében a következő biztonságos kapcsolási sorrendet kell követni:

1. Az OCIE0 és TOIE0 bitek törlésével tiltsa le a Timer-Counter 0 megszakításokat.

2. Válassza ki a kívánt órajelforrást az AS0 bit segítségével

3. Írjon új értékeket a TCNT0, OCR0 és TCCR0-be.

4. Amikor aszinkron órajel módra vált, várja meg, amíg a TCN0UB, OCR0UB és TCR0UB jelzők visszaállnak.

5. Reset Timer-Counter 0 Interrupt Flags

6. Szükség esetén engedélyezze a megszakításokat

A generátor 32768 Hz-es órajeles kvarcrezonátor használatára van optimalizálva. A CPU órajelének legalább négyszer nagyobbnak kell lennie a generátor frekvenciájánál. A TCNT0, OCR0 vagy TCCR0 kódba írás a TOSC1 két pozitív éle felett történik, mivel Az adatok először egy ideiglenes nyilvántartásba kerülnek, majd továbbítják a rendeltetési helyre. Mindhárom említett nyilvántartásnak megvan a maga egyedi ideiglenes nyilvántartása. Ez azt jelenti, hogy például a TCNT0-ba írás nem befolyásolja az OCR0 regiszterbe történő írás folyamatát. Annak meghatározásához, hogy melyik regiszterbe íródott, egy aszinkron állapotregiszter, az ASSR kerül megvalósításra.

Ha aszinkron üzemmód van kiválasztva, akkor a 32768 Hz-es generátor folyamatosan be van kapcsolva, kivéve a leállítási módot és az MK készenléti üzemmódját.

Időzítő-számláló előskálázó 0


A TC0 órajelforrás neve clkT0. Alapértelmezés szerint a clkT0 a clkI/O-hoz csatlakozik. Ha az AS0 bit = 1 az ASSR regiszterben, akkor a TC0 órajele aszinkron módon történik a TOSC1 lábról. Így a TC0-t valós idejű óraként (RTC) használhatja. Ha AS=1, akkor a TOSC1 és TOSC2 érintkezők nem szolgálnak C portként, és külön órajelforrásként kvarc rezonátor köthető közéjük. Nem javasolt külső óraforrás csatlakoztatása a TOSC1 érintkezőhöz.Az előskálázó lehetővé teszi a következő órajelek kiválasztását: clkT0S/8, clkT0S/32, clkT0S/64, clkT0S/128, clkT0S/256 és clkT0S/1024. Lehetőség van a szinkronizálás leállítására. Ha PSR0=1 az SFIOR regiszterben, alaphelyzetbe állítja az előskálázót.

A 8 bites időzítő-számláló 0 regiszterek leírását lásd a specifikációban.

13. lecke

1. rész

PWM Zökkenőmentesen villogó LED

Ma megvizsgáljuk a felhasználás lehetőségét impulzus szélesség moduláció egy mikrokontrollerben AVR vagy ahogy az emberek mondják, PWM.

A műszaki dokumentációban gyakrabban fogjuk látni a rövidítést PWM vagy impulzusszélesség moduláció, ami le is van fordítva.

Egyébként mi az impulzusszélesség moduláció?

PWM- ez a LED-ek világításának, a motorok forgásának és egyéb berendezések szokatlan módon történő vezérlése, amelyben ezt a vezérlést nem az érintkezőkre kapcsolt feszültség, hanem négyzetimpulzusok végzik. Ebben az esetben csak kétféle feszültség lesz - magas ( 1 ) és alacsony ( 0 ). Ezzel a módszerrel a kapott feszültséget az egy impulzus magas állapotának időpontja és az alacsony állapot közötti idő átlagaként számítjuk ki. Kiszámítjuk a magas állapot idejének (vagy szélességi fokának) az impulzus teljes periódusához viszonyított arányát. Ezt az impulzus munkaciklusának nevezzük. Ez azt jelenti, hogy minél inkább magas állapotban volt a feszültség az adott periódus alatt, annál nagyobb a munkaciklus, és ennek következtében annál nagyobb az átlagos feszültség. Vagyis a kapott feszültség meghatározásához meg kell szoroznunk a kellően kiszámított munkaciklust a feszültséggel, és el kell osztanunk 100-zal, mivel a munkaciklust általában százalékban mérik. Például, ha egy négyzetimpulzusban a logikai nulla szélessége egyenlő a logikai egy szélességével, akkor a munkaciklus 50 százalék lesz, és ha a feszültség 5 volt, akkor az átlagos eredő feszültség 2,5 volt stb. A helyzet magyarázatáról jobb képet láthatunk, ha megnézzük az oktatóvideót, amelynek linkje a cikk végén található.

Ez természetesen a PWM nagyon leegyszerűsített fogalma. Ennek a technológiának vannak komolyabb magyarázatai is, de kísérleteinkhez ez is elég lesz.

Azaz, a magyarázatot összefoglalva, az impulzusok munkaciklusának változtatásával szabályozzuk a kapott feszültséget, valamint a LED izzását, az elektromos motor szögsebességét és egyéb értékeket.

De mégis, a legérdekesebb dolog az, hogy mindez hogyan van megszervezve a mikrokontrollerünkben?

Egy mikrokontrollerben AVR impulzusszélesség modulációúgy szervezhető meg programozottan, így hardver.

Szoftver szervezet PWM- ekkor kapcsolunk be egy logikait a vezérlő lábán egy bizonyos ideig, majd egy bizonyos ideig - egy logikai nullát, és így tovább egy ciklusban. Ennek a módszernek az az előnye, hogy tudjuk szervezni PWM Bármely vezérlőport abszolút bármely szakaszán, és az a hátránya, hogy mindez jelentős processzoridő-költséggel jár majd, sőt az ebből adódó hibákkal is járhat.

Ezért minden technológiában igyekszünk betartani a hardveres megvalósítási módot.

Hardver szervezet PWM az MK-ban AVR szinten fordul elő időzítő 2.

Ahogy az előző leckéből emlékszünk, három időzítő van a mi konkrét Atmega8 mikrokontrollerünkben. Mind a 0, mind a 2 időzítő nyolc bites. De a 2. időzítő szintjén az impulzusszélesség-moduláció meg van szervezve.

Nézzük ezt a képet

Ez azt mutatja, hogy mely biteket kell engedélyeznünk a regiszterben TCCR második időzítő az impulzusszélesség-moduláció elindításához.

A WGM bitek az időzítőt PWM (PWM) módba kapcsolják. A fennmaradó részekkel később foglalkozunk, ha szükséges.

És most, hogy mindezt érezzük, szükségünk van egy projektre, amelyet most meg fogunk hozni.

A projektet ugyanúgy készítjük el, mint az előző órákon. Nevezzük Test10-nek, hozzuk létre és adjuk hozzá a PWM.c és PWM.h fájlokat, ez utóbbi automatikusan formát ölt, amikor a megfelelő direktívákkal létrejön az előfeldolgozó. A fő fájlba pedig a Test01.c fogjuk írni a szabványos kódot

#beleértve"fő.h"

//—————————————-

üres port_ini( üres)

PORTB=0x00;

DDRB=0x08;

//—————————————-

int fő-( üres)

Port_ini();

Míg(1)

Ahogy a kódban látjuk, a B porton a 3-as érintkezőt csatlakoztattuk a kimenetre. A vezérlő kivezetésében látjuk, hogy ennek a lábnak van egy alternatív megnevezése OC2, ami azt jelenti, hogy ez a láb közvetlenül működhet a PWM-mel

Akár az utolsó lecke main.h fájlját is csatlakoztathatjuk LCD-n, és egy kicsit javíthatjuk a kódot, ha oda csatlakoztatjuk az új PWM modulunkat

#ifndef MAIN_H_

#define MAIN_H_

#define F_CPU 8000000UL

#beleértve

#beleértve

#beleértve

#beleértve

#beleértve

#beleértve"PWM.h"

#endif /* MAIN_H_ */

Nos, most kezdjük el a kód írását egy új könyvtárba, amely közvetlenül a PWM-mel működik – a PWM.c fájlban.

Ott a fejlécfájlt is beépítjük, és létrehozunk egy függvénykeretet a PWM-mel való munkához

#beleértve"PWM.h"

üres init_PWM_timer( üres)

{

}

És hozzáadjuk ennek a függvénynek a prototípusát a könyvtárunk fejlécfájljához, és összekapcsoljuk a könyvtárat a megszakításokkal való munkavégzéshez

#ifndef PWM_H_

#define PWM_H_

#beleértve

üres init_PWM_timer( üres);

#endif /* PWM_H_ */

És azonnal hívja meg ezt a függvényt a main()

port_ini();

init_PWM_timer();

Kezdjük el közvetlenül a függvénybe írni a kódot. Először az összes nullát beírjuk a regiszterbe ASSR, ami létezik az időzítőben, de nem használjuk semmilyen módon

üres init_PWM_timer( üres)

ASSR=0x00;

Ezután térjünk át az időzítőnk vezérlőregiszterére. Megbeszéltük a WGM bitek célját és azokat, amelyeket bekapcsolunk. Most a COM20 és COM21 bitek felelősek magáért a PWM módért. Kiválasztjuk ezt a módot, és ennek megfelelően bekapcsoljuk ezeket a biteket

És bekapcsolunk egy üzemmódot, amelyben a számlálás kezdetén az OC2 láb feszültsége magas logikai állapotban lesz, és amint egy bizonyos számig számolunk, a láb alacsony állapotba kerül. és a számolás végéig benne marad. És így tovább egy körben.

És már csak az elválasztót kell felállítani. Nincs szükségünk túl magas frekvenciára. De amikor túl kicsi volt, akkor a villogás is érezhető volt, úgyhogy kapcsoljuk be a következő értéket

Tehát mindhárom bitet bekapcsoljuk.

Ennek eredményeként a regiszterérték így fog kinézni

ASSR=0x00;

TCCR2=0b01101110; //Gyors PWM, Clear OC2 on Compare Match, clkT2S/256 (előskálázóból) (a valós frekvencia 8 MHz/256 = 31250 Hz)

Most próbáljuk meg összeállítani a projektet. Jól összejött a projekt. A következő részben a PWM-mel folytatjuk a munkát.

Nézze meg az oktatóvideót (kattintson a képre)

Megtekintések száma: 9484

A mikrokontroller eszközökben néha szükség van analóg jel generálására. Az analóg jel frekvenciájától, a szükséges felbontástól és a használt mikrokontroller típusától függően ez többféleképpen is megtehető. Nevezetesen: impulzusszélesség-moduláció, hardveres időzítők funkcionalitásának vagy szoftveres megvalósításának alkalmazása, beépített digitális-analóg átalakító (DAC), külső digitális-analóg átalakító áramkörök használata diszkrét elemeken, vagy külső digitális használata -analóg átalakító mikroáramkörök.

1. Az analóg jel generálásának elve PWM (PWM) segítségével

A PWM jel olyan digitális jel, amelynek ismétlési periódusa állandó, de időtartama változó. A PWM jel időtartamának és periódusának arányát munkaciklusnak nevezzük. Egy ilyen jelet egy aluláteresztő szűrőn átvezetve, ami lényegében egyenértékű az integrációval, a szűrő kimenetén a munkaciklussal arányos feszültségszintet kapunk.


Így ezzel az együtthatóval tetszőleges alakú analóg jelek generálhatók. Sőt, mindkettő változó, például szinuszhullám, fűrész vagy emberi beszéd, és állandó (tetszőleges feszültségszint).

1.1 A jel jellemzői

Maximális analóg kimeneti amplitúdó A digitális PWM jel logikai egységének amplitúdója határozza meg. Ha a mikrokontroller +5 V-ról táplálkozik, akkor durván szólva a kimenő analóg jel amplitúdója 0 és 5 V között lesz.

Az analóg jel változásának minimális lépése(felbontás) a következő kifejezés határozza meg:


dUa = Umax/2^n,


ahol Umax az analóg jel maximális amplitúdója (V), és n a PWM-et megvalósító számláló bitmélysége.

Például egy PWM jelet egy szoftveres 8 bites számláló segítségével állítanak elő. Az ezzel a számlálóval elérhető PWM-jel fokozatok száma 2^8 = 256. Ekkor az analóg jel felbontása Umax = 5 V-nál egyenlő lesz


dUa = 5/256 = 0,0195 V.


PWM jel frekvenciájaígy lesz meghatározva:


Fpwm = Fcpu/(K*2^n),


ahol Fcpu a mikrokontroller órajel frekvenciája (Hz), K a számláló előskálázó együtthatója, n a számláló bit mérete.

Például egy mikrokontroller órajel-frekvenciája 8 MHz, az előskálázó együtthatója 8, a számláló szélessége pedig 8 bit. Ekkor a kimenő PWM jel frekvenciája egyenlő lesz:

Fpwm = 8000000/(8*256) = ~3906 Hz


Analóg kimeneti frekvencia a következő kifejezés határozza meg:

Fa = Fpwm/Ns = Fcpu/(K*2^n*Ns),


ahol Fpwm a PCB jel frekvenciája, Ns pedig az analóg jel mintáinak száma.

Például egy PWM jelet egy 8 bites számlálón valósítanak meg, 8-as előskálázó együtthatóval és 8 MHz-es mikrokontroller órajellel. A mikrokontroller memóriája 32 szinuszos jel mintát tartalmaz, amelyek egy periódust képviselnek. Ekkor a kimeneti szinusz frekvenciája egyenlő lesz:

Fa = 8000000/(8*2^8*32) = ~122 Hz

A PWM alapján készült DAC kapacitása megegyezik a használt számláló kapacitásával.

1.2 A PWM hardveres megvalósítása

Minden modern mikrokontroller tartalmaz időzítőt/számlálót. Ezen időzítők egy vagy több üzemmódja PWM jel generálására szolgál. Jellemzően ez a jel speciális érintkezőkön jön létre. Például az Atmel mega16 mikrokontrollerének van egy 8 bites T0 időzítője/számlálója, amely két üzemmóddal rendelkezik a PWM jel generálására (gyors PWM és PWM precíz fázissal), és a B - OC0 (PINB3) port pinjét használják kiadja a jelet.

A PWM jel hardveres megvalósításának előnye a mikrokontroller alacsony terhelése (a megszakítást egyszer hívják a PWM jel időtartama alatt), a könnyű kezelhetőség és a pontosság (ha kevés megszakítás van a rendszerben). A hátrányok közé tartozik a számlálók korlátozott felbontása, alacsony frekvencia, korlátozott számú csatorna, amelyen PWM jelek generálhatók. Bár vannak speciális mikrokontrollerek, amelyeket kifejezetten nagyszámú PWM jel generálására „élesítettek ki”.

1.3 A PWM szoftveres megvalósítása

PWM jelet programozottan is generálhat. Ehhez egyszerűen létre kell hoznia egy szoftveres számlálót, és a hardveres időzítő jele alapján növelni kell az értékét, és figyelemmel kell kísérnie a számláló szélsőértékeinek elérését, amelyeknél a PWM jel állapota megváltozik.

A szoftveres megvalósítás előnye az egyszerűség, a korlátlan számú csatorna, a korlátlan felbontás. Természetesen feltételesen korlátlan, figyelembe véve a rendelkezésre álló memóriát.A szoftver megvalósításának hátrányai a nagy mikrokontroller terhelés. Megszakításokat kell hívni a számláló minden lépésénél, és minden alkalommal ellenőrizni kell, hogy elérte-e valamelyik szélső értéket. Ezenkívül a szoftveres megvalósítás kisebb pontossággal (nagyobb jelélek jittere) és még alacsonyabb frekvenciával rendelkezik (az első hátrány miatt).

Ennek ellenére a PWM szoftveres megvalósításának is helye van, ha állandó analóg jelet vagy váltakozó jelet kell generálni, de alacsony frekvenciával.

Az alábbiakban egy példa látható olyan kódra, amely hardveres és szoftveres impulzusszélesség-moduláció segítségével analóg jelet generál. A kód az atmega16 mikrokontrollerhez, 8 MHz órajelű, IAR fordítóhoz van írva. A PB2 és PB3 kimeneteken két (különböző frekvenciájú) szinusz jön létre, 32 két mintából.


#beleértve
#beleértve
#beleértve

#define SPWM_PIN 2

//szinusztábla
__flash uint8_t tableSin =
{
152,176,198,218,234,245,253,255,
253,245,234,218,198,176,152,128,
103, 79, 57, 37, 21, 10, 2, 0,
2, 10, 21, 37, 57, 79,103,128
};

uint8_t softCount = 0;
uint8_t softComp = 0;

int main(üres)
{
//port beállítások
PORTB = 0;
DDRB = 0xff;

//megszakítás engedélyezése véletlen T0 alapján
TIMSK = (1<//FastPWM mód, nem inv. PWM jel, előskálázó 8
TCCR0 = (1< (0<

//visszaállítja a számláló regisztert
TCNT0 = 0;
OCR0 = 0;

Enable_interrupt();
míg(1);
visszatérés 0;
}

//megszakítási időzítő T0
#pragma vektor = TIMER0_COMP_vect
__interrupt void Timer0CompVect(void)
{
statikus uint8_t i = 0;
statikus uint8_t j = 0;

OCR0 = tableSin[i];
i = (i + 1) & 31;

//szoftver PWM
softCount++;
if (softCount == 0)(
PORTB |= (1<softComp = tableSin[j];
j = (j + 1) & 31;
}

If (softCount == softComp)(
PORTB &= ~(1< }
}

1.4 PWM szűrő

A szűrő vágási frekvenciájának a generált analóg jelek maximális frekvenciája és a PWM jel frekvenciája között kell lennie. Ha a szűrő vágási frekvenciáját az analóg jel sávszélességének széléhez közel választja meg, az csillapítja a jelet. És ha a szűrő vágási frekvenciája közel van a PWM jel frekvenciájához, az analóg jel egyszerűen nem fog „kiemelni”. Minél nagyobb a PWM jel frekvenciája, annál könnyebb a kimeneti szűrő megvalósítása.

Nézzünk egy példát. A PWM jelet egy hardveres 8 bites számláló állítja elő 8-as előskálázó tényezővel, a mikrokontroller órajel frekvenciája 8 MHz, az analóg jelminták száma 32.

A PWM jel frekvenciája egyenlő lesz:

Fpwm = Fcpu/(K*2^n) = 8000000/(8*256) = ~3906 Hz

Az analóg jel frekvenciája egyenlő lesz:

Fa = Fpwm/Ns = 3906/32 = 122 Hz

Válasszunk 200 Hz-es vágási frekvenciát, és számítsuk ki a passzív aluláteresztő RC szűrő névleges értékét. Egy ilyen szűrő vágási frekvenciáját a következő kifejezés határozza meg:

Fc = 1/(2*Pi*R*C),

ahol R az ellenállás értéke (Ohm), C pedig a kondenzátor kapacitása (F).

Az egyik komponens értékének megadása után kiszámolhatja a második értékét. 1 kOhm névleges értékű ellenállás esetén a kondenzátor kapacitása egyenlő lesz:


C = 1/(2*Pi*Fc*R) = 1/(6,28 * 1000*200) = ~0,8 µF


Az E12 sorozatból a legközelebbi értéket választjuk ki - 0,82 µF. Ezekkel a szűrőértékekkel hasonló analóg jelet kapunk.

Általában azonban egy passzív szűrőelem nem lesz elegendő. Mert utána az analóg jel továbbra is nagyszámú harmonikust fog tartalmazni.

Miután villogtattuk a LED-eket, kitaláltuk az órajel- és megszakítási forrásokat, eljött az idő, hogy elsajátítsuk az MSP430G2553 vezérlő időzítőjét.
Az időzítő egy számláló mechanizmus, amely az óragenerátor jelének impulzusaihoz van kötve. Timer A Timer_A egy 16 bites időzítő. Ez azt jelenti, hogy nullától binárisig számol: 0b1111111111111111, hexadecimális 0xFFFF vagy decimális 65535. Az időzítő egy periféria, és saját megszakításokkal is rendelkezik.
A Timer_A három üzemmóddal rendelkezik.

Folyamatos számlálási mód, amelyben az időzítő egyszerűen 0-tól 0xFFFF-ig számol, majd elölről kezdi, és így tovább a végtelenségig.

Közvetlen számláló mód, amelyben az időzítő ugyanúgy működik, a felső határig számol, és újra 0-tól indul. Csak ebben a módban választhatja ki azt a felső határt, ameddig az időzítő számol.

A fordított számlálási mód hasonló az előre számláló módhoz, mivel kiválaszthatja az időzítő maximális értékét. Különbsége, hogy a maximumot elérve az időzítő elkezd visszaszámlálni, majd a 0 elérésekor újra felfelé kezd stb.
A grafikonokon a TACCR0 jelölés található - ez az összehasonlító rögzítési regiszter. A modelltől függően kettő (TACCR0 és TACCR1), vagy három (TACCR0, TACCR1 és TACCR2) lehet. Ebben a regiszterben úgynevezett kulcspontokat írhatunk, amelyek elérésekor az időzítő megszakítást indít.

Az A időzítő regisztereit az alábbiakban részletesen ismertetjük:
TACTL– Timer_A Control Register, Timer A vezérlőregiszter Az időzítő órajelekkel való összekapcsolására és az üzemmódok kiválasztására szolgál.
TASSELx 8. és 9. bit, mondja meg az időzítőnek, hogy melyik órát használja.
IDx A 6. és 7. bit jelzi, hogy melyik óraosztót kell használni, 2-t, 4-et vagy 8-at. Az osztó alkalmazása után kapott frekvencia az óragenerátorban felosztásra kerül.
MCx, a 4. és 5. bitek jelzik az időzítő működési módját. Ha egyenlők 0-val (az alapértelmezett érték), az időzítő teljesen leáll.
TACLR, 2. bit. Ha 1-est ír be, akkor az időzítőt alaphelyzetbe állítja. A mikrokontroller az időzítő újraindítása után automatikusan 0-t ír erre a bitre.
TAIE és TAIFG, 0. és 1. bit. Ők szabályozzák az időzítő megszakítását, erről alább.
KÁTRÁNY– Timer_A Register, Timer A számláló regiszter, az időzítő aktuális értékét tartalmazza.
TACCRx– Timer_A Capture/Compare Registers, Timer A rögzítési/összehasonlító regiszterek.Kettő lehet (TACCR0 és TACCR1), lehet három (TACCR0, TACCR1 és TACCR2) a mikrokontroller típusától függően. Összehasonlító módban olyan értékeket adunk meg beléjük, amelyek elérésekor az időzítőnek jelet kell adnia. A TACCR0-t gyakran használják a számlálás felső határának jelzésére. Capture módban a processzor a bemeneti jel alapján az aktuális TAR értéket írja beléjük.
TACCTLx– Timer_A Capture/Compare Control Registers, Timer Egy rögzítési/összehasonlítási blokkvezérlő regiszter, melynek értékétől függ a rögzítési/összehasonlító regiszterek működési módja.
CMx A 14. és 15. bit határozza meg a rögzítéshez használt jel típusát. (Emelkedéskor, süllyedéskor, mindkét fronton. - Megjegyzés per.)
CCISx,12. és 13. bit, válassza ki, honnan jön a rögzítési jel.
SCSés az SCCI 11. és 10. bitjei szinkronizálják a rögzítési jelet az időzítő órajelével. Az időzítő jellemzően a külső jelektől függetlenül, aszinkron módon működik. (Én magam nem értettem teljesen ezt a funkciót, a következő leckékben részletesebben írok)
SAPKA, 8. bit, működési mód kiválasztása, 1 – rögzítési mód, 0 – összehasonlító mód.
OUTMODx, 5-7 bitek, a kimeneti modul működési módjának kiválasztása, pl. egy rögzítési vagy összehasonlítási eseményre adott válasz típusa.
CCIE és CCIFG, 4. és 0. bit, rögzíti/összehasonlítja a megszakítási feldolgozást.
CCI és OUT, 3. és 2. bit, rögzíti/összehasonlítja a bemenetet és a kimenetet.
COV, 1. bit, rögzítési túlcsordulás. Állítsa 1-re, ha második rögzítés történt, és az elsőt még nem olvasta be. Szoftverrel vissza kell állítani.
TAIV– Timer_A Interrupt Vector Register, Timer Egy megszakítási vektor regiszter Mivel az időzítő megszakítást többféle ok is előidézheti, ennek a regiszternek a tartalma jelzi a megszakítás hívásának okát.
TAIVx Az 1-3 bit tartalmazza a megszakítás típusát, amely lehetővé teszi számunkra, hogy különböző lépéseket tegyünk a megszakítások különböző okainak kezelésére.

Tehát, ha csak egy LED-et kell villogni, vagy relét kell kapcsolni, vagy hasonlókat bizonyos időközönként, akkor ebben az esetben az időzítő konfigurálása nagyon egyszerű.

TACCR0 = 62499; // periódus 62 500 ciklus TACCTL0 = CCIE; // Lehetővé teszi az időzítő megszakítását a CCR0 érték elérésekor. TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR; //A működési mód beállítása Timer_A: // TASSEL_2 - óraforrás SMCLK (SubMainCLocK), // alapértelmezés szerint DCO-ról működik // ID_3 - 8-as frekvenciaosztó, 1 MHz-től 125 kHz lesz // MC_1 - közvetlen számlálási mód (TACCR0-ig) // TACLR - az időzítő kezdeti visszaállítása

De bonyolítsuk egy kicsit a feladatot, és tegyük simán világítani és kialudni a LED-et. Ehhez PWM-et kell használnunk. A PWM elve az, hogy impulzusokban táplálja a feszültséget rögzített frekvenciával és változó munkaciklussal. A PWM-et olyan paraméter jellemzi, mint a munkaciklus - ez a munkaciklus reciproka, és egyenlő az impulzus időtartamának és periódusának arányával.

Az érthetőség kedvéért az alábbi ábra a munkaciklusra vonatkozó PWM jeleket mutatja: a – 25%; b – 50%; c – 75%; g – 100%.

t0 – impulzusidő;
T – időszak;
A t0 megváltoztatásával különböző átlagos feszültségértékeket kaphat a terhelésen keresztül, ezzel megváltoztatva a LED fényerejét.
Az impulzusszélesség-modulációs periódusnak állandónak és nagyobbnak kell lennie, mint az impulzusidő. Ezért írjuk le TACCR0 = 600; // periódus 600 ciklus. Ezt a számot kísérletileg választottam ki, hogy az időzítő működése szabad szemmel is látható legyen.
Mivel a LED-nek lassan világítania kell, a kezdeti impulzusidőnek nagyon rövidnek kell lennie, pl. TACCR1 = 10; // impulzusidő 10 ciklus. A TACCR1 az A időzítő második rögzítő/összehasonlító regisztere. Így kiderül, hogy a TACCR0 = 600 érték elérésekor az időzítő egy megszakítást generál, amelyben a mikrokontroller kimenetét 1-re állítjuk, ami a kezdete lesz a pulzus. Ebben az esetben az időzítő nullázódik és újra nullától kezd számolni, amíg el nem éri a TACCR1 = 10-et, majd a második rögzítési/összehasonlító regiszterben egy megszakítás generálódik, amiben a mikrokontroller kimenetét nullára állítjuk. Így a t0 impulzus időtartama 5 óraciklusig tart.
Ahhoz, hogy a LED növelje az izzás intenzitását, növelni kell az impulzus idejét. Ehhez a TACCR0 minden megszakítása után hozzáadunk némi értéket a TACCR1 aktuális értékéhez. Ebben az esetben a TACCR1 maximális értéke megegyezik a periódussal, azaz 600-zal. A hozzáadott értéktől függően a ragyogás intenzitásának simasága és változásának sebessége függ.

TACCR0 = 600; // TACCR1 periódus = 5; //Impulzusidő TACCTL0 = CCIE; // Lehetővé teszi az időzítő megszakítását a CCR0 elérésekor. TACCTL1 = CCIE; // Lehetővé teszi az időzítő megszakítását a CCR1 elérésekor. TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR; //A Timer_A üzemmód beállítása

Most meg kell írni egy megszakításkezelőt a TACCR0-hoz, amely beállítja minden új periódus kezdetét, valamint hozzáadja vagy kivonja a TACCR1 értékét, hogy a LED egyenletesen világítson és ugyanolyan egyenletesen kialudjon.

#pragma vektor = TIMER0_A0_VECTOR __interrupt void CCR0_ISR(void) //megszakítási vektor a TACCR0-hoz, A időzítő ( P1OUT |= BIT0; // a nulla bitet állítsa 1-re if (TACCR1><=5) // если TACCR1 меньше минимального значения, то увеличиваем TACCR1 { indeX=2; } if (indeX == 1) { --TACCR1; // уменьшаем TACCR1 на 1 } if ((indeX == 2) || (indeX == 0)) { ++TACCR1; // увеличиваем TACCR1 на 1 } }

A TACCR1 megszakítása így fog kinézni.

#pragma vector=TIMER0_A1_VECTOR __interrupt void CCR1_ISR(void) //megszakítási vektor a TACCR1 számára, időzítő A ( P1OUT &= ~BIT0; // a P1 port nulla bitjét nullára állítja. TAIV &= ~TA0IV_TACCR1; // a megszakítás alaphelyzetbe állítása zászló.)

Kérjük, vegye figyelembe, hogy az első esetben a TACCR0 megszakításkezelőjében nem alaphelyzetbe állítottam a megszakítási jelzőt, de a TACCR1 esetében ezt megtettem. Ennek az az oka, hogy a TACCR0 megszakítási jelzője automatikusan alaphelyzetbe áll ilyen megszakítás hívásakor, de a TACCR1 esetében manuálisan kell visszaállítani.

Most összeállíthatja a program teljes szövegét.

#beleértve /* Globális változók */ unsigned int indeX = 0; /* Funkciódeklaráció */ void main(void) ( WDTCTL = WDTPW + WDTHOLD; // letiltja a watchdog időzítőt P1DIR |= 0x01; // állítsa be a P1 port nulla bitjét a kimenetre P1OUT = 0x01; // állítsa be a nullát A P1 port bitje 1 BCSCTL1 = CALBC1_1MHZ; // Állítsa be a DCO frekvenciát DCOCTL = CALDCO_1MHZ; TACCR0 = 600; // Időszak TACCR1 = 10; // Impulzusidő TACCTL0 = CCIE; // A CCR0 időzítő megszakadásának engedélyezése elérve: TACCTL1 = CCIE; // Az időzítő megszakításának engedélyezése a CCR1 elérésekor TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR; //A Timer_A üzemmód beállítása: // TASSEL_2 - SMCLK órajelforrás (SubMainCLocK), // alapértelmezés szerint konfigurálva DCO-ról működtetni // ID_3 - 8-as frekvenciaosztó, 1 MHz-től 125 kHz lesz // MC_1 - közvetlen számlálási mód (TACCR0-ig) // TACLR - az időzítő kezdeti visszaállítása _enable_interrupt(); // minden megszakítás engedélyezése ) #pragma vektor = TIMER0_A0_VECTOR __interrupt void CCR0_ISR(void) //megszakítási vektor a TACCR0-hoz, A időzítő ( P1OUT |= BIT0; // a nulla bitet állítsa egyre if (TACCR1>=(TACCR0-5)) // ha a TACCR1 nagyobb, mint TACCR0, majd csökkentse a TACCR1-et (indeX=1; ) if (TACCR1<=5) // если TACCR1 меньше минимального значения, то увеличиваем TACCR1 { indeX=2; } if (indeX == 1) { --TACCR1; // уменьшаем TACCR1 на 1 } if ((indeX == 2) || (indeX == 0)) { ++TACCR1; // увеличиваем TACCR1 на 1 } } #pragma vector=TIMER0_A1_VECTOR __interrupt void CCR1_ISR(void) //вектор прерывания для TACCR1, Таймера А { P1OUT &= ~BIT0; // устанавливаем нулевой бит порта Р1 в ноль. TAIV &= ~TA0IV_TACCR1; //сбрасываем флаг прерывания. }

Tehát felvillantjuk a vezérlőt, elindítjuk a programot és látjuk, hogy a piros LED lassan kigyullad és kialszik, világít és kialszik.
Ez a program nagyon kényelmes a gyakorlatban. Tegyük fel, hogy módosítani kell egy dióda lámpa fényerejét vagy egy egyenáramú motor forgási sebességét, mindezt a PWM segítségével tökéletesen meg lehet valósítani, ami az MSP430G2553 vezérlőben elérhető időzítővel vezérelhető. Az egyenáramú motor PWM-mel történő vezérléséről szóló cikksorozat minden bizonnyal megjelenik honlapunkon, ahol ezeket a készségeket a gyakorlatban is alkalmazni fogjuk.