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?
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.
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
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?
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:
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
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