Obsah:
- Krok 1: Popis
- Krok 2: Vyhlásenie o probléme 1: Rozsvietime prvú diódu LED (zelená) každých 50 ms
- Krok 3: Vyhlásenie o probléme 2: Rozblikajme druhú diódu LED (modrá) každú 1 s
- Krok 4: Vyhlásenie o probléme 3: Rozblikajme tretiu diódu LED (červená) každých 16 ms
- Krok 5: Zapísanie kódu pre program v C. Odovzdanie súboru HEX do pamäte Flash mikrokontroléra
- Krok 6: Výroba elektrického obvodu
Video: Mikrokontrolér AVR. LED diódy blikajú pomocou časovača. Časovače sa prerušujú. Režim CTC s časovačom: 6 krokov
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:59
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
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
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
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
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 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
Pripojte komponenty podľa schematického diagramu.
Odporúča:
Vytvorenie digitálneho časovača pomocou Blynka: 5 krokov
Vytvorenie digitálneho časovača pomocou Blynku: V tomto príspevku sa naučíme, ako začať s Blynkom - platformou IoT, ktorá je navrhnutá tak, aby nám celý proces zjednodušila a ktorá funguje aj s niekoľkými internetovými doskami
Elektronický obvod LED Chaser pomocou integrovaného časovača 555 IC: 20 krokov
Elektronický obvod LED chaser pomocou časovača IC 555: Obvody LED chaser sú najčastejšie používané integrované elektronické obvody. Nesmierne sa používajú v rôznych aplikáciách, ako sú signály, systém na tvorbu slov, zobrazovacie systémy atď. Časovač IC 555 je nakonfigurovaný v režime astabilného stavu. Th
Ako vytvoriť falošný autoalarm pomocou časovača 555: 5 krokov
Ako vytvoriť falošný autoalarm pomocou časovača 555: Tento projekt ukazuje, ako pomocou NE555 vytvoriť blikajúce LED svetlo s päťsekundovým oneskorením. Mohlo by to slúžiť ako falošný autoalarm, pretože napodobňuje systém autoalarmu s jasne červenou blikajúcou diódou LED. Úroveň obtiažnosti Samotný okruh nie je náročný
Mikrokontrolér AVR. Prepínajte diódy LED pomocou tlačidlového spínača. Odskakovanie tlačidlom: 4 kroky
Mikrokontrolér AVR. Prepínajte diódy LED pomocou tlačidlového spínača. Odstránenie tlačidiel: V tejto časti sa naučíme, ako vytvoriť kód C programu pre ATMega328PU na prepínanie stavu troch diód LED podľa vstupu z tlačidlového spínača. Tiež sme preskúmali riešenia problému s „Switch Bounce“. Ako obvykle sme
Smart Master/Slave Power Strip pre váš počítač [režim] (automatické vypnutie, ale nulový pohotovostný režim): 6 krokov (s obrázkami)
Power Master/Slave Power Strip pre váš počítač [režim] (automatické vypnutie, ale nulový pohotovostný režim): Vypnuté by malo byť vypnuté. A použiteľnosť by mala byť dobrá. Aby sme to skrátili: Nenašli sme tam ten správny produkt, tak sme skončili s úpravou. Kúpili sme nejaký " Šetrič energie " rozvodky od Zweibrueder. Zariadenia sú veľmi pevné a nie príliš