- Ce este TIMER în electronică încorporată?
- Registrele cu temporizator Arduino
- Temporizatorul Arduino se întrerupe
- Componente necesare
- Diagrama circuitului
- Programarea temporizatoarelor Arduino UNO
Platforma de dezvoltare Arduino a fost dezvoltată inițial în 2005 ca un dispozitiv programabil ușor de utilizat pentru proiecte de design artistic. Intenția sa era de a ajuta neinginerii să lucreze cu electronice de bază și microcontrolere fără prea multe cunoștințe de programare. Dar, datorită naturii sale ușor de utilizat, a fost în curând adaptat de începătorii și pasionații de electronice din întreaga lume și astăzi este chiar preferat pentru dezvoltarea prototipurilor și dezvoltările POC.
Deși este bine să începeți cu Arduino, este important să vă deplasați încet în microcontrolerele de bază, cum ar fi AVR, ARM, PIC, STM etc. și să le programați utilizând aplicațiile lor native. Acest lucru se datorează faptului că limbajul de programare Arduino este foarte ușor de înțeles, deoarece cea mai mare parte a muncii este realizată de funcții pre-construite, cum ar fi digitalWrite (), AnalogWrite (), Delay () etc. Programele Arduino nu sunt similare cu alte coduri C încorporate, unde avem de-a face cu biții de registru și îi facem mari sau mici pe baza logicii programului nostru.
Temporizatoare Arduino fără întârziere:
Prin urmare, pentru a înțelege ce se întâmplă în interiorul funcțiilor pre-construite, trebuie să sapăm în spatele acestor termeni. De exemplu, când se utilizează o funcție delay (), ea setează efectiv biții Timer și Counter Register ai microcontrolerului ATmega.
În acest tutorial cu temporizator arduino vom evita utilizarea acestei funcții delay () și, în schimb, ne vom ocupa de registrele în sine. Lucrul bun este că puteți utiliza același IDE Arduino pentru acest lucru. Vom seta biții de registru ai temporizatorului și vom folosi întreruperea Timer Overflow Interrupt pentru a comuta un LED de fiecare dată când apare întreruperea. Valoarea de preîncărcare a bitului Timer poate fi de asemenea reglată folosind butoane pentru a controla durata în care are loc întreruperea.
Ce este TIMER în electronică încorporată?
Temporizatorul este într-un fel de întrerupere. Este ca un ceas simplu care poate măsura intervalul de timp al unui eveniment. Fiecare microcontroler are un ceas (oscilator), să zicem că în Arduino Uno este 16Mhz. Aceasta este responsabilă pentru viteză. Cu cât frecvența ceasului este mai mare va fi viteza de procesare. Un cronometru folosește contorul care contează la o anumită viteză, în funcție de frecvența ceasului. În Arduino Uno este nevoie de 1/16000000 secunde sau 62nano secunde pentru a face un singur număr. Adică Arduino trece de la o instrucțiune la alta pentru fiecare 62 nano secundă.
Temporizatoare în Arduino UNO:
În Arduino UNO există trei temporizatoare utilizate pentru funcții diferite.
Temporizator0:
Este un temporizator de 8 biți și utilizat în funcția de temporizare, cum ar fi delay (), millis ().
Temporizator 1:
Este un cronometru de 16 biți și utilizat în servotecă.
Temporizator 2:
Este un temporizator de 8 biți și este utilizat în funcția de ton ().
Registrele cu temporizator Arduino
Pentru a modifica configurația temporizatoarelor, se utilizează registre de temporizare.
1. Registre de control al temporizatorului / contorului (TCCRnA / B):
Acest registru deține principalele biți de control ai temporizatorului și este utilizat pentru a controla prescalerii temporizatorului. De asemenea, permite controlul modului temporizatorului utilizând biții WGM.
Format cadru:
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 |
Precalificator:
Bitii CS12, CS11, CS10 din TCCR1B stabilesc valoarea prescalerului. Un prescaler este utilizat pentru a configura viteza de ceas a cronometrului. Arduino Uno are prescaleri de 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | UTILIZARE |
0 | 0 | 0 | Fără temporizator de ceas STOP |
0 | 0 | 1 | CLCK i / o / 1 Fără prescalare |
0 | 1 | 0 | CLK i / o / 8 (de la Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (de la Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (de la Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (de la Prescaler) |
1 | 1 | 0 | Sursă de ceas externă pe pinul T1. Ceas pe marginea de cădere |
1 | 1 | 1 | Sursă externă de ceas pe pinul T1. Ceas pe margine ascendentă. |
2. Cronometru / Registrul contorului (TCNTn)
Acest registru este utilizat pentru a controla valoarea contorului și pentru a seta o valoare de preîncărcare.
Formula pentru valoarea preîncărcătorului pentru timpul necesar în secundă:
TCNTn = 65535 - (16x10 10 xTime în sec / Valoare prescaler)
Pentru a calcula valoarea preîncărcării pentru timer1 pentru timp de 2 secunde:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Temporizatorul Arduino se întrerupe
Am aflat anterior despre întreruperile Arduino și am văzut că întreruperile cu temporizator sunt un fel de întreruperi software. Există diferite întreruperi ale temporizatorului în Arduino, care sunt explicate mai jos.Timer Overflow Overrupt:
Ori de câte ori cronometrul atinge valoarea maximă, spuneți, de exemplu (16 biți-65535), se produce întreruperea de depășire a temporizatorului . Deci, o rutină de serviciu de întrerupere ISR este apelată atunci când bitul de întrerupere Timer Overflow Interrupt este activat în TOIEx prezent în registrul de mască de întrerupere a temporizatorului TIMSKx.
Format ISR:
ISR (TIMERx_OVF_vect) { }
Registrul de comparare a rezultatelor (OCRnA / B):
Aici, atunci când apare o întrerupere de comparare a rezultatelor, atunci se apelează serviciul de întrerupere ISR (TIMERx_COMPy_vect) și, de asemenea, bitul de semnalizare OCFxy va fi setat în registrul TIFRx. Acest ISR este activat prin setarea bitului de activare în OCIExy prezent în registrul TIMSKx. În cazul în care TIMSKx este Timer Interrupt Mask Register.
Captură intrare temporizator:
Apoi, când apare temporizatorul de intrare de captură de intrare, atunci se apelează serviciul de întrerupere ISR (TIMERx_CAPT_vect) și, de asemenea, bitul de semnal ICFx va fi setat în TIFRx (Timer Interrupt Flag Register). Acest ISR este activat prin setarea bitului de activare în ICIEx prezent în registrul TIMSKx.
Componente necesare
- Arduino UNO
- Butoane (2)
- LED (orice culoare)
- Rezistor 10k (2), 2,2k (1)
- Afișaj LCD 16x2
Diagrama circuitului
Conexiuni de circuit între Arduino UNO și afișaj LCD 16x2:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
La pinul central al potențiometrului pentru controlul contrastului LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
Două butoane Push cu rezistențe de tragere de 10K sunt conectate cu pinii Arduino 2 și 4 și un LED este conectat la PIN-ul 7 al Arduino printr-un rezistor de 2,2K.
Configurarea va arăta ca imaginea de mai jos.
Programarea temporizatoarelor Arduino UNO
În acest tutorial vom folosi TIMER OVERFLOW INTERRUPT și îl vom folosi pentru a clipi LED-ul PORNIT și OPRIT pentru o anumită durată, ajustând valoarea preîncărcării (TCNT1) folosind butoane. Codul complet pentru Arduino Timer este dat la sfârșit. Aici explicăm codul rând cu rând:
Deoarece LCD-ul de 16x2 este utilizat în proiect pentru a afișa valoarea preîncărcătorului, se folosește astfel biblioteca de cristale lichide.
#include
Pinul anodic LED care este conectat cu pinul Arduino 7 este definit ca ledPin .
#define ledPin 7
Apoi obiectul pentru accesarea clasei de cristal lichid este declarat cu pinii LCD (RS, E, D4, D5, D6, D7) care sunt conectați cu Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Apoi setați valoarea de preîncărcare 3035 timp de 4 secunde. Verificați formula de mai sus pentru a calcula valoarea preîncărcătorului.
valoare float = 3035;
Apoi în setarea nulă (), setați mai întâi ecranul LCD în modul 16x2 și afișați un mesaj de bun venit pentru câteva secunde.
lcd.inceput (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); întârziere (2000); lcd.clear ();
Apoi setați pinul LED ca pin OUTPUT și butoanele Push sunt setate ca pin INPUT
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Apoi dezactivați toate întreruperile:
noInterrupts ();
Apoi Timer1 este inițializat.
TCCR1A = 0; TCCR1B = 0;
Valoarea temporizatorului de preîncărcare este setată (inițial ca 3035).
TCNT1 = valoare;
Apoi valoarea pre-scalator 1024 este setată în registrul TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
Întreruperea de depășire a temporizatorului este activată în registrul Timer Interrupt Mask, astfel încât ISR-ul să poată fi utilizat.
TIMSK1 - = (1 << TOIE1);
În cele din urmă, toate întreruperile sunt activate.
întrerupe ();
Acum scrieți ISR pentru Timer Overflow Interrupt, care este responsabil pentru pornirea și oprirea LED-ului folosind digitalWrite . Starea se schimbă ori de câte ori apare întreruperea de revărsare a temporizatorului.
ISR (TIMER1_OVF_vect) { TCNT1 = valoare; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
În bucla de gol () valoarea preîncărcătorului este mărită sau scăzută utilizând intrările butonului și, de asemenea, valoarea este afișată pe ecranul LCD 16x2.
if (digitalRead (2) == HIGH) { valoare = valoare + 10; // Includeți valoarea preîncărcare } if (digitalRead (4) == HIGH) { value = value-10; // Decrement pre- load value } lcd.setCursor (0,0); lcd.print (valoare); }
Deci, așa se poate folosi un cronometru pentru a produce întârzieri în programul Arduino. Verificați videoclipul de mai jos, unde am demonstrat modificarea întârzierii prin creșterea și scăderea valorii preîncărcării folosind butoanele Push.