- Mi a TIMER a beágyazott elektronikában?
- Arduino időzítő regisztrálja
- Arduino időzítő megszakítja
- Szükséges alkatrészek
- Kördiagramm
- Arduino UNO Timers programozása
Az Arduino Development Platform eredetileg 2005-ben készült, könnyen használható programozható eszközként művészeti tervezési projektekhez. Célja az volt, hogy segítse a nem mérnököket abban, hogy sok programozási ismeret nélkül dolgozzanak az alapvető elektronikával és mikrovezérlőkkel. De könnyen kezelhető természete miatt hamarosan az elektronika kezdői és hobbijainak köszönhetően világszerte adaptálták, és ma még a prototípus fejlesztésében és a POC fejlesztésekben is előnyben részesítik.
Bár rendben van az Arduino-val kezdeni, fontos, hogy lassan belépjünk az alapvető mikrovezérlőkbe, mint például az AVR, ARM, PIC, STM stb., És beprogramozzuk a natív alkalmazások segítségével. Ennek oka, hogy az Arduino programozási nyelv nagyon könnyen érthető, mivel a munka nagy részét előre felépített funkciók végzik, mint például a digitalWrite (), AnalogWrite (), Delay () stb., Miközben az alacsony szintű gépnyelv mögöttük van. Az Arduino programok nem hasonlítanak más beágyazott C kódolásokhoz, ahol a regiszterbitekkel foglalkozunk, és a program logikája alapján magasra vagy alacsonyra tesszük őket.
Arduino Timers késedelem nélkül:
Ezért ahhoz, hogy megértsük, mi történik az előre felépített funkciókban, be kell ásnunk ezeket a kifejezéseket. Például késleltetés () függvény használatakor a tényleges beállítja az ATmega mikrovezérlő időzítő és számláló regiszter bitjeit.
Ebben az arduino időzítő oktatóprogramban elkerüljük ennek a delay () függvénynek a használatát, és valójában magukkal a Regiszterekkel foglalkozunk. A jó dolog az, hogy ehhez ugyanazt az Arduino IDE-t használhatja. Beállítjuk az időzítő regiszterbitjeinket, és az időzítő túlcsordulás megszakításával kapcsolhatunk egy LED-t minden alkalommal, amikor a megszakítás bekövetkezik. Az Időzítő bit előterhelőjének értéke a gombok segítségével is beállítható a megszakítás időtartamának szabályozására.
Mi a TIMER a beágyazott elektronikában?
Az időzítő egyfajta megszakítás. Olyan ez, mint egy egyszerű óra, amely képes mérni egy esemény időintervallumát. Minden mikrovezérlőnek van órája (oszcillátora), mondjuk az Arduino Uno-ban 16Mhz. Ez felelős a sebességért. Minél magasabb az órajel frekvenciája, nagyobb lesz a feldolgozási sebesség. Az időzítő számlálót használ, amely bizonyos sebességgel számol, az óra frekvenciájától függően. Az Arduino Uno-ban 1/16000000 másodperc vagy 62 nano másodperc szükséges egyetlen számláláshoz. Jelentése: Arduino 62 nano másodpercenként mozog egyik utasításból a másikba.
Időzítők az Arduino UNO-ban:
Az Arduino UNO-ban három időzítőt használnak különböző funkciókhoz.
Időzítő0:
Ez egy 8 bites időzítő, amelyet olyan időzítő funkciókban használnak, mint a delay (), millis ().
1. időzítő:
Ez egy 16 bites időzítő, amelyet a szervo könyvtárban használnak.
2. időzítő:
Ez egy 8 bites időzítő, amelyet tone () funkcióban használnak.
Arduino időzítő regisztrálja
Az időzítők konfigurációjának megváltoztatásához időzítő regisztereket használunk.
1. Időzítő / számláló vezérlő nyilvántartások (TCCRnA / B):
Ez a regiszter az időzítő fő vezérlőbitjeit tartalmazza, és az időmérő előmérőinek vezérlésére szolgál. Ez lehetővé teszi az időzítő módjának vezérlését a WGM bitek használatával is.
Keret formátuma:
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 |
Előmérlegelő:
A TCCR1B-ben lévő CS12, CS11, CS10 bitek beállítják az előmérő értékét. Az időmérő az időmérő órajelének beállítására szolgál. Az Arduino Uno 1, 8, 64, 256, 1024 előskálázókkal rendelkezik.
CS12 | CS11 | CS10 | HASZNÁLAT |
0 | 0 | 0 | Nincs időzítő STOP |
0 | 0 | 1 | CLCK i / o / 1 Nincs előméretezés |
0 | 1 | 0 | CLK i / o / 8 (a Prescaler-től) |
0 | 1 | 1 | CLK i / o / 64 (a Prescaler-től) |
1 | 0 | 0 | CLK i / o / 256 (a Prescaler-től) |
1 | 0 | 1 | CLK i / o / 1024 (a Prescaler-től) |
1 | 1 | 0 | Külső óraforrás a T1 tűn. Óra az eső szélén |
1 | 1 | 1 | Külső óraforrás a T1 tűn. Óra emelkedő szélén. |
2. Időzítő / számláló regisztráció (TCNTn)
Ez a regiszter a számláló értékének vezérlésére és az előfeltöltő értékének beállítására szolgál.
Képlet az előfeltöltő értékéhez a kívánt időre másodpercben:
TCNTn = 65535 - (16x10 10 xTime sec / Prescaler értékben)
Az időzítő1 előterhelőjének értékének kiszámításához 2 mp-ig:
TCNT1 = 65535 - (16x10 10 X2 / 1024) = 34.285
Arduino időzítő megszakítja
Korábban megtudtuk az Arduino megszakításokat, és láttuk, hogy az időzítő megszakítások valamiféle szoftveres megszakítások. Az Arduino-ban különféle időzített megszakítások vannak, amelyeket az alábbiakban ismertetünk.Időzítő túlcsordulás megszakítása:
Amikor az időzítő eléri a maximális értéket, például (16 Bit-65535), az időzítő túlcsordulás megszakadása következik be. Tehát, egy ISR megszakítási szolgáltatási rutint hívunk meg, amikor az időzítő megszakítási maszk regiszter TIMSKx regisztrációjában lévő TOIEx időzített túlcsordulás megszakítási bit engedélyezve van.
ISR formátum:
ISR (TIMERx_OVF_vect) { }
Kimenet összehasonlító regisztráció (OCRnA / B):
Itt, amikor az Output Compare Match Interrupt bekövetkezik, akkor az ISR (TIMERx_COMPy_vect) megszakítási szolgáltatást hívják meg, és az OCFxy jelző bitet is beállítják a TIFRx regiszterben. Ezt az ISR engedélyezi az engedélyezési bit beállításával a TIMSKx regiszterben lévő OCIExy-ben. Ahol a TIMSKx az Időzített megszakító maszk regiszter.
Időzítő bemenet rögzítése:
Ezután, amikor az időzítő bemeneti rögzítésének megszakadása bekövetkezik, akkor az ISR (TIMERx_CAPT_vect) megszakítási szolgáltatás meghívásra kerül, és az ICFx jelző bit is be lesz állítva a TIFRx (időzítő megszakítási jelző regiszterben). Ezt az ISR-t úgy engedélyezi, hogy beállítja az engedélyezési bitet a TIMSKx regiszterben lévő ICIEx-ben.
Szükséges alkatrészek
- Arduino UNO
- Nyomógombok (2)
- LED (bármilyen színű)
- 10k ellenállás (2), 2,2k (1)
- 16x2 LCD kijelző
Kördiagramm
Áramköri kapcsolatok az Arduino UNO és a 16x2 LCD kijelző között:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Potenciométer középső csapjához az LCD kontrasztszabályozásához |
RS |
8. |
RW |
GND |
E |
9. |
D4 |
10. |
D5 |
11. |
D6 |
12. |
D7 |
13. |
A |
+ 5V |
K |
GND |
Két 10K lehúzható ellenállású nyomógomb csatlakozik az Arduino 2 és 4 csapokhoz, és egy LED csatlakozik az Arduino 7-es PIN-jéhez egy 2,2K-os ellenálláson keresztül.
A beállítás úgy fog kinézni, mint a kép alatt.
Arduino UNO Timers programozása
Ebben az oktatóanyagban a TIMER OVERFLOW INTERRUPT-t fogjuk használni, és arra használjuk, hogy bizonyos időtartamra villogjon a LED BE és KI az előterhelő értékének (TCNT1) nyomógombokkal történő beállításával. Az Arduino Timer teljes kódja a végén található. Itt soronként magyarázzuk a kódot:
Mivel a projektben 16x2 LCD-t használnak az előterhelő értékének megjelenítésére, ezért folyadékkristály-könyvtárat használnak.
#include
Az Arduino 7 tűhöz csatlakoztatott LED anódtüske ledPin néven van meghatározva.
#define ledPin 7
Ezután a folyadékkristály osztály elérésére szolgáló objektumot deklaráljuk az LCD csapokkal (RS, E, D4, D5, D6, D7), amelyek kapcsolódnak az Arduino UNO-hoz.
LiquidCrystal lcd (8,9,10,11,12,13);
Ezután állítsa be az előfeltöltő 3035 értékét 4 másodpercre. Ellenőrizze a fenti képletet az előfeltöltő értékének kiszámításához.
úszóérték = 3035;
Ezután az érvénytelen beállításban () először állítsa be az LCD-t 16x2 módba, és üdvözlő üzenetet jelenítsen meg néhány másodpercig.
lcdbegin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO IDŐZÍTŐK"); késés (2000); lcd.clear ();
Ezután állítsa a LED csapot OUTPUT tűvé, a nyomógombok pedig INPUT tüskékké
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Ezután tiltsa le az összes megszakítást:
noInterrupts ();
Ezután az Időzítő1 inicializálódik.
TCCR1A = 0; TCCR1B = 0;
Az előfeltöltő időzítő értéke be van állítva (kezdetben 3035-ként).
TCNT1 = érték;
Ezután az 1024 előtti skálázó érték be van állítva a TCCR1B regiszterben.
TCCR1B - = (1 CS10) - (1 CS12);
Az időzítő túlcsordulás megszakítása engedélyezve van az időzítő megszakítási maszk regiszterben, így az ISR használható.
TIMSK1 - = (1 << TOIE1);
Végre minden megszakítás engedélyezve van.
megszakítja ();
Írja meg az időzített túlcsordulás megszakítás ISR- jét, amely felelős a LED be- és kikapcsolásáért a digitalWrite segítségével. Az állapot változik, amikor az időzítő túlcsordulás megszakad.
ISR (TIMER1_OVF_vect) { TCNT1 = érték; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
A void ciklusban () az előfeltöltő értékét a nyomógomb bemenetekkel növeljük vagy csökkentjük, és az érték megjelenik a 16x2 LCD-n is.
if (digitalRead (2) == HIGH) { érték = érték + 10; // Incement preload value } if (digitalRead (4) == HIGH) { value = value-10; // Előretöltési érték csökkentése } lcd.setCursor (0,0); lcd.print (érték); }
Tehát egy időzítő segítségével késleltethető az Arduino program. Ellenőrizze az alábbi videót, ahol bemutattuk a késés változását az előterhelő értékének növelésével és csökkentésével a nyomógombokkal.