Arduino Timer: igrajte se s časom v svojih projektih

Časovnik Arduino UNO

Pred časom smo objavili več informacij o funkcija millis(). de ArduinoZdaj se bomo poglobili v Arduino časovnik, če želite začeti s to funkcijo za funkcijo, razumejte, kako ta plošča upravlja čas z MCU, kot tudi druge funkcije, razen millis().

Kaj je Arduino Timer?

arduino časovnik

El Arduino časovnik ali časovnik, je funkcija, ki jo izvaja strojna oprema (v mikrokrmilniku, s pomočjo kvarčnega kristala, ki generira urne impulze in ki nastavlja "ritem", brez potrebe po zunanji strojni opremi ali IC 555), ki omogoča nadzor začasnih dogodkov zahvaljujoč uram notranji. Na primer, izvajanje naloge v intervalih, natančne meritve časa itd., Ne glede na kodo skice.

Como Arduino UNO Ima MCU čip, ki deluje pri 16 Mhz, 16.000.000 se lahko izvede vsako sekundo. Navodila potrebujejo X ciklov za izvedbo, vsi se ne izvajajo v istih taktih, na primer 16-bitna potrebujejo več ciklov v tej arhitekturi AVR.

Predstavljajte si, da uporabljate funkcija zamude()., bo to blokiralo izvajanje na Arduino MCU, dokler ne poteče določeni čas in nato nadaljevalo s programom, vendar se časovnik ne bo blokiral. To se bo merilo, saj MCU še naprej izvaja druga navodila hkrati. To je velika prednost.

Časovnik je povezan z prekinitve Arduina, saj se bodo izvajali prek njih, da bi se udeležili določene naloge. Z drugimi besedami, Arduino Timer je funkcija, ki se sproži ob določenem času in izvaja funkcijo prekinitve. Zato je tudi pomembno vedeti za te prekinitve.

Načini

Arduino Timer ima 2 načini delovanja, da ga lahko uporabite v:

  • PWM signal: Lahko nadzorujete Arduino zatiči (~).
  • CTC (Izbriši časovnik ob primerjalni tekmi): šteje čas znotraj števca in ko doseže vrednost, določeno v registru časovnikov, se prekinitev izvede.

Koliko časovnikov ima? Vrste časovnikov

Arduino UNO milis funkcije

Tu 3 časovnika na krožnikih Arduino UNO, čeprav jih je morda več na drugih zgornjih ploščah:

  • Časovnik 0: 8-bitni, lahko šteje od 0 do 255 (256 možnih vrednosti). Uporabljajo ga funkcije, kot so delay(), millis() in micros(). Njegovo spreminjanje ni priporočljivo, da ne bi spremenili programov.
  • Časovnik 1: enako Timer 0. Uporablja servo knjižnica v UNO (Timer 5 za MEGA).
  • Časovnik 2: 16-bitni in se lahko giblje od 0 do 65.525 (65.536 možnih vrednosti). Uporablja se za funkcijo tone(), če se ne uporablja, se lahko prosto uporablja za vašo aplikacijo.
  • Časovnik 3, 4, 5 (samo na Arduino MEGA): vse 16-bitne.

Kako deluje Arduino Timer?

časovniki, časovniki

Da delo z Arduino časovnikom, nujno je vedeti, kako vse to deluje elektronsko v MCU te razvojne plošče:

  • Taktna frekvenca: je število ciklov na sekundo, ki jih je sposoben razviti, v primeru Arduina je 16 Mhz ali kar je enako, signal ure niha 16.000.000-krat v sekundi (cikli).
  • obdobje: je predstavljen s T in se meri v sekundah in je inverzna vrednost ciklov. Na primer, T=1/C, kar bi povzročilo 1/16000000 = 0.0000000625, čas, ki bi bil potreben za dokončanje vsakega cikla. In frekvenca je obratna od obdobja, zato je f = 1/T.
  • Cikel: je vsaka od ponovitev signala, ki se pojavi na enoto časa. Na Arduinu bi bilo 16M v sekundi. Ali kar je enako, v tem primeru, ko je minilo 16 milijonov ciklov, je minila ena sekunda. Zato lahko rečemo, da en cikel traja 625 ns.
  • rob signala: Signali ure so kvadratni, robovi pa so lahko naraščajoči ali padajoči. Rob je ravna črta signala, ko se spremeni iz:
    • 0 (nizka) do 1 (visoka): naraščajoči rob.
    • 1 (visoko) do 0 (nizko): padajoči rob.

Robovi so pomembni, ker Arduino časovniki merijo cikle od robov signala. A) Da kontador povečuje se z vsakim ciklom in ko doseže vrednost registra, se prekinitev izvede.

Torej, ko to veš, če že 16Mhz na Arduino MCU, in se uporablja 8-bitni časovnik, lahko rečemo, da se bodo prekinitve pojavile vsakih 16 μs (256/16000000) ali 4 ms za 16-bit (65536/16000000). Torej, če 16-bitni register števca nastavite na maksimum, z vrednostjo 65535, se bo prekinitev pojavila pri 4 ms za izvedbo katere koli naloge.

Ko števec doseže največjo možno vrednost, spet se bo vrnil na 0. To pomeni, da pride do prelivanja in se bo štelo od začetka.

Za nadzor hitrosti povečanja časovnika lahko uporabite tudi predskaler, ki sprejme vrednosti 1, 8, 64, 256 in 1024 in spremeni čas takole:

Hitrost časovnika (Hz) = urna frekvenca Arduino / predskalerja

Če je 1, se bo predskalnik krmilnik povečal na 16 Mhz, če je 8 do 2 Mhz, če je 64 do 250 kHz itd. Ne pozabite, da bo na voljo primerjalnik stanja števca časovnika, ki bo primerjal vrednost števca in predskalnika, dokler nista enaka, nato pa izvede dejanje. torej prekinitvena frekvenca je podana s formulo:

+1 je zato, ker je register števca indeksiran na 0, torej ne začne šteti pri 1, ampak pri 0.

Hitrost prekinitve (Hz) = urna frekvenca Arduino / predskalerja (vrednost primerjalnega registra + 1)

Na srečo ne smemo spremeniti zapise časovnikov Arduino, saj bodo zanj poskrbele knjižnice, ki jih uporabljamo v kodi. Če pa se ne uporabljajo, jih je treba konfigurirati.

Primeri v Arduino IDE

Arduino IDE, vrste podatkov, programiranje

Da bi vse to malo bolje razumeli, tukaj prikazujem dve kodi skic za Arduino IDE, s katerimi lahko izkusite uporabo časovnikov. Prva je koda, ki bo vsako sekundo utripala LED, priključena na pin 8 Arduino:

#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
}

Programirajte utripanje ali utripanje LED, kot v prejšnjem primeru vsako sekundo, vendar tokrat z uporabo CTC tj primerjava:

#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
}

Več o programiranju Arduino

kupi krožnik Arduino UNO Različica 3

Bodite prvi komentar

Pustite svoj komentar

Vaš e-naslov ne bo objavljen. Obvezna polja so označena z *

*

*

  1. Za podatke odgovoren: Miguel Ángel Gatón
  2. Namen podatkov: Nadzor neželene pošte, upravljanje komentarjev.
  3. Legitimacija: Vaše soglasje
  4. Sporočanje podatkov: Podatki se ne bodo posredovali tretjim osebam, razen po zakonski obveznosti.
  5. Shranjevanje podatkov: Zbirka podatkov, ki jo gosti Occentus Networks (EU)
  6. Pravice: Kadar koli lahko omejite, obnovite in izbrišete svoje podatke.