Arduino taimer: mängige oma projektides ajastusega

Taimer Arduino UNO

Mõni aeg tagasi avaldasime selle kohta rohkem teavet funktsioon millis(). de ArduinoNüüd süveneme sellesse Arduino taimer, selle funktsiooniga alustamiseks mõistke, kuidas see tahvel MCU-ga aega haldab, aga ka muid funktsioone peale millis().

Mis on Arduino taimer?

arduino taimer

El Arduino taimer või taimer, on riistvara (mikrokontrolleris kvartskristalli abil, mis genereerib taktimpulsse ja mis seab "rütmi", ilma välise riistvara või IC-de 555 vajaduseta) realiseeritud funktsioon, mis võimaldab juhtida ajutisi sündmusi tänu kelladele. sisemine. Näiteks ülesande teostamine intervallidega, täpsete ajamõõtmiste tegemine jne, sõltumata visandikoodist.

Como Arduino UNO Sellel on MCU-kiip, mis töötab sagedusel 16 Mhz, 16.000.000 16 XNUMX saab käivitada igas sekundis. Käskude täitmiseks on vaja X tsüklit, mitte kõik ei tööta samade kellatsüklitega, näiteks XNUMX-bitised vajavad selles AVR-i arhitektuuris rohkem tsükleid.

Kujutage ette, et kasutate delay() funktsioon, blokeerib see Arduino MCU täitmise kuni määratud aja möödumiseni ja jätkab seejärel programmiga, kuid taimer ei blokeeri. See on ajastus, kuna MCU jätkab teiste juhiste samaaegset täitmist. See on suur eelis.

Taimer on seotud katkestused Arduino jaoks, kuna need täidetakse nende kaudu, et täita mõnda konkreetset ülesannet. Teisisõnu, Arduino taimer on funktsioon, mis käivitatakse teatud ajal ja täidab katkestusfunktsiooni. Seetõttu on oluline teada ka nendest katkestustest.

Režiimid

Arduino taimeris on 2 töörežiimi, kus saab seda kasutada:

  • PWM signaal: Saate juhtida Arduino tihvtid (~).
  • CTC (tühjenda taimer võrdlusmatši ajal): loeb loenduri sees olevat aega ja kui see jõuab taimerite registris määratud väärtuseni, käivitatakse katkestus.

Mitu taimerit sellel on? Taimerite tüübid

Arduino UNO millisfunktsioonid

seal 3 taimerit plaatidel Arduino UNO, kuigi teistel pealmistel plaatidel võib olla rohkem:

  • Taimer 0: 8-bitine, võib lugeda 0 kuni 255 (256 võimalikku väärtust). Kasutavad funktsioonid nagu delay(), millis() ja micros(). Selle muutmine ei ole soovitatav, et mitte programme muuta.
  • Taimer 1: võrdne Timer 0-ga. Kasutatakse UNO servo teegis (MEGA jaoks Timer 5).
  • Taimer 2: 16-bitine ja võib olla vahemikus 0 kuni 65.525 65.536 (XNUMX XNUMX võimalikku väärtust). Kasutatakse funktsiooni tone() jaoks, kui seda ei kasutata, saab seda oma rakenduse jaoks vabalt kasutada.
  • Taimer 3, 4, 5 (ainult Arduino MEGA puhul): kõik 16-bitised.

Kuidas Arduino taimer töötab?

taimerid, taimerid

Kuni töötada Arduino taimeriga, on oluline teada, kuidas see kõik selle arendusplaadi MCU-s elektrooniliselt töötab:

  • Kellasagedus: on tsüklite arv sekundis, mida ta on võimeline arendama, Arduino puhul on see 16 Mhz või mis on sama, kella signaal võngub 16.000.000 XNUMX XNUMX korda sekundis (tsüklid).
  • Periood: tähistab T ja seda mõõdetakse sekundites ning see on tsüklite pöördväärtus. Näiteks T=1/C, mille tulemuseks on 1/16000000 = 0.0000000625, aeg, mis kulub iga tsükli lõpuleviimiseks. Ja sagedus on perioodi pöördväärtus, seega f = 1/T.
  • Tsükkel: on iga signaali kordus, mis esineb ajaühikus. Arduino puhul oleks see sekundiga 16 miljonit. Või mis on sama, antud juhul, kui on möödunud 16 miljonit tsüklit, on möödunud üks sekund. Seetõttu võib öelda, et üks tsükkel võtab aega 625 ns.
  • signaali serv: kellasignaalid on ruudukujulised ja servad võivad tõusta või langeda. Serv on signaali sirgjoon, kui see muutub:
    • 0 (madal) kuni 1 (kõrge): tõusev serv.
    • 1 (kõrge) kuni 0 (madal): langev serv.

Servad on olulised, kuna Arduino taimerid mõõdavad tsükleid signaali servadest. A) Jah contador see suureneb iga tsükliga ja kui see jõuab registri väärtuseni, käivitatakse katkestus.

Seega, kui olete seda teadnud, kui olete 16Mhz Arduino MCU-l, ja kasutatakse 8-bitist taimerit, võib öelda, et katkestused tekivad iga 16 μs (256/16000000) või 4 ms järel 16-bitise puhul (65536/16000000). Seega, kui seate 16-bitise loenduri registri maksimaalseks väärtusega 65535, toimub katkestus 4 ms pärast mis tahes ülesande täitmiseks.

Kui loendur saavutab maksimaalse võimaliku väärtuse, see naaseb uuesti 0-le. See tähendab, et tekib ülevool ja see loetakse algusest peale tagasi.

Taimeri tõusukiiruse reguleerimiseks võite kasutada ka eelskaalaja, mis võtab väärtused 1, 8, 64, 256 ja 1024 ning muudab ajastust järgmiselt:

Taimeri kiirus (Hz) = Arduino / eelskaalaja kellasagedus

Kui see on 1, suureneb eelskaalaja kontroller 16 MHz-ni, kui see on 8 kuni 2 MHz, kui see on 64 kuni 250 kHz jne. Pidage meeles, et loenduri ja eelskaalaja väärtuste võrdlemiseks, kuni need on võrdsed, ja seejärel toimingu sooritamiseks on olemas taimeriga loenduri oleku võrdleja. Niisiis, katkestussagedus on antud valemiga:

+1 on sellepärast, et loenduri register on indekseeritud 0-ga, st see ei hakka lugema mitte 1-st, vaid 0-st.

Katkestuse kiirus (Hz) = Arduino / eelskaalaja kellasagedus (võrdlusregistri väärtus + 1)

Õnneks me ei tohi kirjeid muuta Arduino taimerid, kuna selle eest hoolitsevad raamatukogud, mida koodis kasutame. Aga kui neid ei kasutata, tuleks need konfigureerida.

Näited Arduino IDE-s

Arduino IDE, andmetüübid, programmeerimine

Et seda kõike veidi paremini mõista, näitan siin kahte sketšikoodi Arduino IDE jaoks, mille abil saate taimerite kasutamist kogeda. Esimene on kood, mis vilgub iga sekundi järel Arduino kontaktiga 8 ühendatud LED-i:

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

Programmeerige LED-i vilkumine või vilkumine, nagu eelmisel juhul, iga sekundi järel, kuid seekord kasutades CTC ehk võrdlus:

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

Lisateavet Arduino programmeerimise kohta

osta taldrik Arduino UNO Rev. 3

Ole esimene kommentaar

Jäta oma kommentaar

Sinu e-postiaadressi ei avaldata. Kohustuslikud väljad on tähistatud *

*

*

  1. Andmete eest vastutab: Miguel Ángel Gatón
  2. Andmete eesmärk: Rämpsposti kontrollimine, kommentaaride haldamine.
  3. Seadustamine: teie nõusolek
  4. Andmete edastamine: andmeid ei edastata kolmandatele isikutele, välja arvatud juriidilise kohustuse alusel.
  5. Andmete salvestamine: andmebaas, mida haldab Occentus Networks (EL)
  6. Õigused: igal ajal saate oma teavet piirata, taastada ja kustutada.