Jokin aika sitten julkaisimme lisää tietoa aiheesta millis()-funktio de TyöläsNyt perehdymme syvemmälle Arduino ajastin, jotta pääset alkuun tämän ominaisuuden käyttämisessä, ymmärrä kuinka tämä MCU-levy hallitsee aikaa sekä muita toimintoja millis(:n) lisäksi.
Mikä on Arduino Timer?
El Arduino ajastin tai ajastin, on laitteistolla toteutettu toiminto (mikro-ohjaimessa kellopulsseja generoivan ja "rytmin" asettavan kvartsikiteen avulla ilman ulkoista laitteistoa tai ICs 555:tä), joka mahdollistaa tilapäisten tapahtumien ohjaamisen kellojen ansiosta. sisäinen. Esimerkiksi tehtävän tekeminen väliajoin, tarkkojen aikamittausten tekeminen jne. luonnoskoodista riippumatta.
Kuvittele, että käytät delay()-funktio, tämä estää suorittamisen Arduino MCU:ssa, kunnes määritetty aika on kulunut, ja jatkaa sitten ohjelmaa, mutta ajastin ei estä. Se ajoitetaan, kun MCU jatkaa muiden käskyjen suorittamista samanaikaisesti. Se on suuri etu.
Ajastin liittyy keskeytyksiä Arduino, koska ne teloitetaan niiden kautta tiettyyn tehtävään osallistumiseksi. Toisin sanoen Arduino Timer on toiminto, joka laukeaa tiettynä aikana ja suorittaa keskeytystoiminnon. Siksi on myös tärkeää tietää näistä keskeytyksistä.
Tilat
Arduino-ajastimessa on 2 käyttötilaa, voi käyttää sitä:
- PWM signaali: Voit hallita Arduino-nastat (~).
- CTC (Tyhjennä ajastin vertailuottelussa): laskee ajan laskurin sisällä ja kun se saavuttaa ajastimien rekisterissä määritellyn arvon, keskeytys suoritetaan.
Kuinka monta ajastinta siinä on? Ajastintyypit
Siellä 3 ajastinta lautasilla Arduino UNO, vaikka muilla ylälevyillä voi olla enemmän:
- Ajastin 0: 8-bittinen, voi laskea 0 - 255 (256 mahdollista arvoa). Käytetään funktioissa, kuten delay(), millis() ja micros(). Sen muokkaamista ei suositella, jotta ohjelmia ei muuteta.
- Ajastin 1: yhtä kuin Timer 0. Käyttää UNO:n servokirjastoa (Ajastin 5 MEGA:lle).
- Ajastin 2: 16-bittinen ja voi vaihdella välillä 0 - 65.525 65.536 (XNUMX XNUMX mahdollista arvoa). Käytetään tone()-funktiolle, jos sitä ei käytetä, sitä voidaan käyttää vapaasti sovelluksessasi.
- Ajastin 3, 4, 5 (vain Arduino MEGA): kaikki 16-bittinen.
Kuinka Arduino Timer toimii?
Voidakseen työskentele Arduino-ajastimen kanssa, on tärkeää tietää, kuinka tämä kaikki toimii sähköisesti tämän kehityslevyn MCU:ssa:
- Kellotaajuus: on se jaksojen määrä sekunnissa, jonka se pystyy kehittämään, Arduinon tapauksessa se on 16 Mhz, tai mikä on sama, kellosignaali värähtelee 16.000.000 XNUMX XNUMX kertaa sekunnissa (sykliä).
- aika: edustaa T, ja se mitataan sekunneissa ja on syklien käänteisarvo. Esimerkiksi T=1/C, joka johtaisi 1/16000000 = 0.0000000625, aika, joka kuluu kunkin syklin loppuun saattamiseksi. Ja taajuus on jakson käänteinen, joten f = 1/T.
- sykli: on jokainen signaalin toisto, joka esiintyy aikayksikköä kohti. Arduinolla se olisi 16 miljoonaa sekunnissa. Tai mikä on sama, tässä tapauksessa, kun 16 miljoonaa sykliä on kulunut, on kulunut yksi sekunti. Siksi yhden syklin voidaan sanoa kestävän 625 ns.
- signaalin reuna: Kellosignaalit ovat neliömäisiä, ja reunat voivat olla nousevia tai laskevia. Reuna on signaalin suora viiva, kun se muuttuu:
- 0 (matala) - 1 (korkea): nouseva reuna.
- 1 (korkea) - 0 (matala): laskeva reuna.
Reunat ovat tärkeitä, koska Arduino-ajastimet mittaavat jaksoja signaalin reunoista. A) Kyllä el Contador se kasvaa jokaisella jaksolla ja kun se saavuttaa rekisteriarvon, keskeytys suoritetaan.
Siksi, kun tiedät tämän, jos tiedät 16Mhz Arduino MCU:ssa, ja 8-bittistä ajastinta käytetään, voidaan sanoa, että keskeytyksiä esiintyy 16 μs:n (256/16000000) tai 4 ms:n välein 16-bittiselle (65536/16000000). Siksi, jos asetat 16-bittisen laskurirekisterin maksimiarvoon arvolla 65535, keskeytys tapahtuu 4 ms:n kuluttua minkä tahansa tehtävän suorittamiseksi.
Kun laskuri saavuttaa suurimman mahdollisen arvon, se palaa taas 0:aan. Eli ylivuoto tapahtuu ja se lasketaan takaisin alusta.
Voit myös ohjata ajastimen nousunopeutta esiskaalaaja, joka ottaa arvot 1, 8, 64, 256 ja 1024 ja muuttaa ajoitusta seuraavasti:
Ajastimen nopeus (Hz) = Arduinon / esiskaalaimen kellotaajuus
Jos se on 1, esiskaalaaja nostaa taajuuden 16 Mhz:iin, jos se on 8 - 2 MHz, jos se on 64 - 250 kHz ja niin edelleen. Muista, että siellä on ajastinlaskurin tilavertailija, joka vertaa laskurin ja esiskaalaimen arvoa, kunnes ne ovat yhtä suuret, ja suorittaa sitten toiminnon. Niin, keskeytystaajuus annetaan kaavalla:
Keskeytysnopeus (Hz) = Arduino / Prescaler Clock Frequency (vertailurekisteriarvo + 1)
Onneksi emme saa muokata tietueita Arduino Timers, koska siitä huolehtivat koodissa käyttämämme kirjastot. Mutta jos niitä ei käytetä, ne on määritettävä.
Esimerkkejä Arduino IDE:stä
Ymmärtääkseni tätä kaikkea hieman paremmin, näytän tässä kaksi Arduino IDE:n luonnoskoodia, joilla pääset kokemaan ajastimien käytön. Ensimmäinen on koodi, joka vilkkuu Arduino-nastaan 8 kytkettyä LEDiä joka sekunti:
#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 }
Ohjelmoi LEDin vilkkuminen tai vilkkuminen, kuten edellisessä tapauksessa joka sekunti, mutta tällä kertaa käyttämällä CTC eli vertailu:
#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 }osta lautanen Arduino UNO rev3