- Što je TIMER u ugrađenoj elektronici?
- Registri Arduino Timer
- Prekidi Arduino mjerača vremena
- Komponente potrebne
- Kružni dijagram
- Programiranje Arduino UNO tajmera
Razvojna platforma Arduino izvorno je razvijena 2005. godine kao program za programiranje koji se lako koristi za umjetničke dizajnerske projekte. Namjera mu je bila pomoći neinženjerima u radu s osnovnom elektronikom i mikrokontrolerima bez puno znanja o programiranju. No, zbog svoje jednostavne prirode ubrzo su je prilagodili početnici elektronike i hobisti širom svijeta, a danas je čak poželjna za razvoj prototipa i razvoj POC-a.
Iako je u redu započeti s Arduinom, važno je polako preći u jezgru mikrokontrolera poput AVR, ARM, PIC, STM itd. I programirati ga pomoću njihovih izvornih aplikacija. To je zato što je programski jezik Arduino vrlo lako razumljiv jer se većina posla obavlja unaprijed izgrađenim funkcijama poput digitalWrite (), AnalogWrite (), Delay () itd., Dok je strojni jezik niske razine skriven iza njih. Arduino programi nisu slični ostalim ugrađenim C kodiranjima gdje se bavimo bitovima registara i činimo ih visokim ili nižim na temelju logike našeg programa.
Arduino mjerači bez odgađanja:
Stoga, da bismo razumjeli što se događa unutar unaprijed izgrađenih funkcija, moramo se pokopati iza ovih izraza. Na primjer, kada se koristi funkcija delay (), ona zapravo postavlja bitove registra vremena i brojača mikrokontrolera ATmega.
U ovom uputstvu za arduino timer izbjeći ćemo upotrebu ove funkcije delay () i umjesto toga se zapravo pozabaviti samim registrima. Dobra stvar je što za to možete koristiti isti Arduino IDE. Postavit ćemo bitove registra Timer i upotrijebiti Timer Overflow Interrupt za prebacivanje LED diode svaki put kad dođe do prekida. Vrijednost predučitača bita Timer također se može podesiti pomoću tipki za upravljanje trajanjem u kojem se prekid događa.
Što je TIMER u ugrađenoj elektronici?
Tajmer je neka vrsta prekida. To je poput jednostavnog sata koji može mjeriti vremenski interval događaja. Svaki mikrokontroler ima sat (oscilator), recimo da u Arduino Uno iznosi 16 MHz. Ovo je odgovorno za brzinu. Što je takt veća, veća će biti i brzina obrade. Tajmer koristi brojač koji broji određenom brzinom, ovisno o frekvenciji takta. U Arduino Unu potrebno je 1/16000000 sekundi ili 62nano sekundi da se napravi jedan broj. Što znači da se Arduino prebacuje s jedne na drugu instrukciju svake 62 nano sekunde.
Odbrojavanja u Arduino UNO:
U Arduinu UNO postoje tri mjerača vremena koja se koriste za različite funkcije.
Timer0:
To je 8-bitni mjerač vremena i koristi se u funkciji odbrojavanja kao što su odgoda (), milis ().
Timer1:
To je 16-bitni tajmer i koristi se u servo knjižnici.
Timer2:
To je 8-bitni timer i koristi se u funkciji tone ().
Registri Arduino Timer
Za promjenu konfiguracije odbrojavanja koriste se registri odbrojavanja.
1. Registri upravljanja vremenom / brojačem (TCCRnA / B):
Ovaj registar sadrži glavne kontrolne bitove timera i koristi se za kontrolu pretkalera timera. Omogućuje i kontrolu načina odbrojavanja pomoću WGM bitova.
Format okvira:
| TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
| TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Predkaler:
Bitovi CS12, CS11, CS10 u TCCR1B postavljaju vrijednost pretcjenjivača. Za podešavanje takta odbrojavanja koristi se uređaj za predskaliranje. Arduino Uno ima predkalere od 1, 8, 64, 256, 1024.
| CS12 | CS11 | CS10 | KORISTITI |
| 0 | 0 | 0 | Nema brojača sata STOP |
| 0 | 0 | 1 | CLCK i / o / 1 Bez predkalciranja |
| 0 | 1 | 0 | CLK i / o / 8 (s uređaja za uklanjanje skala) |
| 0 | 1 | 1 | CLK i / o / 64 (s uređaja za uklanjanje skala) |
| 1 | 0 | 0 | CLK i / o / 256 (s prescalera) |
| 1 | 0 | 1 | CLK i / o / 1024 (s prescalera) |
| 1 | 1 | 0 | Vanjski izvor sata na T1 pribadači. Sat na padajućem rubu |
| 1 | 1 | 1 | Vanjski izvor sata na T1 pinu. Sat na rastućem rubu. |
2. Tajmer / brojač (TCNTn)
Ovaj se registar koristi za kontrolu vrijednosti brojača i za postavljanje vrijednosti predopterećivača.
Formula za vrijednost predopterećenja za potrebno vrijeme u sekundi:
TCNTn = 65535 - (16x10 10 xTime u sek / vrijednost predlagača)
Da biste izračunali vrijednost predopterećenja za timer1 za vrijeme od 2 sekunde:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Prekidi Arduino mjerača vremena
Prethodno smo saznali za Arduino Interrupcije i vidjeli smo da su Timer interrupcije svojevrsne softverske interrupcije. U Arduinu postoje razni prekidači s odbrojavanjem vremena koji su objašnjeni u nastavku.Prekid preljeva tajmera:
Kad god tajmer dosegne svoju maksimalnu vrijednost, recimo recimo (16 Bit-65535), javlja se prekid preljeva tajmera . Dakle, poziva se rutina usluge ISR prekida kada je bit prekida prekidanja tajmera omogućen u TOIExu prisutnom u registru maske prekida tajmera TIMSKx.
ISR format:
ISR (TIMERx_OVF_vect) { }
Registar izlazne usporedbe (OCRnA / B):
Ovdje kada se dogodi prekid podudaranja rezultata izlaza tada se poziva usluga prekida ISR (TIMERx_COMPy_vect), a bit OCFxy zastavice bit će postavljen u TIFRx registru. Ovaj ISR je omogućen postavljanjem bita za omogućavanje u OCIExy prisutnom u registru TIMSKx. Gdje je TIMSKx registar maski prekida s odbrojavanjem.
Hvatanje ulaznog brojača:
Sljedeće kada se dogodi prekid hvatanja ulaznog vremena, tada se poziva usluga prekida ISR (TIMERx_CAPT_vect), a također će biti postavljen i bit zastavice ICFx u TIFRx (registar zastavica prekida). Ovaj ISR je omogućen postavljanjem bita za omogućavanje u ICIEx koji je prisutan u registru TIMSKx.
Komponente potrebne
- Arduino UNO
- Tipke (2)
- LED (bilo koja boja)
- Otpornik 10k (2), 2,2k (1)
- LCD zaslon od 16x2
Kružni dijagram

Kružne veze između Arduino UNO i LCD zaslona 16x2:
|
LCD 16x2 |
Arduino UNO |
|
VSS |
GND |
|
VDD |
+ 5V |
|
V0 |
Na središnji pin potenciometra za kontrolu kontrasta LCD-a |
|
RS |
8 |
|
RW |
GND |
|
E |
9 |
|
D4 |
10 |
|
D5 |
11 |
|
D6 |
12 |
|
D7 |
13 |
|
A |
+ 5V |
|
K |
GND |
Dvije tipke s povučenim otpornicima od 10K povezane su s Arduino pinovima 2 i 4, a LED dioda je povezana s PIN-om 7 Arduina kroz 2.2K otpornik.
Postavljanje će izgledati kao na slici ispod.
Programiranje Arduino UNO tajmera
U ovom uputstvu koristit ćemo TIMER OVERFLOW INTERRUPT i koristiti ga za treptanje LED-a UKLJUČENO I ISKLJUČENO tijekom određenog trajanja podešavanjem vrijednosti predopterećivača (TCNT1) pomoću tipki. Kompletni kod za Arduino Timer dan je na kraju. Ovdje objašnjavamo kôd redak po redak:
Kako se 16x2 LCD koristi u projektu za prikaz vrijednosti prednapremača, tako se koristi i biblioteka s tekućim kristalima.
#include
LED anodni pin koji je povezan s Arduino pin 7 definiran je kao ledPin .
#define ledPin 7
Dalje se objekt za pristup klasi Liquid Crystal deklarira s LCD pinovima (RS, E, D4, D5, D6, D7) koji su povezani s Arduino UNO.
LCD LiquidCrystal (8,9,10,11,12,13);
Zatim postavite vrijednost pred-učitavača 3035 na 4 sekunde. Provjerite gornju formulu da biste izračunali vrijednost predopterećenja.
plutajuća vrijednost = 3035;
Sljedeće u void postavljanju (), prvo postavite LCD u način rada 16x2 i na nekoliko sekundi prikažite poruku dobrodošlice.
lcd.početak (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); kašnjenje (2000); lcd.clear ();
Dalje postavite LED pin kao OUTPUT pin, a gumbi su postavljeni kao INPUT pin
pinMode (ledPin, IZLAZ); pinMode (2, INPUT); pinMode (4, INPUT);
Sljedeće onemogućite sve prekide:
noInterrupts ();
Sljedeći je timer1 inicijaliziran.
TCCR1A = 0; TCCR1B = 0;
Vrijednost odbrojavanja predučitavača postavljena je (u početku 3035).
TCNT1 = vrijednost;
Tada se u registar TCCR1B postavlja vrijednost skala 1024.
TCCR1B - = (1 << CS10) - (1 << CS12);
Prekid preljeva tajmera omogućen je u registru maske prekida tajmera tako da se ISR može koristiti.
TIMSK1 - = (1 << TOIE1);
Napokon su omogućeni svi prekidi.
prekida ();
Sada napišite ISR za Timer Overflow Interrupt koji je odgovoran za UKLJUČIVANJE I ISKLJUČIVANJE LED-a pomoću digitalWrite . Stanje se mijenja kad god se dogodi prekid preljeva timera.
ISR (TIMER1_OVF_vect) { TCNT1 = vrijednost; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
U praznoj petlji () vrijednost predopterećivača povećava se ili smanjuje pomoću ulaza s tipkama, a vrijednost se prikazuje i na LCD zaslonu 16x2.
if (digitalRead (2) == HIGH) { vrijednost = vrijednost + 10; // Vrijednost predopterećenja podsticanja } if (digitalRead (4) == HIGH) { value = value-10; // Umanji vrijednost predopterećenja } lcd.setCursor (0,0); lcd.print (vrijednost); }
Dakle, ovako se tajmer može koristiti za stvaranje kašnjenja u programu Arduino. Pogledajte video u nastavku u kojem smo pokazali promjenu u kašnjenju povećavanjem i smanjivanjem vrijednosti predopterećivača pomoću gumba.
