Arduino taimeris: spēlējiet ar laiku savos projektos

Taimeris Arduino UNO

Pirms kāda laika mēs publicējām vairāk informācijas par Millis() funkcija de ArduinoTagad mēs iedziļināsimies Arduino taimeris, lai sāktu darbu ar šo līdzekli, izprotiet, kā šī plate pārvalda laiku, izmantojot MCU, kā arī citas funkcijas, kas pārsniedz millis().

Kas ir Arduino taimeris?

arduino taimeris

El Arduino taimeris vai taimeris, ir aparatūras realizēta funkcija (mikrokontrollerī ar kvarca kristāla palīdzību, kas ģenerē pulksteņa impulsus un kas nosaka "ritmu", bez nepieciešamības pēc ārējas aparatūras vai ICs 555), kas ļauj kontrolēt īslaicīgus notikumus, pateicoties pulksteņiem. iekšējais. Piemēram, uzdevuma veikšana ar intervāliem, precīzu laika mērījumu veikšana utt. neatkarīgi no skices koda.

Como Arduino UNO Tam ir MCU mikroshēma, kas darbojas ar 16 Mhz, katru sekundi varētu izpildīt 16.000.000 16 XNUMX. Instrukciju izpildei nepieciešami X cikli, ne visi tiek izpildīti vienā un tajos pašos pulksteņa ciklos, piemēram, XNUMX bitiem šajā AVR arhitektūrā ir nepieciešams vairāk ciklu.

Iedomājieties, ka izmantojat delay() funkcija, tas bloķēs izpildi Arduino MCU, līdz būs pagājis norādītais laiks, un pēc tam turpināsies ar programmu, bet taimeris netiks bloķēts. Tas būs laiks, jo MCU turpina vienlaikus izpildīt citus norādījumus. Tā ir lielā priekšrocība.

Taimeris ir saistīts ar pārtraukumiem Arduino, jo tie tiks izpildīti caur tiem, lai veiktu kādu konkrētu uzdevumu. Citiem vārdiem sakot, Arduino taimeris ir funkcija, kas tiek aktivizēta noteiktā laikā, izpildot pārtraukuma funkciju. Tāpēc ir svarīgi zināt arī par šiem pārtraukumiem.

Režīmi

Arduino taimeris ir 2 darbības režīmi, kas to var izmantot:

  • PWM signāls: Jūs varat kontrolēt Arduino tapas (~).
  • CTC (Notīrīt taimeri salīdzināšanas mačā): skaita laiku skaitītājā un, kad tas sasniedz taimeru reģistrā norādīto vērtību, tiek izpildīts pārtraukums.

Cik taimeru tam ir? Taimeru veidi

Arduino UNO milis funkcijas

Tur 3 taimeri uz šķīvjiem Arduino UNO, lai gan citās augšējās plāksnēs var būt vairāk:

  • Taimeris 0: 8 bitu, var skaitīt no 0 līdz 255 (256 iespējamās vērtības). Izmanto tādām funkcijām kā delay (), millis () un micros (). Tā modifikācija nav ieteicama, lai neizmainītu programmas.
  • Taimeris 1: vienāds ar Timer 0. Izmanto UNO servo bibliotēkā (5. taimeris MEGA).
  • Taimeris 2: 16 bitu un var būt no 0 līdz 65.525 65.536 (XNUMX XNUMX iespējamās vērtības). Izmanto tone() funkcijai, ja to neizmanto, to var brīvi izmantot jūsu lietojumprogrammai.
  • Taimeris 3, 4, 5 (tikai Arduino MEGA): visi 16 biti.

Kā darbojas Arduino taimeris?

taimeri, taimeri

Līdz strādāt ar Arduino taimeri, ir svarīgi zināt, kā tas viss darbojas elektroniski šīs izstrādes paneļa MCU:

  • Pulksteņa frekvence: ir ciklu skaits sekundē, ko tas spēj attīstīt, Arduino gadījumā tas ir 16 Mhz, vai kas ir tas pats, pulksteņa signāls svārstās 16.000.000 XNUMX XNUMX reižu sekundē (cikli).
  • Periods: apzīmē ar T, un to mēra sekundēs, un tā ir ciklu apgrieztā vērtība. Piemēram, T=1/C, kā rezultātā 1/16000000 = 0.0000000625, laiks, kas būtu nepieciešams katra cikla pabeigšanai. Un frekvence ir perioda apgrieztā vērtība, tāpēc f = 1/T.
  • Cikls: ir katrs no signāla atkārtojumiem, kas notiek laika vienībā. Arduino tas būtu 16 miljoni sekundē. Vai kas ir tas pats, šajā gadījumā, kad ir pagājuši 16 miljoni ciklu, ir pagājusi viena sekunde. Tāpēc var teikt, ka viens cikls aizņem 625 ns.
  • signāla mala: pulksteņa signāli ir kvadrātveida, un malas var augt vai kristies. Mala ir signāla taisna līnija, kad tā mainās no:
    • 0 (zems) līdz 1 (augsts): augošā mala.
    • 1 (augsts) līdz 0 (zems): krītoša mala.

Malas ir svarīgas, jo Arduino taimeri mēra ciklus no signāla malām. A) Jā el Contador tas palielinās ar katru ciklu un, sasniedzot reģistra vērtību, tiek izpildīts pārtraukums.

Tāpēc, tiklīdz jūs to zināt, ja jums ir 16Mhz Arduino MCU, un tiek izmantots 8 bitu taimeris, var teikt, ka pārtraukumi notiks ik pēc 16 μs (256/16000000) vai 4 ms 16 bitiem (65536/16000000). Tāpēc, ja iestatāt 16 bitu skaitītāja reģistru uz maksimālo vērtību ar vērtību 65535, pārtraukums notiks pēc 4 ms, lai izpildītu jebkuru uzdevumu.

Kad skaitītājs sasniedz maksimālo iespējamo vērtību, tas atkal atgriezīsies pie 0. Tas nozīmē, ka notiek pārpilde, un tas tiks skaitīts atpakaļ no sākuma.

Lai kontrolētu taimera pieauguma ātrumu, varat arī izmantot prescaler, kas ņem vērtības 1, 8, 64, 256 un 1024 un maina laiku šādi:

Taimera ātrums (Hz) = Arduino / Prescaler pulksteņa frekvence

Ja tas ir 1, priekšskalotājs palielinās līdz 16 Mhz, ja tas ir 8 līdz 2 Mhz, ja tas ir 64 līdz 250 kHz un tā tālāk. Atcerieties, ka būs taimera skaitītāja stāvokļa salīdzinātājs, lai salīdzinātu skaitītāja un priekšskalotāja vērtību, līdz tie ir vienādi, un pēc tam veiktu darbību. Tātad, pārtraukumu frekvence tiek dota pēc formulas:

+1 ir tāpēc, ka skaitītāju reģistrs ir indeksēts ar 0, t.i., tas nesāk skaitīt no 1, bet gan ar 0.

Pārtraukuma ātrums (Hz) = Arduino / Prescaler pulksteņa frekvence (salīdzinājuma reģistra vērtība + 1)

Par laimi, mēs nedrīkstam mainīt ierakstus Arduino taimeriem, jo ​​par to parūpēsies bibliotēkas, kuras mēs izmantojam kodā. Bet, ja tie netiek izmantoti, tie ir jākonfigurē.

Piemēri Arduino IDE

Arduino IDE, datu tipi, programmēšana

Lai to visu nedaudz labāk saprastu, šeit parādu divus Arduino IDE skiču kodus, ar kuriem jūs varat izjust taimeru izmantošanu. Pirmais ir kods, kas katru sekundi mirgos LED, kas savienots ar Arduino tapu 8:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  // Configurar Timer1
  TCCR1A = 0;                        //Registro control A a 0, pines OC1A y OC1B deshabilitados
  TCCR1B = 0;                        //Limpia el registrador
  TCCR1B |= (1<<CS10)|(1 << CS12);   //Configura prescaler a 1024: CS12 = 1 y CS10 = 1
  TCNT1 = 0xC2F8;                    //Iniciar timer para desbordamiento a 1 segundo
                                     //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal
  
  TIMSK1 |= (1 << TOIE1);           //Habilitar interrupción para Timer1
}
void loop()
{
}
ISR(TIMER1_OVF_vect)                              //Interrupción del TIMER1 
{
  TCNT1 = 0xC2F7;                                 // Reniciar Timer1
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED
}

Ieprogrammējiet gaismas diodes mirgošanu vai mirgošanu, tāpat kā iepriekšējā gadījumā katru sekundi, bet šoreiz izmantojot CTC t.i. salīdzinājums:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  
  // Configuración Timer1
  TCCR1A = 0;                //Registro de control A a 0
  TCCR1B = 0;                //Limpiar registro
  TCNT1  = 0;                //Inicializar el temporizador
  OCR1A = 0x3D08;            //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08
  TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12);   //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1  
  TIMSK1 |= (1 << OCIE1A);  //Habilita interrupción por igualdad de comparación
}
void loop()
{
}
ISR(TIMER1_COMPA_vect)          //Interrupción por igualdad de comparación en TIMER1
{
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   //Invierte el estado del LED
}

Vairāk par Arduino programmēšanu

nopirkt šķīvi Arduino UNO 3. red

Esi pirmais, kas komentārus

Atstājiet savu komentāru

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti ar *

*

*

  1. Atbildīgais par datiem: Migels Ángels Gatóns
  2. Datu mērķis: SPAM kontrole, komentāru pārvaldība.
  3. Legitimācija: jūsu piekrišana
  4. Datu paziņošana: Dati netiks paziņoti trešām personām, izņemot juridiskus pienākumus.
  5. Datu glabāšana: datu bāze, ko mitina Occentus Networks (ES)
  6. Tiesības: jebkurā laikā varat ierobežot, atjaunot un dzēst savu informāciju.