Reklama

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

Úvod

V dalším pokračováním seriálu o práci s mikrokontrolérem ATmega(16/32) se podíváme na analogový komparátor. Analogový komparátor se používá k porovnání dvou analogových hodnot napětí. Tato jednotka najde uplatnění v případech, kdy potřebujeme reagovat na změnu hodnoty napětí nad nebo pod určitou mez, a přitom nás nezajímá přesná hodnota napětí. Pokud potřebujete znát přesnou hodnotu napětí měřeného analogového signálu, tak musíte použít jednotku A/D převodníku, která je popsána ZDE.

Vnitřní zapojení analogového komparátoru ukazuje Obr. 1.
 
Vnitřní zapojení analogového komparátoru

Obr. 1: Vnitřní zapojení analogového komparátoru, převzato z [1]

 
Pro práci s analogovým komparátorem jsou zapotřebí dva registry mikrokontroléru a to: SFIOR a ACSR.

Registr SFIOR

Jako první se podíváme na registr SFIOR, kde analogový komparátor ovlivňuje pouze jeden bit a to ACME. Popis registru SFIOR ukazuje Tab. 1.

Tab. 1: Popis registru SFIOR

Pozice bitu Označení
7 – (nejvyšší váha) ADTS2
6 ADTS1
5 ADTS0
4 -
3 ACME
2 PUD
1 PSR2
0 – (nejnižší váha) PSR10

 

Pokud máme vypnutý A/D převodník (nastavením bitu ADEN v registru ADCSRA do stavu log. 0), tak lze tímto bitem přepínat mezi pinem AIN1 (PB3) a některým pinem určeným pro A/D převodník. Pokud je bit ACME nastaven do stavu log. 0, tak je invertující vstup komparátoru připojen na AIN1 (PB3).V opačném případě je zvolen některý pin určeným pro A/D převodník, pokud je A/D převodník vypnutý. Nastavení výběru pinu ukazuje tab. 2.

Tab. 2: Výběr negativního vstupu analogového komparátoru

ACME ADEN MUX2..0 Negativní vstup komparátoru
0 X XXX AIN1
1 1 XXX AIN1
1 0 000 ADC0
1 0 001 ADC1
1 0 010 ADC2
1 0 011 ADC3
1 0 100 ADC4
1 0 101 ADC5
1 0 110 ADC6
1 0 111 ADC7

 

Registr ACSR

Druhým a také posledním popisovaným registrem je registr ACSR. V tomto registru nalezneme jak příznakové bity, tak i řídící bity pro analogový komparátor. Popis bitů v registru ACSR ukazuje Tab. 3.

Tab.3: Popis registru ACSR

Pozice bitu Označení
7 – (nejvyšší váha) ACD
6 ACBG
5 ACO
4 ACI
3 ACIE
2 ACIC
1 ACIS1
0 – (nejnižší váha) ACIS0

 

Prvním bitem ACD lze odpojit analogový komparátor od napájení, což oceníme hlavně v úsporných režimech, kde tímto snížíme spotřebu mikrokontroléru. Odpojení analogového komparátoru dosáhneme, pokud nastavíme bit ACD do stavu log. 1. V opačném případě je k analogovému komparátoru připojeno napájecí napětí. Při změně bitu ACD je dle doporučení [1] vhodné taky vynulovat bit ACIE, aby nedošlo k vyvolání falešného přerušení.

Druhým popisovaným bitem je bit ACBG. Tímto bitem lze připojit nebo odpojit vnitřní zdroj referenčního napětí 1,23 V (“BANDGAP REFERENCE”). Pokud tedy chceme použít místo pinu AIN0 vnitřní zdroj referenčního napětí, tak musíme bit ACBG nastavit do stavu log. 1. V opačném případě (ACBG = 0) je připojen pin AIN0 (PB2) místo vnitřního referenčního zdroje napětí.

Následuje bit ACO. Tento bit obsahuje výstup komparátoru, který je synchronizován během 1 – 2 cyklů s výstupem analogového komparátoru.

Další bit ACI je příznakový bit, který je ve stavu log. 1, pokud dojde k vyvolání některého přerušení podle nastavení bitů ACIS1 a ACIS0. K vyvolání přerušení musí být také povolené přerušení pomocí bitu I (I = 1) v registru SREG. K vynulování tohoto bitu dojde automaticky po vykonání obsluhy přerušení.

Pomocí dalšího bitu ACIE povolujeme přerušení pro analogový komparátor. Pokud nastavíme tento bit do stavu log. 1 a je také nastaven bit I (I = 1) v registru SREG, tak dojde k vyvolání přerušení podle nastavení bitů ACIS1 a ACIS0

Bitem ACIC lze připojit spouštěcí vstup čítače/časovače 1 na výstup analogového komparátoru, a to nastavením tohoto bitu do stavu log. 1. Pokud je tento bit nastaven do stavu log. 0, tak není žádné spojení mezi analogovým komparátorem a čítačem/časovačem 1. Pokud chceme generovat přerušení čítače/časovače 1 pomocí výstupu analogového komparátoru, musíme nastavit také bit TICIE1 v registru TIMSK.

Posledními bity ACIS0 a ACIS1 se vybírá událost k vyvolání přerušení. Jednotlivé volby výběru ukazuje Tab. 4.

Tab. 4: Výběr přerušení analogového komparátoru

ACIS1 ACIS0 Režim přerušení
0 0 Přerušení při změně stavu výstupu komparátoru
0 1 Rezervováno
1 0 Přerušení při sestupné hraně výstupu komparátoru
1 1 Přerušení při vzestupné hraně výstupu komparátoru

 

Vzorové příklad

Práci s analogovým komparátorem si ukážeme na jednoduchém příkladu hlídání napěťové úrovně. Elektronické schéma zapojení ukazuje Obr. 2.

 
Obr, 2: Elektronické schéma zapojení

Obr. 2: Elektronické schéma zapojení

 

Přesáhne-li hodnota napětí na pinu AIN1 (PB3) hodnotu vnitřní reference, tzn. 1,23V, tak dojde k rozsvícení zelené LED diody na pinu PA0 a ke zhasnutí červené LED diody na pinu PA1 . Zatímco pokud je hodnota na pinu AIN1 (PB3) menší jak 1,23V, tak dojde k opačnému stavu jednotlivých LED diod. Ke změně stavu rozsvícených LED diod je ve zdrojovém kódu použito přerušení. Samozřejmě lze umístit zjišťování stavu výstupu analogového komparátoru i do smyčky “while” a přerušení nepoužívat. Problém tohoto vzorového zdrojového kódu je chybějící hystereze. Pokud dosáhneme hranici 1,23V, tak lze vidět samovolné přeblikávání obou LED diod.

Okomentovaný zdrojový kód

 

001: #define F_CPU 16000000UL// frekvence hodinoveho signalu (nutne pro delay.h)
002: #include <avr/io.h>// hlavickovy soubor s IO definici
003: #include <util/delay.h>// hlavickovy soubor pro zpozdeni
004: #include <avr/interrupt.h>// hlavickovy soubor pro preruseni
005:
006: ISR(ANA_COMP_vect)// preruseni od analogoveho komparatoru
007: {
008: if (ACSR & 0b00100000)// zjisteni vystupu komparatoru
009: {
010: PORTA = 0b00000010;// rozsvitit cervenou LED na PA1
011: }
012: else
013: {
014: PORTA = 0b00000001;// rozsvitit zelenou LED na PA0
015: }
016: }
017:
018: int main(void)
019: {
020:
021: SFIOR &= 0b11110111;// Vynulovat bit ACME
022: ADCSRA &= 0b01111111;// vynulovat bit ADEN
023: ACSR &= 0b01111000;// vcc pripojeno, odpojeni c/c 1, reakce na zmenu stavu
024: ACSR |= 0b01001000;// vnitrni reference, povoleni preruseni
025:
026: DDRA = 0xFF;// nastaveni PORTA jako vystupni
027: DDRB = 0b11110111;// nastaveni PORTB jako vstupni
028: PORTA = 0x00;// zhasnout obe LED diody
029:
030: sei()// povoleni preruseni;
031:
032: while(1);
033: return 0;
034: }
Vzorové zdrojové kódy slouží pouze k jednoduché demonstraci funkce, proto často obsahují globální proměnné, neobsahují většinou ukazatele, dále také neobsahují kontroly proměnných, definování nevyužitých pinů mikrokontroléru a podobné správné programátorské návyky. Proto je nutné tyto kódy brát s patřičnou rezervou.
 

 

[1] ATMEL. 8-bit Microcontroller with 32KBytes In-System Programmable Flash. [online] citováno 26. září 2015. Dostupné na www: http://www.atmel.com/images/doc2503.pdf
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) 11.díl – Čítač / Časovač (1.část – Základní popis)

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) 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.