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?
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.
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
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?
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:
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
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 }kupi krožnik Arduino UNO Različica 3