Arduino Timer: pelaa ajoituksella projekteissasi

Ajastin Arduino UNO

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?

arduino ajastin

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.

Como Arduino UNO Siinä on MCU-siru, joka toimii 16 MHz:llä, 16.000.000 16 XNUMX voidaan suorittaa joka sekunti. Käskyt tarvitsevat X sykliä suorittaakseen, kaikkia ei suoriteta samoissa kellojaksoissa, esimerkiksi XNUMX-bittiset tarvitsevat enemmän jaksoja tässä AVR-arkkitehtuurissa.

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

Arduino UNO millis-toiminnot

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?

ajastimet, ajastimet

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:

+1 johtuu siitä, että laskurirekisteri on indeksoitu 0:sta, eli se ei aloita laskentaa 1:stä, vaan 0:sta.

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ä

Arduino IDE, tietotyypit, ohjelmointi

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
}

Lisää Arduino-ohjelmoinnista

osta lautanen Arduino UNO rev3

Ole ensimmäinen kommentti

Jätä kommentti

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

*

*

  1. Vastuussa tiedoista: Miguel Ángel Gatón
  2. Tietojen tarkoitus: Roskapostin hallinta, kommenttien hallinta.
  3. Laillistaminen: Suostumuksesi
  4. Tietojen välittäminen: Tietoja ei luovuteta kolmansille osapuolille muutoin kuin lain nojalla.
  5. Tietojen varastointi: Occentus Networks (EU) isännöi tietokantaa
  6. Oikeudet: Voit milloin tahansa rajoittaa, palauttaa ja poistaa tietojasi.