Obsah:

Mikrokontrolér AVR. LED diódy blikajú pomocou časovača. Časovače sa prerušujú. Režim CTC s časovačom: 6 krokov
Mikrokontrolér AVR. LED diódy blikajú pomocou časovača. Časovače sa prerušujú. Režim CTC s časovačom: 6 krokov

Video: Mikrokontrolér AVR. LED diódy blikajú pomocou časovača. Časovače sa prerušujú. Režim CTC s časovačom: 6 krokov

Video: Mikrokontrolér AVR. LED diódy blikajú pomocou časovača. Časovače sa prerušujú. Režim CTC s časovačom: 6 krokov
Video: LDmicro 8: Охранная сигнализация с таймерами (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, November
Anonim
Image
Image

Ahojte všetci!

Časovače sú dôležitým konceptom v oblasti elektroniky. Každý elektronický komponent pracuje na časovej báze. Táto časová základňa pomáha udržiavať všetku prácu synchronizovanú. Všetky mikrokontroléry pracujú na nejakej preddefinovanej hodinovej frekvencii, všetky majú možnosť nastavenia časovačov. AVR sa môže pochváliť časovačom, ktorý je veľmi presný, presný a spoľahlivý. Ponúka množstvo funkcií, a preto je z neho rozsiahla téma. Najlepšie na tom je, že časovač je úplne nezávislý na CPU. Preto beží paralelne s CPU a nedochádza k žiadnym zásahom CPU, vďaka čomu je časovač celkom presný. V tejto časti vysvetľujem základné pojmy časovačov AVR. Píšem jednoduchý program v kóde C na ovládanie LED blikača pomocou časovačov.

Krok 1: Popis

Vyhlásenie o probléme 1: Rozsvietime prvú diódu LED (zelená) každých 50 ms
Vyhlásenie o probléme 1: Rozsvietime prvú diódu LED (zelená) každých 50 ms

V ATMega328 existujú tri typy časovačov:

Timer/Counter0 (TC0) - je 8 -bitový modul časovača/počítadla na všeobecné použitie s dvoma nezávislými jednotkami OutputCompare a podporou PWM;

Timer/Counter1 (TC1) - 16 -bitová jednotka Timer/Counter umožňuje presné načasovanie vykonávania programu (správa udalostí), generovanie vĺn a meranie časovania signálu;

Timer/Counter2 (TC2) -je univerzálny, kanálový, 8 -bitový modul časovača/počítadla s PWM a asynchrónnou prevádzkou;

Krok 2: Vyhlásenie o probléme 1: Rozsvietime prvú diódu LED (zelená) každých 50 ms

Vyhlásenie o probléme 1: Rozsvietime prvú diódu LED (zelená) každých 50 ms
Vyhlásenie o probléme 1: Rozsvietime prvú diódu LED (zelená) každých 50 ms
Vyhlásenie o probléme 1: Rozsvietime prvú diódu LED (zelená) každých 50 ms
Vyhlásenie o probléme 1: Rozsvietime prvú diódu LED (zelená) každých 50 ms

Metodika:

- použitie predzosilňovača Timer0 na zníženie vysokofrekvenčného elektrického signálu na nižšiu frekvenciu delením na celé číslo;

- použitie prerušenia zakaždým, keď časový spínač 0 pretečie;

Časovač 0 (8 bitov), ktorý počíta od 0 do 255, potom pretečú a táto hodnota sa mení pri každom hodinovom impulze.

F_CPU = 16 MHz: Časové obdobie = 1000 ms / 16000000 Hz = 0,0000625 ms

Počet časovačov = (požadované oneskorenie / časové obdobie) -1 = (50ms / 0,0000625ms) = 799999

Hodiny už tikli 799 999 krát, aby poskytli oneskorenie iba 50 ms!

Na zníženie počtu časovačov môžeme použiť techniku frekvenčného delenia, ktorá sa nazýva predzmenenie. AVR nám ponúka na výber z nasledujúcich hodnôt predzváračov: 8, 64, 256 a 1024. V tabuľke sú zhrnuté výsledky použitia rôznych predzváračov.

Hodnota počítadla by mala byť vždy celé číslo. Vyberme predradník 256!

Vo väčšine mikrokontrolérov existuje niečo, čo sa nazýva prerušenie. Toto prerušenie je možné spustiť vždy, keď sú splnené určité podmienky. Teraz, keď sa spustí prerušenie, AVR sa zastaví a uloží vykonanie hlavnej rutiny, zúčastní sa volania prerušenia (vykonaním špeciálnej rutiny, nazývanej rutina prerušenia služby, ISR) a akonáhle je s ňou hotové, vráti sa do hlavnú rutinu a pokračuje v jej vykonávaní.

Pretože požadované oneskorenie (50 ms) je väčšie ako maximálne možné oneskorenie: 4, 096 ms = 1 000 ms / 62500 Hz * 256, časový spínač evidentne pretečie. A vždy, keď časový spínač pretečie, spustí sa prerušenie.

Koľkokrát by malo byť prerušenie prerušené?

50ms / 4,096ms = 3125 /256 = 12,207 Ak by časovač pretekal 12 -krát, prešlo by 12 * 4,096ms = 49,152ms. V 13. iterácii potrebujeme oneskorenie 50 ms - 49,152 ms = 0,848 ms.

Pri frekvencii 62500 Hz (prescaler = 256) trvá každé zaškrtnutie 0,016 ms. Na dosiahnutie oneskorenia 0,848 ms by to teda vyžadovalo 0,848 ms / 0,016 ms = 53 kliešťov. V 13. iterácii teda povolíme, aby časovač napočítal iba do 53 a potom ho resetoval.

Inicializujte časovač 0/počítadlo (pozri obrázok):

TCCR0B | = (1 << CS02) // nastavenie časovača s predzosilňovačom = 256 TCNT0 = 0 // inicializácia počítadla TIMSK0 | = (1 << TOIE0) // povolenie prerušenia pretečenia sei () // povolenie globálnych prerušení tot_overflow = 0 // inicializácia premennej počítadla pretečenia

Krok 3: Vyhlásenie o probléme 2: Rozblikajme druhú diódu LED (modrá) každú 1 s

Vyhlásenie o probléme 2: Rozblikajme druhú diódu LED (modrá) každú 1 s
Vyhlásenie o probléme 2: Rozblikajme druhú diódu LED (modrá) každú 1 s
Vyhlásenie o probléme 2: Rozblikajme druhú diódu LED (modrá) každú 1 s
Vyhlásenie o probléme 2: Rozblikajme druhú diódu LED (modrá) každú 1 s
Vyhlásenie o probléme 2: Rozblikajme druhú diódu LED (modrá) každú 1 s
Vyhlásenie o probléme 2: Rozblikajme druhú diódu LED (modrá) každú 1 s

Metodika:

- použitie predzosilňovača Timer1 na zníženie vysokofrekvenčného elektrického signálu na nižšiu frekvenciu delením na celé čísla;

- používanie funkcie Clear Timer v režime porovnávania (CTC);

- používanie prerušení s režimom CTC;

Časovač 1 (16 bitov), ktorý počíta od 0 do 65 534, potom pretečú. Táto hodnota sa mení pri každom hodinovom impulze.

F_CPU = 16MHz: Časový úsek = 1000ms / 16000000Hz = 0,0000625ms Časovač = (požadované oneskorenie / časové obdobie) -1 = (1000ms / 0,0000625ms) = 15999999

Hodiny už tikli 15999999 krát, aby poskytli oneskorenie 1 s!

Na zníženie počtu časovačov môžeme použiť techniku frekvenčného delenia, ktorá sa nazýva predzmenenie. AVR nám ponúka na výber z nasledujúcich hodnôt predzváračov: 8, 64, 256 a 1024. V tabuľke sú zhrnuté výsledky použitia rôznych predzváračov. Hodnota počítadla by mala byť vždy celé číslo. Vyberme predzvárač 256!

V režime CTC (Clear timer on Compare) sa na manipuláciu s rozlíšením počítadla používa register OCR1A alebo ICR1. V režime CTC sa počítadlo vynuluje, keď sa hodnota počítadla (TCNT1) zhoduje s OCR1A alebo ICR1. OCR1A alebo ICR1 definujú najvyššiu hodnotu pre počítadlo, a teda aj jeho rozlíšenie. Tento režim umožňuje väčšiu kontrolu výstupnej frekvencie porovnávania a taktiež zjednodušuje činnosť počítania externých udalostí. Musíme AVR povedať, aby resetoval Timer1/Counter, akonáhle jeho hodnota dosiahne hodnotu 62500, aby sa dosiahlo oneskorenie 1 s.

Inicializujte časovač 1/počítadlo (pozri obrázok):

TCCR1B | = (1 << WGM12) | (1 << CS12) // nastavenie časovača s predzosilňovačom = 256 a režim CTC TCNT1 = 0 // inicializácia počítadla TIMSK1 | = (1 << OCIE1A) // povolenie porovnávania prerušenia OCR1A = 62500 // inicializácia porovnávacej hodnoty

Krok 4: Vyhlásenie o probléme 3: Rozblikajme tretiu diódu LED (červená) každých 16 ms

Vyhlásenie o probléme 3: Zablikáme tretiu diódu LED (červená) každých 16 ms
Vyhlásenie o probléme 3: Zablikáme tretiu diódu LED (červená) každých 16 ms
Vyhlásenie o probléme 3: Rozblikáme tretiu diódu LED (červená) každých 16 ms
Vyhlásenie o probléme 3: Rozblikáme tretiu diódu LED (červená) každých 16 ms
Vyhlásenie o probléme 3: Rozblikáme tretiu diódu LED (červená) každých 16 ms
Vyhlásenie o probléme 3: Rozblikáme tretiu diódu LED (červená) každých 16 ms
Vyhlásenie o probléme 3: Rozblikáme tretiu diódu LED (červená) každých 16 ms
Vyhlásenie o probléme 3: Rozblikáme tretiu diódu LED (červená) každých 16 ms

Metodika:

- použitie predzosilňovača Timer2 na zníženie vysokofrekvenčného elektrického signálu na nižšiu frekvenciu delením na celé číslo;

- používanie funkcie Clear Timer v režime porovnávania (CTC);

- používanie hardvérového režimu CTC bez prerušenia;

Časovač 2 (8 bitov), ktorý počíta od 0 do 255, potom pretečú. Táto hodnota sa mení pri každom hodinovom impulze.

F_CPU = 16 MHz: Časové obdobie = 1000 ms / 16000000 Hz = 0,0000625 ms

Počet časovačov = (požadované oneskorenie / časové obdobie) -1 = (16ms / 0,0000625ms) = 255999

Hodiny už tikli 255 999 krát, aby poskytli oneskorenie 16 ms!

V tabuľke sú zhrnuté výsledky použitia rôznych predzmesi. Hodnota počítadla by mala byť vždy celé číslo. Vyberme predzvárač 1024!

V režime CTC sa počítadlo vynuluje, keď sa hodnota počítadla (TCNT2) zhoduje s OCR2A alebo ICR2. Kolík PB3 je tiež kolíkom na porovnanie výstupu TIMER2 - OC2A (pozri diagram).

Register riadenia časovača/čítača2 A - TCCR2A Bit 7: 6 - COM2A1: 0 - režim porovnávania výstupu pre porovnávaciu jednotku A. Pretože potrebujeme prepnúť LED, zvolíme možnosť: Prepnúť OC2A na porovnanie zhody Kedykoľvek dôjde k porovnávaniu, Pin OC2A sa automaticky prepína. Nie je potrebné kontrolovať žiadny príznakový bit, nie je potrebné starať sa o žiadne prerušenia.

Inicializujte časovač 2/počítadlo

TCCR2A | = (1 << COM2A0) | (1 << WGM21) // nastavenie časovača OC2A pin v prepínacom režime a v režime CTC TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // nastavenie časovača pomocou prescaleru = 1024 TCNT2 = 0 // inicializácia počítadla OCR2A = 250 // inicializácia porovnávacej hodnoty

Krok 5: Zapísanie kódu pre program v C. Odovzdanie súboru HEX do pamäte Flash mikrokontroléra

Písanie kódu pre program v C. Vkladanie súboru HEX do pamäte Flash mikrokontroléra
Písanie kódu pre program v C. Vkladanie súboru HEX do pamäte Flash mikrokontroléra
Zapisovací kód programu v C. Odovzdanie súboru HEX do pamäte Flash mikrokontroléra
Zapisovací kód programu v C. Odovzdanie súboru HEX do pamäte Flash mikrokontroléra

Písanie a vytváranie aplikácie mikrokontroléra AVR v kóde C pomocou integrovanej vývojovej platformy - Atmel Studio.

F_CPU definuje taktovaciu frekvenciu v Hertzoch a je bežný v programoch používajúcich knižnicu avr-libc. V tomto prípade ho používajú rutiny oneskorenia na určenie spôsobu výpočtu časových oneskorení.

#ifndef F_CPU

#define F_CPU 16000000UL // informujúci o kryštálovej frekvencii ovládača (16 MHz AVR ATMega328P) #endif

#include // hlavička na povolenie riadenia toku údajov nad kolíkmi. Definuje piny, porty atď.

Prvý súbor zahrnutia je súčasťou avr-libc a bude použitý v takmer akomkoľvek projekte AVR, na ktorom pracujete. io.h určí procesor, ktorý používate (čo je dôvod, prečo uvediete časť pri kompilácii) a následne zahrnie príslušnú hlavičku definície IO pre čip, ktorý používame. Jednoducho definuje konštanty pre všetky vaše piny, porty, špeciálne registre atď.

#include // hlavička na povolenie prerušenia

volatile uint8_t tot_overflow; // globálna premenná na spočítanie počtu pretečení

Metodika vyhlásenia problému: LED dióda Flash ako prvá (zelená) každých 50 ms

- použitie predzosilňovača Timer0 na zníženie vysokofrekvenčného elektrického signálu na nižšiu frekvenciu delením na celé číslo;

- použitie prerušenia zakaždým, keď časový spínač 0 pretečie;

void timer0_init () // inicializácia timer0, prerušenie a premenná

{TCCR0B | = (1 << CS02); // nastavenie časovača pomocou prescaleru = 256 TCNT0 = 0; // inicializácia počítadla TIMSK0 | = (1 << TOIE0); // povoliť pretečenie nterrupt sei (); // povoliť globálne prerušenia tot_overflow = 0; // inicializácia premennej počítadla pretečenia}

Metodika vyhlásenia problému: Blikajúca druhá LED dióda (modrá) každé 1 s

- použitie predzosilňovača Timer1 na zníženie vysokofrekvenčného elektrického signálu na nižšiu frekvenciu delením na celé číslo;

- používanie funkcie Clear Timer v režime porovnávania (CTC);

- používanie prerušení s režimom CTC;

void timer1_init () // inicializácia timer1, prerušenia a premennej {TCCR1B | = (1 << WGM12) | (1 << CS12); // nastavenie časovača pomocou prescaleru = 256 a režimu CTC TCNT1 = 0; // inicializácia počítadla OCR1A = 62500; // inicializácia porovnávacej hodnoty TIMSK1 | = (1 << OCIE1A); // povoliť porovnanie prerušenia}

Metodika vyhlásenia problému: Tretia LED dióda bliká každých 16 ms

- použitie predzosilňovača Timer2 na zníženie vysokofrekvenčného elektrického signálu na nižšiu frekvenciu delením na celé číslo;

- používanie funkcie Clear Timer v režime porovnávania (CTC);

- používanie hardvérového režimu CTC bez prerušenia;

void timer2_init () // inicializácia timer2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // nastavenie časovača OC2A pin v prepínacom režime a režime CTC TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // nastavenie časovača pomocou prescaleru = 1024 TCNT2 = 0; // inicializácia počítadla OCR2A = 250; // inicializácia porovnávacej hodnoty}

Rutinná služba prerušenia pretečenia TIMER0 sa volá vždy, keď pretečie TCNT0:

ISR (TIMER0_OVF_vect)

{tot_overflow ++; // sledovanie počtu pretečení}

Tento ISR sa aktivuje vždy, keď dôjde k zhode, teda prepínací led tu:

ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // tu prepnite led}

int main (prázdny)

{DDRB | = (1 << 0); // pripojenie 1 (zelenej) LED na pin PB0 DDRC | = (1 << 1); // pripojenie 2 (modrých) LED na pin PC1 DDRB | = (1 << 3); // pripojenie 3 (červené) LED na pin PB3 (OC2A) timer0_init (); // inicializácia timer0 timer1_init (); // inicializácia timer1 timer2_init (); // inicializácia timer2 while (1) // loop navždy {

Ak by časový spínač 0 preletel 12 -krát, uplynulo by 12 * 4,096 ms = 49,152 ms. V 13. iterácii potrebujeme oneskorenie 50 ms - 49,152 ms = 0,848 ms. V 13. iterácii teda povolíme, aby časovač napočítal iba do 53 a potom ho resetoval.

if (tot_overflow> = 12) // skontrolujte, či nie. prepadov = 12 POZNÁMKA: Použije sa '> ='

{if (TCNT0> = 53) // skontrolujte, či počet časovačov dosiahne 53 {PORTB ^= (1 << 0); // prepína LED TCNT0 = 0; // vynulovanie počítadla tot_overflow = 0; // reset počítadla pretečenia}}}}

Odovzdanie súboru HEX do pamäte flash mikrokontroléra:

do okna výzvy systému DOS zadajte príkaz:

avrdude –c [názov programátora] –p m328p –u –U flash: w: [názov vášho hexadecimálneho súboru] V mojom prípade je to: avrdude –c ISPProgv1 –p m328p –u –U flash: w: Timers.hex

Tento príkaz zapíše hexadecimálny súbor do pamäte mikrokontroléra. Pozrite si video s podrobným popisom napaľovania pamäte flash mikrokontroléra:

Napaľovanie pamäte flash mikrokontroléra…

Dobre! Mikrokontrolér teraz pracuje v súlade s pokynmi nášho programu. Pozrime sa na to!

Krok 6: Výroba elektrického obvodu

Výroba elektrického obvodu
Výroba elektrického obvodu
Výroba elektrického obvodu
Výroba elektrického obvodu
Výroba elektrického obvodu
Výroba elektrického obvodu

Pripojte komponenty podľa schematického diagramu.

Odporúča: