Reklama

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

Úvod

Po vysvětlení základní funkce čítače/časovače a po popisu registrů, které s čítačem/časovačem pracují, následuje praktická ukázka využití. Názorný příklad si ukážeme na funkci rychlého PWM režimu, kterým budeme řídit jas dvou LED diod. Jedna LED dioda bude zapojena přímo na vývod OC0 (PB3) a druhou LED diodu budeme řídit programově pinem PB4.

Popis zdrojového kódu

V registru TCCR0 je nastaven rychlý PWM režim, předdělička 256 pro fclk a neinvertující režim pro vývod OC0. K nastavení jasu LED diod je využit jeden trimr, který je snímán A/D převodníkem. Hodnota 8bitového převodu je nastavena do registru OCR0. Registr OCR0 určuje změnu střídy PWM regulace. Ve funkci main je spuštěn A/D převod pomocí registru ADCSRA (popis registru lze nalézt zde) a následně se čeká 50 ms na dokončení A/D převodu. Hodnota 50 ms je velmi nadhodnocena, ale zde slouží i k jistému omezení neustálého měření a ke garanci vždy aktuální hodnoty A/D převodu. Po ukončení A/D převodu se uloží nová hodnota do proměnné analog_value_new. Pokud je nová hodnota analog_value_new větší než poslední nastavená hodnota analog_value_old o více než 4, tak se provede změna nastavení registru OCR0 a aktualizuje se hodnota analog_value_old. Velikostí této podmínky lze regulovat citlivost na změnu hodnoty A/D převodu. Jak bylo řečeno, tak jedna LED dioda je řízena přímo pinem OC0, ale druhá LED dioda je řízená programově. Řízení druhé LED diody probíhá ve dvou přerušení čítače/časovače. V přerušení na shodu registrů TCNT0 a OCR0 nastavíme pin PB4 do stavu log. 1. V přerušení po přetečení registru TCNT0 se nastaví hodnota na pinu PB4 do stavu log. 0. Tímto nastavením změny stavu pinu PB4 a nastaveným režimem pro pin OC0 (PB3) dostaneme inverzní svícení obou LED diod, tzn. že když jedna LED dioda svítí, tak druhá LED dioda je zhasnutá. Elektronické schéma zapojení a okomentovaný zdrojový kód lze vidět níže.

Elektronické schéma zapojení

nazev

Obr. 1: Elektronické schéma zapojení
Okomentovaný zdrojový kód
 

001: #define F_CPU 16000000UL// frekvence hodinového signálu (nutné pro delay.h)
002: #include <avr/io.h>// knihovna AVR pro Input/output
003: #include <util/delay.h>// hlavičkový soubor pro zpoždění
004: #include <avr/interrupt.h>// hlavičkový soubor pro přerušení
005:
006: // nová A/D hodnota
007: volatile uint8_t analog_value_new;
008: // stará A/D hodnota
009: uint8_t analog_value_old;
010: // rozdíl nové a staré hodnoty
011: uint8_t analog_value_diff;
012: volatile uint8_t new_value;// nová hodnota z A/D převodníku
013:
014: ISR(TIMER0_COMP_vect)// přerušení po shodě registru TCNT0 a OCR0
015: {
016: PORTB |= 0b00010000;// nastavit PB4 na log. 1
017: }
018:
019: ISR(TIMER0_OVF_vect)// přerušení po přetečení TCNT0
020: {
021: PORTB &= 0b11101111;// nastavit PB4 na log. 0
022: }
023:
024: ISR(ADC_vect)// přerušení po ukončení A/D převodu
025: {
026: analog_value_new = ADCH;// uložení změření analogové hodnoty
027: new_value = 1;// nová A/D hodnota
028: }
029:
030: int main(void)
031: {
032:
033: ADMUX = 0b01100000;// reference – AUcc, zarovnání doleva, ADC0
034: ADCSRA = 0b10001111;// zapnutí A/D převodníku, povolení přerušení, f = 500kHz
035:
036: TCCR0 = 0b01101100;// rychlý PWM režim,neinvertující režim, předdělička 256
037: TIMSK = 0b00000011;// povolení přerušení pří shodě i při přetečení
038:
039: DDRA = 0x00;// PORTA nastaven jako vstupní pro A/D převod
040: DDRB = 0xFF;// PORTB nastaven jako výstupní pro PWM signál
041: PORTA = 0b11111110;// vypnout pull-up na PA0
042: PORTB = 0b00001000;// na pin PB3 OC0 nastavit log.1
043:
044: analog_value_new = 0;
045: analog_value_old = 0;
046: analog_value_diff = 0;
047: new_value = 0;
048:
049: sei();// povolení přerušení
050:
051: while(1)
052: {
053:
054: ADCSRA |= 0b01000000;// spuštění A/D převodu
055: _delay_ms(50); // čekání 50ms
056:
057: if (new_value == 1)// pokud je nová hodnota A/D převodníku
058: {
059: new_value = 0;
060:
061: // výpočet rozdílu staré a nové hodnoty
062: if (analog_value_old > analog_value_new)
063: {
064: analog_value_diff = analog_value_old – analog_value_new;
065: }
066: else
067: {
068: analog_value_diff = analog_value_new – analog_value_old;
069: }
070:
071: // pokud je rozdíl v převodu minimálně 5
072: if (analog_value_diff > 4)
073: {
074: // přeuložení nové hodnoty A/D převodu
075: analog_value_old = analog_value_new;
076: // nastavení nové hodnoty pro časovač
077: OCR0 = analog_value_new;
078: }
079: }
080: }
081: return 0;
082: }

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.
 

 

Na následujících obrázcích lze vidět časové průběhy zachycené na pinech PB3 a PB4. Nastavená předdělička 256 pro fclk by měla udělat frekvenci pro rychlý PWM režim:
 
f = fclk / (N x 256)
f = 16 000 000 / (256 x 256)
f = 244,14 Hz
 
Změřená hodnota pro pin OC0 (PB3) a pro pin PB4 byla 238 Hz. V rozdílném výsledku se hlavně projevila chyba měření pomocí ručního osciloskopu. Na Obr. 1 vlevo lze vidět průběh signálu na pinu OC0 a vpravo průběh signálu na pinu PB4. Na Obr. 2 lze vidět, že jsou dané průběhy invertované.
nazev

Obr. 2: Průběh signálu na pinu OC0 (PB3) a PB4

 
Aktualizace: 22.4.2015
 

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