Sadržaj:

AVR mikrokontroler. LED treperi pomoću mjerača vremena. Odbrojavanje prekida. Timer CTC način rada: 6 koraka
AVR mikrokontroler. LED treperi pomoću mjerača vremena. Odbrojavanje prekida. Timer CTC način rada: 6 koraka

Video: AVR mikrokontroler. LED treperi pomoću mjerača vremena. Odbrojavanje prekida. Timer CTC način rada: 6 koraka

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

Pozdrav svima!

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

Korak 1: Opis

Izjava o problemu 1: Trepćimo prvu LED (zelenu) svakih 50 ms
Izjava o problemu 1: Trepćimo prvu LED (zelenu) 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;

Timer/Counter1 (TC1) - 16 -bitna Timer/Counter jedinica omogućuje točno mjerenje vremena izvođenja programa (upravljanje događajima), generiranje valova i mjerenje vremena signala;

Timer/Counter2 (TC2) -opća je namjena, kanal, 8 -bitni Timer/Counter modul s PWM -om i asinhronim radom;

Korak 2: Izjava o problemu 1: Trepćimo prvu LED (zelenu) svakih 50 ms

Izjava o problemu 1: Najprije ćemo zasvijetliti LED (zeleno) svakih 50 ms
Izjava o problemu 1: Najprije ćemo zasvijetliti LED (zeleno) svakih 50 ms
Izjava o problemu 1: Trepćimo prvu LED (zelenu) svakih 50 ms
Izjava o problemu 1: Trepćimo prvu LED (zelenu) svakih 50 ms

Metodologija:

- pomoću predbrojača Timer0 za smanjenje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;

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

Timer0 (8 bit) nakon toga broji od 0 do 255, prelijevaju se, ta se vrijednost mijenja pri svakom taktu sata.

F_CPU = 16MHz: Vremensko razdoblje = 1000ms / 16000000Hz = 0,0000625ms

Brojač timera = (potrebno kašnjenje / vremensko razdoblje sata) -1 = (50 ms / 0,0000625 ms) = 799999

Sat je već otkucao 799999 puta što daje kašnjenje od samo 50 ms!

Za smanjenje broja tajmera možemo koristiti tehniku podjele frekvencije koja se naziva predskaliranje. AVR nam nudi sljedeće vrijednosti predskalera za odabir: 8, 64, 256 i 1024. Pogledajte tablicu sažete rezultate korištenja različitih predkalera.

Vrijednost brojača uvijek treba biti cijeli broj. Odaberimo preddjeljivač 256!

U većini mikrokontrolera postoji nešto što se zove Interrupt. Ovaj prekid može se aktivirati kad god su ispunjeni određeni uvjeti. Sada, kad god se prekid pokrene, 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 glavna rutina i nastavlja je izvršavati.

Budući da je potrebno kašnjenje (50 ms) veće od maksimalnog mogućeg kašnjenja: 4, 096 ms = 1000 ms / 62500Hz * 256, očito će se mjerač vremena preplaviti. I kad god se mjerač vremena 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 krpelj traje 0,016 ms. Dakle, za postizanje kašnjenja od 0,848ms, potrebno je 0,848ms / 0,016ms = 53 krpelja. Dakle, u 13. iteraciji dopuštamo da mjerač vremena broji samo do 53, a zatim ga resetiramo.

Pokreni Timer0/Brojač (vidi sliku):

TCCR0B | = (1 << CS02) // podesite mjerač vremena s predmjeračem = 256 TCNT0 = 0 // inicijalizirajte brojač TIMSK0 | = (1 << TOIE0) // omogućite prekid prelijevanja sei () // omogućite globalne prekide tot_overflow = 0 // inicijalizirati varijablu brojača preljeva

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

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

Metodologija:

- pomoću predbrojača Timer1 za smanjivanje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;

- pomoću Clear Timer -a u načinu uspoređivanja (CTC);

- korištenje prekida s CTC načinom rada;

Timer1 (16 bit) broji od 0 do 65534 nakon toga, prelijevaju se. Ta se vrijednost mijenja pri svakom impulsu takta.

F_CPU = 16MHz: Vremensko razdoblje sata = 1000ms / 16000000Hz = 0,0000625msTimbroj = = (potrebno kašnjenje / vremensko razdoblje sata) -1 = (1000ms / 0,0000625ms) = 15999999

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

Za smanjenje broja tajmera možemo koristiti tehniku podjele frekvencije koja se naziva predskaliranje. AVR nudi sljedeće vrijednosti predskalera za odabir: 8, 64, 256 i 1024. Pogledajte tablicu sažete rezultate korištenja različitih predkalera. Vrijednost brojača uvijek treba biti cijeli broj. Odaberimo preddjeljivač 256!

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

Inicijaliziraj Timer1/Brojač (vidi sliku):

TCCR1B | = (1 << WGM12) | (1 << CS12) // podesite mjerač vremena s predmjeračem = 256 i načinom rada CTC TCNT1 = 0 // inicijalizira brojač TIMSK1 | = (1 << OCIE1A) // omogući usporedbu prekida za usporedbu OCR1A = 62500 // inicijalizira vrijednost uspoređivanja

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

Izjava o problemu 3: Trepćimo treću LED (crveno) svakih 16 ms
Izjava o problemu 3: Trepćimo treću LED (crveno) svakih 16 ms
Izjava o problemu 3: Trepćimo treću LED (crveno) svakih 16 ms
Izjava o problemu 3: Trepćimo treću LED (crveno) svakih 16 ms
Izjava o problemu 3: Trepćimo treću LED (crveno) svakih 16 ms
Izjava o problemu 3: Trepćimo treću LED (crveno) svakih 16 ms
Izjava o problemu 3: Trepćimo treću LED (crveno) svakih 16 ms
Izjava o problemu 3: Trepćimo treću LED (crveno) svakih 16 ms

Metodologija:

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

- pomoću Clear Timer -a u načinu usporedbe (CTC);

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

Timer2 (8 bit) broji od 0 do 255 nakon toga, prelijevaju se. Ta se vrijednost mijenja pri svakom impulsu takta.

F_CPU = 16MHz: Vremensko razdoblje = 1000ms / 16000000Hz = 0,0000625ms

Brojač timera = (potrebno kašnjenje / vremensko razdoblje sata) -1 = (16 ms / 0,0000625 ms) = 255999

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

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

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

Upravljački registar mjerača vremena/brojača2 A - TCCR2A Bit 7: 6 - COM2A1: 0 - Način usporedbe izlaza za usporedbu jedinice A. Budući da moramo uključiti LED, biramo opciju: Uključivanje OC2A na Usporedi podudaranje Kad god dođe do usporedbe, podudaranje 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 TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // postavljanje mjerača vremena s predkalerom = 1024 TCNT2 = 0 // inicijalizacija brojača OCR2A = 250 // inicijalizacija vrijednosti usporedbe

Korak 5: Zapisivanje koda za program na C. Prijenos HEX datoteke u flash memoriju mikrokontrolera

Pisanje koda za program na C. Prijenos HEX datoteke u flash memoriju mikrokontrolera
Pisanje koda za program na C. Prijenos HEX datoteke u flash memoriju mikrokontrolera
Pisanje koda za program na C. Prijenos HEX datoteke u flash memoriju mikrokontrolera
Pisanje koda za program na C. Prijenos HEX datoteke u flash memoriju mikrokontrolera

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

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

#ifndef F_CPU

#define F_CPU 16000000UL // govorna frekvencija kristala kontrolera (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 prilikom sastavljanja navodite dio) i zauzvrat 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 preljeva

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

- pomoću predbrojača Timer0 za smanjenje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;

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

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

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

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

- pomoću predbrojača Timer1 za smanjenje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;

- pomoću Clear Timer -a u načinu usporedbe (CTC);

- korištenje prekida s CTC načinom rada;

void timer1_init () // inicijalizira timer1, prekid i varijablu {TCCR1B | = (1 << WGM12) | (1 << CS12); // postavljanje mjerača vremena s 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

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

- pomoću Clear Timer -a u načinu usporedbe (CTC);

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

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

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

ISR (TIMER0_OVF_vect)

{tot_overflow ++; // prati broj prelijevanja}

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) na pin PB3 (OC2A) timer0_init (); // inicijalizacija timer0 timer1_init (); // inicijalizacija timer1 timer2_init (); // inicijalizira timer2 while (1) // zauvijek petlja {

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

if (tot_overflow> = 12) // provjeriti je li ne. preljeva = 12 NAPOMENA: '> =' se koristi

{if (TCNT0> = 53) // provjerite doseže li brojčanik vremena 53 {PORTB ^= (1 << 0); // prebacuje LED TCNT0 = 0; // resetiranje brojača tot_overflow = 0; // poništavanje brojača preljeva}}}}

Prijenos HEX datoteke u flash memoriju mikrokontrolera:

u prozor DOS upita upišite 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 flash memorije mikrokontrolera …

U redu! Sada mikrokontroler radi u skladu s uputama našeg programa. Idemo provjeriti!

Korak 6: Izrada električnog kruga

Izrada električnog kruga
Izrada električnog kruga
Izrada električnog kruga
Izrada električnog kruga
Izrada električnog kruga
Izrada električnog kruga

Spojite komponente u skladu sa shematskim dijagramom.

Preporučeni: