Reklama

Základy ovládání mikrokontroléru ATmega(16/32) 11.díl – Čítač / Časovač (1.část – Základní popis)

Úvod

Po dílech s A/D převodníkem je nyní na řadě čítač/časovač, který se používá pro odměření časových intervalů, nebo pro vytváření akcí na základě uplynulého času. Vezmeme si příklad, že bychom chtěli po 1 s měnit stav pinu, na kterém je např. LED dioda. Asi nejjednodušší by bylo vytvořit zpoždění pomocí _delay_ms(1000), viz: Vytvoření zpoždění pro mikrokontrolér ATmega v programovacím jazyce C. Ale co kdyby během čekání na změnu stavu LED diody bylo potřeba provádět jiný kód? Tak tento způsob nelze použít, protože celou 1s nebude mikrokontrolér dělat nic jiného, než počítat zpoždění. Proto je výhodné použít časovač, kde nastavíme požadovaný čas a když dojde k uplynutí požadované doby, provede se přerušení se změnou stavu LED diody a celou sekundu může mikrokontrolér dělat jiné věci. Samozřejmě někdo může říct, že rozdělíme jedno dlouhé čekání 1000 ms na deset 100 ms intervalů a mezitím, můžeme zkopírovat potřebný kód, ale toto řešení vede na nepřehledný a větší zdrojový kód, ale hlavně s každou drobnou změnou se musí celý řetězec přepočítat apod. Dalším příkladem použití může být například zjištění délky trvání pulsu. Na pin s externím přerušením přivedeme signál, který po změně stavu vyvolá přerušení a v obsluze přerušení spustíme časovač. V následující obsluze přerušení si vyčteme počet pulsů, které časovač provedl a vynásobíme s časem, který trvá jeden puls. Samozřejmě způsobů použití čítače/časovače je velké množství např. použití časovače pro měření vzdálenosti ultrazvukem viz.:
Zapojení ultrazvukového modulu HC-SR04 s mikrokontrolérem ATmega32

Mikrokontrolér ATmega16/32 obsahuje dva 8bitové čítače/časovače a jeden 16bitový čítač/časovač. Práce s jednotlivými čítači/časovači je velmi podobná, proto se v tomto přípěvku zaměříme pouze na 8bitový čítač/časovač 0. Pro důkladný popis všech čítačů/časovačů doporučují publikaci [2].
 
Čítač/časovač 0 jak již bylo napsáno je 8bitový a obsahuje 10bitová předděličku hodinového taktu mikrokontroléru. Čítač/časovač 0 může vyvolat přerušení po přetečení hodnoty čítače, dále může také vyvolat přerušení po shodě registru TCNT0 s nastavenou hodnotou registru OCR0, nebo může pracovat ve dvou režimech jako generátor PWM průběhu.
 
Jako první si v krátkosti představíme čtyři režimy, ve kterých může čítač/časovač 0 pracovat. Společné pro všechny režimy pracující s pinem OC0 (PB3) je, že tento pin musí být nastaven jako výstupní v registru DDRB.

Normální režim

 

Jedná se o režim, kde registr TCNT0 čítá nahoru až do doby než jeho hodnota „přeteče“, tzn. že dosáhne svého maxima (0xFF) a začíná čítat opět od nuly. Při dosažení nuly se nastaví příznak přetečení TOV0. Tento režim se vybírá nastavením bitů WGM00 = 0 a WGM01 = 0 v registru TCCR0.

CTC – režim reagující na shodu

 

V tomto režimu se registr TCNT0 porovnává s registrem OCR0. Pokud dojde ke shodě těchto dvou hodnot, nastaví se příznak OCF0 a nastaví se hodnota TCNT0 na nulu. Také jako v normálním režimu dojde při přetečení (přechod z MAX do nuly) k nastavení příznaku přetečení TOV0. Pokud je zvolen režim „toggle“ nastavením COM00 do stavu log. 1 a COM01 do stavu log. 0 v registru TCCR0, tak dochází k ovládání stavu výstupního pinu OC0 (PB3). Při každé shodě registru TCNT0 a OCR0 dojde k negaci výstupního pinu OC0 (PB3). Tímto nastavením dostaneme generátor s periodou 1:1. Průběh funkce tohoto režimu lze vidět na obrázku Obr. 1.
nazev

Obr. 1: Popis režimu CTC, částečně převzato z [1]

Výpočet frekvence na pinu OC0 ukazuje následujíc vztah:
 
f = fclk / (2 x N x (1 + OCR0))
 
kde fclk je hodnota hodinového taktu mikrokontroléru a N označuje vybraný dělící poměr (1,8,64, 256 nebo 1024).
Maximální možná frekvence vychází ze vztahu:
 
fmax = fclk / 2
 
Tento režim se vybírá nastavením bitů WGM00 = 0 a WGM01 = 1 v registru TCCR0.

PWM – rychlý režim

 

Jedná se o PWM režim, který se vyznačuje dvounásobnou pracovní frekvencí oproti fázově korigovanému PWM režimu. Tento režim je vhodný pro regulaci výkonu apod. Princip tohoto režimu je jednoduchý. Registr TCNT0 čítá nahoru, až dosáhne maximu a poté se jeho hodnota opět vrátí na nulu. Při shodě s registrem OCR0 se nastaví příznakový bit OCF0 a tím se stav výstupu OC0 (PB3) nastaví na hodnotu dle nastavení bitů COM00 a COM01 v registru TCCR0. I zde dojde při dosažení maxima k nastavení příznaku přetečení TOV0. Průběh funkce tohoto režimu lze vidět na obrázku Obr. 2.
nazev

Obr. 2: Popis režimu rychlého PWM, částečně převzato z [1]

Pro výstupní kmitočet na pinu OC0 (PB3) platí vztah:
 
f = fclk / (N x 256)
 
kde fclk je hodnota hodinového taktu mikrokontroléru a N označuje vybraný dělící poměr (1,8,64, 256 nebo 1024).
Pokud je nastaven registr OCR0 na nulu, tak je na výstupu OC0 vytvořen velmi krátký impuls při přetečení registru TCNT0. Pokud je ovšem registr OCR0 nastaven na maximální hodnotu (0xFF), tak je výstup OC0 stabilní. Logické stavy těchto dějů závisí na nastavení bitů COM00 a COM01 v registru TCCR0.
Tento režim se vybírá nastavením bitů WGM00 = 1 a WGM01 = 1 v registru TCCR0.

PWM – fázově korigovaný režim

 

Rozdíl mezi tímto režimem a režimem rychlého PWM je v tom, že zde se čítá nahoru a po dosažení maxima se nenastaví hodnota TCNT0 na nulu, ale tentokrát se čítá dolů. Pracovní kmitočet tohoto režimu je sice nižší, ale za to je vyšší rozlišení. Vývod OC0 reaguje na shodu registru TCNT0 s registrem OCR0 jak při čítání nahoru, tak i při čítání dolů. Logické stavy těchto dějů závisí na nastavení bitů COM00 a COM01 v registru TCCR0. V tomto režimu dojde k nastavení příznaku přetečení TOV0 při dosažení nuly registru TCNT0. Princip činnosti tohoto režimu ukazuje Obr. 3.
nazev

Obr. 3: Popis režimu fázově korigovaného PWM, částečně převzato z [1]

Pro výstupní kmitočet na pinu OC0 (PB3) platí vztah:
 
f = fclk / (N x 510)
 
kde fclk je hodnota hodinového taktu mikrokontroléru a N označuje vybraný dělící poměr (1,8,64, 256 nebo 1024).
Zde na rozdíl od rychlého PWM režimu nedochází k zákmitům na pinu OC0 (PB3) při žádném nastavení registru OCR0.

Tento režim se vybírá nastavením bitů WGM00 = 1 a WGM01 = 0 v registru TCCR0.

 
 

[1] ATMEL. 8-bit Microcontroller with 32KBytes In-System Programmable Flash. [online] citováno 25. října 2014. Dostupné na www: http://www.atmel.com/images/doc2503.pdf
[2] MATOUŠEK, D. Práce s mikrokontroléry ATMEL AVR Atmega16 4.díl. Praha: BEN – technická literatura, 2006.
Jiné příspěvky v kategorii:

Základy ovládání mikrokontroléru ATmega(16/32) 1.díl – První kroky

Základy ovládání mikrokontroléru ATmega(16/32) 2. díl – Kompilace a krokování programu

Základy ovládání mikrokontroléru ATmega(16/32) 3.díl – Nahrání vytvořeného zdrojového kódu do mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 4.díl – Ovládání vstupně/výstupních portů

Základy ovládání mikrokontroléru ATmega(16/32) 5.díl – Ošetření zákmitů na vstupním pinu mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 6.díl – Externí přerušení

Základy ovládání mikrokontroléru ATmega(16/32) 7. díl – Jednoduchá elektronická hrací kostka

Základy ovládání mikrokontroléru ATmega(16/32) 8.díl – A/D převodník (1.část)

Základy ovládání mikrokontroléru ATmega(16/32) 9.díl – A/D převodník (2.část)

Základy ovládání mikrokontroléru ATmega(16/32) 10.díl – A/D převodník (3.část)

Základy ovládání mikrokontroléru ATmega(16/32) 12.díl – Čítač / Časovač (2.část – Popis registrů)

Základy ovládání mikrokontroléru ATmega(16/32) 13.díl – Čítač / Časovač (3.část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 14.díl – Dvouřádkový LCD displej

Základy ovládání mikrokontroléru ATmega(16/32) 15.díl – Popis implementace komunikace I2C a EEPROM paměti 24LC512

Základy ovládání mikrokontroléru ATmega(16/32) 16.díl – Watchdog

Základy ovládání mikrokontroléru ATmega(16/32) 17.díl – Obsluha maticové klávesnice

Základy ovládání mikrokontroléru ATmega(16/32) 18.díl – Jednotka USART (1. část – Popis)

Základy ovládání mikrokontroléru ATmega(16/32) 19.díl – Jednotka USART (2. část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 20. díl – Generování audio signálu pomocí PWM

Základy ovládání mikrokontroléru ATmega(16/32) 21. díl – Analogový komparátor

Základy ovládání mikrokontroléru ATmega(16/32) 22. díl – Krokování programu v jazyce symbolických adres (JSA)

 
Tajned facebook
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.