- Kas ir TIMER iegultajā elektronikā?
- Arduino taimeris reģistrē
- Arduino taimeris pārtrauc
- Nepieciešamās sastāvdaļas
- Ķēdes shēma
- Arduino UNO taimeru programmēšana
Arduino izstrādes platforma sākotnēji tika izstrādāta 2005. gadā kā viegli lietojama programmējama ierīce mākslas dizaina projektiem. Tās nolūks bija palīdzēt neinženieriem strādāt ar pamata elektroniku un mikrokontrolleriem bez daudz programmēšanas zināšanām. Bet tad, tā viegli izmantojamās dabas dēļ to drīz pielāgoja elektronikas iesācēji un hobiji visā pasaulē, un šodien tas pat tiek izvēlēts prototipu izstrādei un POC izstrādei.
Lai gan ir pareizi sākt ar Arduino, ir svarīgi lēnām pāriet uz galvenajiem mikrokontrolleriem, piemēram, AVR, ARM, PIC, STM utt., Un ieprogrammēt to, izmantojot viņu vietējās lietojumprogrammas. Tas ir tāpēc, ka Arduino programmēšanas valodu ir ļoti viegli saprast, jo lielāko daļu darba veic iepriekš izveidotas funkcijas, piemēram, digitalWrite (), AnalogWrite (), Delay () utt., Savukārt zemā līmeņa mašīnu valoda ir paslēpta aiz tām. Arduino programmas nav līdzīgas citām iegultās C kodēm, kur mēs strādājam ar reģistra bitiem un padarām tos augstus vai zemus, pamatojoties uz mūsu programmas loģiku.
Arduino taimeri bez kavēšanās:
Tādējādi, lai saprastu, kas notiek iepriekš izveidoto funkciju iekšpusē, mums ir jārok aiz šiem noteikumiem. Piemēram, ja tiek izmantota delay () funkcija, tā faktiski iestata mikrokontrollera ATmega taimera un skaitītāja reģistra bitus.
Šajā arduino taimera apmācībā mēs izvairīsimies no šīs aizkavēšanās () funkcijas izmantošanas un tā vietā faktiski nodarbojamies ar pašiem reģistriem. Laba lieta ir tā, ka šim nolūkam varat izmantot to pašu Arduino IDE. Mēs iestatīsim mūsu taimera reģistra bitus un izmantosim taimera pārpildes pārtraukumu, lai pārslēgtu LED ikreiz, kad notiek pārtraukums. Taimera bita priekšlādētāja vērtību var arī pielāgot, izmantojot spiedpogas, lai kontrolētu pārtraukuma ilgumu.
Kas ir TIMER iegultajā elektronikā?
Taimeris ir sava veida pārtraukums. Tas ir kā vienkāršs pulkstenis, ar kuru var izmērīt notikuma laika intervālu. Katram mikrokontrollerim ir pulkstenis (oscilators), teiksim, ka Arduino Uno tas ir 16Mhz. Tas ir atbildīgs par ātrumu. Augstāks pulksteņa biežums būs lielāks apstrādes ātrums. Taimeris izmanto skaitītāju, kas tiek skaitīts noteiktā ātrumā atkarībā no pulksteņa frekvences. Arduino Uno, lai veiktu vienu skaitīšanu, nepieciešamas 1/16000000 sekundes vai 62 nano sekundes. Nozīmē, ka Arduino ik pēc 62 nano sekundēm pāriet no vienas instrukcijas uz otru.
Taimeri Arduino UNO:
Arduino UNO ir trīs taimeri, kas tiek izmantoti dažādām funkcijām.
Taimeris0:
Tas ir 8 bitu taimeris un tiek izmantots taimera funkcijās, piemēram, aizkave (), milis ().
Taimeris1:
Tas ir 16 bitu taimeris un tiek izmantots servo bibliotēkā.
2. taimeris:
Tas ir 8 bitu taimeris un tiek izmantots tone () funkcijā.
Arduino taimeris reģistrē
Lai mainītu taimeru konfigurāciju, tiek izmantoti taimeru reģistri.
1. Taimera / skaitītāja kontroles reģistri (TCCRnA / B):
Šajā reģistrā ir taimera galvenie vadības biti, un tos izmanto, lai kontrolētu taimera presskalerus. Tas arī ļauj kontrolēt taimera režīmu, izmantojot WGM bitus.
Rāmja formāts:
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 |
Preskaler:
TCCR1B biti CS12, CS11, CS10 biti iestata pirmsskalera vērtību. Taimera pulksteņa ātruma iestatīšanai tiek izmantots priekšskaleris. Arduino Uno ir preskaleri 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | LIETOT |
0 | 0 | 0 | STOP nav pulksteņa taimera |
0 | 0 | 1 | CLCK i / o / 1 Bez iepriekšējas mērogošanas |
0 | 1 | 0 | CLK i / o / 8 (no Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (no Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (no Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (no Prescaler) |
1 | 1 | 0 | Ārējā pulksteņa avots uz T1 tapas. Pulkstenis uz krītošās malas |
1 | 1 | 1 | Ārējā pulksteņa avots uz T1 tapas. Pulkstenis uz augošās malas. |
2. Taimera / skaitītāja reģistrs (TCNTn)
Šis reģistrs tiek izmantots, lai kontrolētu skaitītāja vērtību un iestatītu preloader vērtību.
Formula priekšlādētāja vērtībai vajadzīgajam laikam sekundē:
TCNTn = 65535 - (16x10 10 xTime sekundēs / Prescaler vērtība)
Lai aprēķinātu taimera1 ielādētāja vērtību 2 sekunžu laikā:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Arduino taimeris pārtrauc
Mēs iepriekš uzzinājām par Arduino pārtraucējiem un esam redzējuši, ka taimera pārtraukumi ir sava veida programmatūras traucējumi. Arduino ir dažādi taimera pārtraukumi, kas ir paskaidroti turpmāk.Taimera pārpildes pārtraukums:
Ikreiz, kad taimeris sasniedz maksimālo vērtību, teiksim, piemēram (16 Bit-65535), notiek taimera pārpildes pārtraukums . Tātad tiek saukta ISR pārtraukuma pakalpojumu kārtība, kad taimera pārpildes pārtraukuma bits ir iespējots TOIEx, kas atrodas taimera pārtraukuma maskas reģistrā TIMSKx.
ISR formāts:
ISR (TIMERx_OVF_vect) { }
Rezultātu salīdzināšanas reģistrs (OCRnA / B):
Šeit, kad notiek izejas salīdzināšanas spēles pārtraukums, tiek izsaukts pārtraukuma pakalpojums ISR (TIMERx_COMPy_vect), un TIFRx reģistrā tiks iestatīts arī OCFxy karodziņš. Šis ISR ir iespējots, iestatot iespējošanas bitu OCIExy, kas atrodas TIMSKx reģistrā. Kur TIMSKx ir taimera pārtraucošās maskas reģistrs.
Taimera ievades tveršana:
Pēc tam, kad notiek taimera ievades uztveršanas pārtraukums, tiek izsaukts pārtraukuma pakalpojums ISR (TIMERx_CAPT_vect), kā arī ICFx karoga bits tiks iestatīts TIFRx (taimera pārtraukuma karodziņu reģistrs). Šis ISR tiek iespējots, iestatot iespējošanas bitu ICIEx, kas atrodas TIMSKx reģistrā.
Nepieciešamās sastāvdaļas
- Arduino UNO
- Spiežamās pogas (2)
- LED (jebkura krāsa)
- 10k pretestība (2), 2.2k (1)
- 16x2 LCD displejs
Ķēdes shēma
Kontūru savienojumi starp Arduino UNO un 16x2 LCD displeju:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Uz potenciometra centrālo tapu LCD kontrasta kontrolei |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
Divas spiedpogas ar 10K pretestības rezistoriem ir savienotas ar Arduino tapām 2 un 4, un LED ir savienots ar Arduino PIN 7 caur 2.2K rezistoru.
Iestatīšana izskatīsies kā zemāk esošajā attēlā.
Arduino UNO taimeru programmēšana
Šajā apmācībā mēs izmantosim TIMER OVERFLOW INTERRUPT un izmantosim to, lai noteiktu laiku mirgotu LED ON un OFF, pielāgojot priekšielādētāja vērtību (TCNT1), izmantojot spiedpogas. Pilnīgs Arduino taimera kods ir norādīts beigās. Šeit mēs izskaidrojam kodu pa rindām:
Tā kā projektā tiek izmantots 16x2 LCD, lai parādītu preloader vērtību, tiek izmantota šķidro kristālu bibliotēka.
# iekļaut
LED anoda tapa, kas ir savienota ar Arduino tapu 7, ir definēta kā ledPin .
#define ledPin 7
Nākamais objekts piekļuvei šķidro kristālu klasei tiek deklarēts ar LCD tapām (RS, E, D4, D5, D6, D7), kas ir savienotas ar Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Pēc tam uz 4 sekundēm iestatiet preloader vērtību 3035. Pārbaudiet iepriekšējo formulu, lai aprēķinātu preloader vērtību.
peldošā vērtība = 3035;
Pēc tam tukšajā iestatījumā () vispirms iestatiet LCD režīmā 16x2 un uz dažām sekundēm parādiet sveiciena ziņojumu.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TAIMERI"); kavēšanās (2000); lcd.clear ();
Pēc tam iestatiet LED tapu kā OUTPUT tapu un spiedpogas ir iestatītas kā INPUT tapas
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Pēc tam atspējojiet visus pārtraukumus:
nēPārtrauc ();
Tālāk tiek inicializēts taimeris1.
TCCR1A = 0; TCCR1B = 0;
Ir iestatīta preloader taimera vērtība (sākotnēji kā 3035).
TCNT1 = vērtība;
Tad TCCR1B reģistrā tiek iestatīta Pre skalera vērtība 1024.
TCCR1B - = (1 << CS10) - (1 <CS12);
Taimera pārpildes pārtraukums ir iespējots Taimera pārtraukuma maskas reģistrā, lai varētu izmantot ISR.
TIMSK1 - = (1 << TOIE1);
Beidzot visi pārtraukumi ir iespējoti.
pārtrauc ();
Tagad uzrakstiet ISR Timer Overflow Interrupt, kas ir atbildīgs par LED ieslēgšanu un izslēgšanu, izmantojot digitalWrite . Stāvoklis mainās ikreiz, kad notiek taimera pārpildes pārtraukums.
ISR (TIMER1_OVF_vect) { TCNT1 = vērtība; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
Jo spēkā neesošu cilpas () vērtība preloader tiek palielināts vai decremented izmantojot spiežampogas ieejas un arī vērtība 16x2 LCD ir redzams.
ja (digitalRead (2) == AUGSTS) { vērtība = vērtība + 10; // Incement preload value } ja (digitalRead (4) == HIGH) { vērtība = vērtība-10; // Decrement preload value } lcd.setCursor (0,0); lcd.print (vērtība); }
Tātad šādi taimeri var izmantot, lai radītu kavēšanos Arduino programmā. Pārbaudiet zemāk esošo videoklipu, kur mēs esam parādījuši kavēšanās izmaiņas, palielinot un samazinot priekšielādētāja vērtību, izmantojot spiedpogas.