Sadržaj:

AVR mikrokontroler. LED treperi pomoću tajmera. Tajmeri prekida. Tajmer CTC način rada: 6 koraka
AVR mikrokontroler. LED treperi pomoću tajmera. Tajmeri prekida. Tajmer CTC način rada: 6 koraka

Video: AVR mikrokontroler. LED treperi pomoću tajmera. Tajmeri prekida. Tajmer CTC način rada: 6 koraka

Video: AVR mikrokontroler. LED treperi pomoću tajmera. Tajmeri prekida. Tajmer CTC način rada: 6 koraka
Video: LDmicro 8: Охранная сигнализация с таймерами (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, Novembar
Anonim
Image
Image

Zdravo svima!

Tajmeri su važan koncept u oblasti elektronike. Svaka elektronička komponenta radi na vremenskoj osnovi. Ova vremenska baza pomaže da se sav rad uskladi. Svi mikrokontroleri rade na unaprijed definiranoj frekvenciji takta, svi imaju mogućnost postavljanja tajmera. AVR se može pohvaliti timerom koji je vrlo precizan, precizan i pouzdan. Nudi gomilu funkcija, pa ga čini velikom temom. Najbolji dio je tajmer koji je potpuno neovisan o CPU -u. Dakle, radi paralelno sa CPU -om i nema intervencije CPU -a, što tajmer čini prilično preciznim. U ovom odjeljku objašnjavam osnovne koncepte AVR mjerača vremena. Pišem jednostavan program u C kodu za upravljanje LED bljeskalicom, pomoću tajmera.

Korak 1: Opis

Izjava o problemu 1: Neka LED treperi prva (zelena) svakih 50 ms
Izjava o problemu 1: Neka LED treperi prva (zelena) svakih 50 ms

U ATMega328 postoje tri vrste mjerača vremena:

Timer/Counter0 (TC0) - je 8 -bitni Timer/Counter modul opće namjene, s dvije nezavisne jedinice OutputCompare i PWM podrškom;

Tajmer/brojač1 (TC1) - 16 -bitna mjerač vremena/brojač omogućava precizno mjerenje vremena izvođenja programa (upravljanje događajima), generiranje valova i mjerenje vremena signala;

Tajmer/brojač2 (TC2) -opća je namjena, kanal, 8 -bitni mjerač vremena/brojač sa PWM -om i asinhronom operacijom;

Korak 2: Izjava o problemu 1: Neka LED treperi prva (zelena) svakih 50 ms

Izjava o problemu 1: Neka LED treperi prva (zelena) svakih 50 ms
Izjava o problemu 1: Neka LED treperi prva (zelena) svakih 50 ms
Izjava o problemu 1: Neka LED treperi prva (zelena) svakih 50 ms
Izjava o problemu 1: Neka LED treperi prva (zelena) svakih 50 ms

Metodologija:

- korištenje predskalera Timer0 za smanjivanje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;

- korištenje prekida svaki put kad se Timer0 prelije;

Tajmer 0 (8 bita) broji od 0 do 255 nakon toga, prelijevaju se, ova vrijednost se mijenja pri svakom taktu.

F_CPU = 16MHz: Vremenski period = 1000ms / 16000000Hz = 0.0000625ms

Brojač tajmera = (potrebno kašnjenje / vremenski period takta) -1 = (50ms / 0.0000625ms) = 799999

Sat je već otkucao 799999 puta i dao kašnjenje od samo 50 ms!

Za smanjenje broja tajmera možemo koristiti tehniku podjele frekvencije koja se naziva preskaliranje. AVR nam nudi sljedeće vrijednosti predskalera na izbor: 8, 64, 256 i 1024. Pogledajte tabelu sažeto prikazane rezultate korištenja različitih predkalera.

Vrijednost brojača uvijek treba biti cijeli broj. Odaberemo predšteč 256!

U većini mikrokontrolera postoji nešto što se zove Prekid. Ovaj prekid se može aktivirati kad god su ispunjeni određeni uvjeti. Sada, kad god se aktivira prekid, AVR zaustavlja i sprema izvršavanje glavne rutine, pristupa pozivu prekida (izvršavanjem posebne rutine, koja se naziva rutina usluge prekida, ISR) i nakon što se s njom završi, vraća se na main rutinu i nastavlja je izvršavati.

Budući da je potrebno kašnjenje (50ms) veće od maksimalnog mogućeg kašnjenja: 4, 096ms = 1000ms / 62500Hz * 256, očito će se tajmer preklopiti. I kad god se tajmer prelije, dolazi do prekida.

Koliko puta treba prekinuti prekid?

50ms / 4.096ms = 3125 /256 = 12.207 Ako je mjerač vremena preletio 12 puta, prošlo bi 12 * 4.096ms = 49.152ms. U 13. iteraciji potrebno nam je kašnjenje od 50 ms - 49,152 ms = 0,848 ms.

Na frekvenciji od 62500Hz (predskaler = 256), svaki tik traje 0,016 ms. Dakle, za postizanje kašnjenja od 0,848ms, bilo bi potrebno 0,848ms / 0,016ms = 53 takta. Dakle, u 13. iteraciji dopuštamo tajmeru da broji samo do 53, a zatim ga resetiramo.

Pokreni Timer0/Brojač (vidi sliku):

TCCR0B | = (1 << CS02) // podesite mjerač vremena s predkalerom = 256 TCNT0 = 0 // inicijalizira brojač TIMSK0 | = (1 << TOIE0) // omogući prekid prelijevanja sei () // omogući globalne prekide tot_overflow = 0 // inicijaliziranje varijable brojača preljeva

Korak 3: Izjava o problemu 2: Trepćimo drugu LED (plavu) svakih 1 s

Izjava o problemu 2: Neka treperi druga LED (plava) svakih 1 s
Izjava o problemu 2: Neka treperi druga LED (plava) svakih 1 s
Izjava o problemu 2: Neka treperi druga LED (plava) svakih 1 s
Izjava o problemu 2: Neka treperi druga LED (plava) svakih 1 s
Izjava o problemu 2: Neka bljeska druga LED (plava) svakih 1 s
Izjava o problemu 2: Neka bljeska druga LED (plava) svakih 1 s

Metodologija:

- korištenjem mjerača vremena Timer1 za smanjivanje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;

- korišćenjem režima Clear Timer on Compare (CTC);

- korišćenje prekida sa CTC režimom;

Tajmer1 (16 bita) broji od 0 do 65534 nakon toga, prelijevaju se. Ova vrijednost se mijenja pri svakom impulsu takta.

F_CPU = 16MHz: Period takta = 1000ms / 16000000Hz = 0,0000625msTrimer = (potrebno kašnjenje / vremenski period takta) -1 = (1000ms / 0,0000625ms) = 15999999

Sat je već otkucao 15999999 puta i dao kašnjenje od 1 s!

Za smanjenje broja tajmera možemo koristiti tehniku podjele frekvencije koja se naziva preskaliranje. AVR nam nudi sljedeće vrijednosti predskalera na izbor: 8, 64, 256 i 1024. Pogledajte tabelu sažeto prikazane rezultate korištenja različitih predkalera. Vrijednost brojača uvijek treba biti cijeli broj. Odaberemo predšteč 256!

U načinu Clear timer on Compare (CTC), registar OCR1A ili ICR1 se koristi za manipulaciju rezolucijom brojača. U CTC načinu rada brojač se briše na nulu kada vrijednost brojača (TCNT1) odgovara OCR1A ili ICR1. OCR1A ili ICR1 definiraju najveću vrijednost brojača, pa stoga i njegovu razlučivost. Ovaj način rada omogućuje veću kontrolu izlazne frekvencije usporedbe. Također pojednostavljuje rad brojanja vanjskih događaja. Moramo reći AVR -u da resetira Timer1/Brojač čim njegova vrijednost dosegne vrijednost 62500, kako bi se postiglo kašnjenje od 1s.

Pokretanje tajmera 1/brojača (vidi sliku):

TCCR1B | = (1 << WGM12) | (1 << CS12) // podesite tajmer sa predkalerom = 256 i CTC načinom rada TCNT1 = 0 // inicijalizira brojač TIMSK1 | = (1 << OCIE1A) // omogućite usporedbu prekida OCR1A = 62500 // inicijalizira vrijednost usporedbe

Korak 4: Izjava o problemu 3: Trepćimo treći LED (crveni) svakih 16 ms

Izjava o problemu 3: Trepćimo treći LED (crveni) svakih 16 ms
Izjava o problemu 3: Trepćimo treći LED (crveni) svakih 16 ms
Izjava o problemu 3: Trepćimo treći LED (crveni) svakih 16 ms
Izjava o problemu 3: Trepćimo treći LED (crveni) svakih 16 ms
Izjava o problemu 3: Trepćimo treći LED (crveni) svakih 16 ms
Izjava o problemu 3: Trepćimo treći LED (crveni) svakih 16 ms
Izjava o problemu 3: Trepćimo treći LED (crveni) svakih 16 ms
Izjava o problemu 3: Trepćimo treći LED (crveni) svakih 16 ms

Metodologija:

- pomoću predskalera Timer2 za smanjenje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;

- korišćenjem režima Clear Timer on Compare (CTC);

- korištenje hardverskog CTC načina rada bez prekida;

Tajmer2 (8 bita) broji od 0 do 255 nakon toga, prelijevaju se. Ova vrijednost se mijenja pri svakom taktu.

F_CPU = 16MHz: Vremenski period = 1000ms / 16000000Hz = 0.0000625ms

Brojač tajmera = (potrebno kašnjenje / vremenski period sata) -1 = (16 ms / 0,0000625 ms) = 255999

Sat je već otkucao 255999 puta i dao kašnjenje od 16 ms!

Pogledajte tabelu sažeto prikazane rezultate korištenja različitih predskalera. Vrijednost brojača uvijek treba biti cijeli broj. Odaberimo predčistač 1024!

U CTC načinu rada brojač se briše na nulu kada vrijednost brojača (TCNT2) odgovara OCR2A ili ICR2. Pin PB3 je takođe pin za poređenje izlaza TIMER2 - OC2A (pogledajte dijagram).

Tajmer/brojač2 Kontrolni registar A - TCCR2A Bit 7: 6 - COM2A1: 0 - Uporedite izlazni način rada za jedinicu za usporedbu A. Budući da moramo uključiti LED, biramo opciju: Uključivanje OC2A na uporedivo podudaranje Kad god dođe do podudaranja, OC2A pin se automatski prebacuje. Nema potrebe provjeravati bilo koji bit zastavice, nema potrebe paziti na prekide.

Pokreni Timer2/Brojač

TCCR2A | = (1 << COM2A0) | (1 << WGM21) // postavljanje OC2A pina tajmera u preklopnom načinu i CTC načinu rada TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // podesite mjerač vremena s predikalerom = 1024 TCNT2 = 0 // inicijalizira brojač OCR2A = 250 // inicijalizira vrijednost usporedbe

Korak 5: Pisanje koda za program na C. Učitavanje HEX datoteke u fleš memoriju mikrokontrolera

Pisanje koda za program na C. Otpremanje HEX datoteke u fleš memoriju mikrokontrolera
Pisanje koda za program na C. Otpremanje HEX datoteke u fleš memoriju mikrokontrolera
Pisanje koda za program na C. Otpremanje HEX datoteke u fleš memoriju mikrokontrolera
Pisanje koda za program na C. Otpremanje HEX datoteke u fleš memoriju mikrokontrolera

Pisanje i izrada aplikacije AVR mikrokontrolera u C kodu pomoću Integrirane razvojne platforme - Atmel Studio.

F_CPU definira frekvenciju takta u Hercima i uobičajeno je u programima koji koriste biblioteku avr-libc. U ovom slučaju rutine kašnjenja se koriste za određivanje načina izračunavanja vremenskih kašnjenja.

#ifndef F_CPU

#define F_CPU 16000000UL // kristalna frekvencija regulatora kazivanja (16 MHz AVR ATMega328P) #endif

#include // zaglavlje za omogućavanje kontrole protoka podataka preko pinova. Definira pinove, priključke itd.

Prva datoteka uključivanja dio je avr-libc i koristit će se u gotovo svim AVR projektima na kojima radite. io.h će odrediti CPU koji koristite (zato određujete dio prilikom kompajliranja) i zauzvrat će uključiti odgovarajuće zaglavlje IO definicije za čip koji koristimo. Jednostavno definira konstante za sve vaše pinove, portove, posebne registre itd.

#include // zaglavlje za omogućavanje prekida

volatile uint8_t tot_overflow; // globalna varijabla za brojanje broja prelijevanja

Metodologija izjave o problemu: Prvo bljeska (zelena) LED svakih 50 ms

- korištenje predskalera Timer0 za smanjivanje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;

- korištenje prekida svaki put kad se Timer0 prelije;

void timer0_init () // inicijalizira timer0, prekid i varijablu

{TCCR0B | = (1 << CS02); // postavljanje mjerača vremena s predkalerom = 256 TCNT0 = 0; // inicijaliziranje brojača TIMSK0 | = (1 << TOIE0); // omogući prelivanje nterrupt sei (); // omogući globalne prekide tot_overflow = 0; // inicijalizira varijablu brojača prelijevanja}

Metodologija izjave o problemu: Druga LED bljeska (plava) svakih 1 s

- korištenjem mjerača vremena Timer1 za smanjivanje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;

- korišćenjem režima Clear Timer on Compare (CTC);

- korišćenje prekida sa CTC režimom;

void timer1_init () // inicijalizira timer1, prekid i varijablu {TCCR1B | = (1 << WGM12) | (1 << CS12); // postavljanje tajmera sa predkalerom = 256 i CTC načinom rada TCNT1 = 0; // inicijaliziranje brojača OCR1A = 62500; // inicijalizira vrijednost uspoređivanja TIMSK1 | = (1 << OCIE1A); // omogući usporedi prekid}

Metodologija izjave o problemu: Treća LED lampica treperi (crveno) svakih 16 ms

- korištenjem mjerača vremena Timer2 za smanjenje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;

- korišćenjem režima Clear Timer on Compare (CTC);

- korištenje hardverskog CTC načina rada bez prekida;

void timer2_init () // inicijalizira timer2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // postavljanje OC2A pina tajmera u preklopnom modu i CTC načinu TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // postavljanje mjerača vremena s predkalerom = 1024 TCNT2 = 0; // inicijaliziranje brojača OCR2A = 250; // inicijalizira vrijednost usporedbe}

TIMER0 servisna rutina prekida prelijevanja poziva koja se poziva svaki put kada se TCNT0 prelije:

ISR (TIMER0_OVF_vect)

{tot_overflow ++; // prati broj prelivanja}

Ovaj ISR se aktivira kad god dođe do podudaranja, stoga ovdje uključite prekidač:

ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // prekidač je vodio ovdje}

int main (void)

{DDRB | = (1 << 0); // spojimo 1 (zeleno) na pin PB0 DDRC | = (1 << 1); // spojimo 2 (plavo) na pin PC1 DDRB | = (1 << 3); // spojimo 3 (crveno) led na pin PB3 (OC2A) timer0_init (); // inicijalizira timer0 timer1_init (); // inicijalizira timer1 timer2_init (); // inicijalizira timer2 while (1) // petlja zauvijek {

Da je Timer0 preletio 12 puta, prošlo bi 12 * 4.096ms = 49.152ms. U 13. iteraciji potrebno nam je kašnjenje od 50 ms - 49,152 ms = 0,848 ms. Dakle, u 13. iteraciji dopuštamo tajmeru da broji samo do 53, a zatim ga resetiramo.

if (tot_overflow> = 12) // provjerite da li nema. od prelivanja = 12 NAPOMENA: '> =' se koristi

{if (TCNT0> = 53) // provjerite da li tajmer dostiže 53 {PORTB ^= (1 << 0); // prebacuje LED TCNT0 = 0; // resetiranje brojača tot_overflow = 0; // poništavanje brojača prelijevanja}}}}

Otpremanje HEX datoteke u fleš memoriju mikrokontrolera:

otkucajte u prozoru DOS upita naredbu:

avrdude –c [ime programera] –p m328p –u –U blic: w: [naziv vaše heksadecimalne datoteke] U mom slučaju to je: avrdude –c ISPProgv1 –p m328p –u –U blic: w: Timers.hex

Ova naredba zapisuje heksadecimalnu datoteku u memoriju mikrokontrolera. Pogledajte video s detaljnim opisom snimanja flash memorije mikrokontrolera:

Snimanje fleš memorije mikrokontrolera …

Uredu! Sada mikrokontroler radi u skladu s uputama našeg programa. Hajde da provjerimo!

Korak 6: Izrada električnog kruga

Izrada električnog kola
Izrada električnog kola
Izrada električnog kola
Izrada električnog kola
Izrada električnog kola
Izrada električnog kola

Spojite komponente u skladu sa shematskim dijagramom.

Preporučuje se: