Arduino Timer: luani me kohën në projektet tuaja

Kohëmatës Arduino UNO

Pak kohë më parë kemi publikuar më shumë informacion rreth funksioni millis(). de ArduinoTani do të gërmojmë më thellë në Kohëmatësi Arduino, për të filluar me këtë veçori për veçorinë, kuptoni se si ky bord menaxhon kohën me MCU, si dhe funksione të tjera përtej millis().

Çfarë është kohëmatësi Arduino?

kohëmatës arduino

El Timer Arduino, ose timer, është një funksion i zbatuar nga hardueri (në mikrokontrollues, me ndihmën e kristalit të kuarcit që gjeneron pulset e orës dhe që vendos "ritmin", pa pasur nevojë për pajisje të jashtme ose IC 555) që lejon kontrollin e ngjarjeve të përkohshme falë orëve. e brendshme. Për shembull, kryerja e një detyre në intervale, bërja e matjeve të sakta kohore, etj., pavarësisht nga kodi i skicës.

Como Arduino UNO Ai ka një çip MCU që punon në 16 Mhz, 16.000.000 mund të ekzekutohen çdo sekondë. Udhëzimet kanë nevojë për X cikle për t'u ekzekutuar, jo të gjitha ekzekutohen në të njëjtat cikle ore, për shembull, ato 16-bit kanë nevojë për më shumë cikle në këtë arkitekturë AVR.

Imagjinoni që përdorni funksioni delay()., kjo do të bllokojë ekzekutimin në MCU Arduino derisa të kalojë koha e specifikuar dhe më pas do të vazhdojë me programin, por kohëmatësi nuk do të bllokojë. Do të jetë koha pasi MCU vazhdon të ekzekutojë udhëzime të tjera njëkohësisht. Ky është avantazhi i madh.

Kohëmatësi është i lidhur me ndërprerjet të Arduino, pasi ata do të ekzekutohen nëpërmjet tyre për të ndjekur një detyrë specifike. Me fjalë të tjera, Arduino Timer është një funksion që aktivizohet në një kohë të caktuar, duke ekzekutuar një funksion ndërprerje. Kjo është arsyeja pse është gjithashtu e rëndësishme të dini për këto ndërprerje.

Modalitetet

Kohëmatësi Arduino ka 2 mënyra funksionimi, duke qenë në gjendje ta përdorin atë në:

  • Sinjali PWM: Ju mund të kontrolloni Kunjat Arduino (~).
  • CTC (Fshi kohëmatësin në krahasimin e ndeshjes): numëron kohën brenda një numëruesi dhe kur arrin vlerën e specifikuar në një regjistër të kohëmatësve, ndërprerja ekzekutohet.

Sa kohëmatës ka? Llojet e kohëmatësve

Arduino UNO funksionet milis

Atje 3 kohëmatës në pjata Arduino UNO, megjithëse mund të ketë më shumë në pllakat e tjera të sipërme:

  • Kohëmatësi 0: 8-bit, mund të numërojë nga 0 në 255 (256 vlera të mundshme). Përdoret nga funksione si delay(), millis() dhe micros(). Nuk rekomandohet modifikimi i tij për të mos ndryshuar programet.
  • Kohëmatësi 1: e barabartë me Timer 0. Përdoret nga biblioteka Servo në UNO (Timer 5 për MEGA).
  • Kohëmatësi 2: 16-bit, dhe mund të variojë nga 0 në 65.525 (65.536 vlera të mundshme). Përdoret për funksionin tone(), nëse nuk përdoret, mund të përdoret lirisht për aplikacionin tuaj.
  • Kohëmatësi 3, 4, 5 (vetëm në Arduino MEGA): të gjitha 16-bit.

Si funksionon Arduino Timer?

timers, timers

Për të qenë në gjendje punoni me një kohëmatës Arduino, është jetike të dimë se si funksionon e gjithë kjo në mënyrë elektronike në MCU të këtij bordi zhvillimi:

  • Frekuenca e orës: është numri i cikleve në sekondë që është në gjendje të zhvillojë, në rastin e Arduino është 16 Mhz, ose e njëjta gjë, sinjali i orës lëkundet 16.000.000 XNUMX XNUMX herë në sekondë (cikle).
  • periudhë: përfaqësohet me T, dhe matet në sekonda dhe është anasjellta e cikleve. Për shembull, T=1/C, e cila do të rezultonte në 1/16000000 = 0.0000000625, koha që do të duhej që çdo cikël të përfundojë. Dhe frekuenca është e anasjellta e periudhës, pra f = 1/T.
  • cikël: është secila nga përsëritjet e sinjalit që ndodh për njësi të kohës. Në Arduino do të ishte 16 milion në një sekondë. Ose çfarë është e njëjta gjë, në këtë rast, kur kanë kaluar 16 milionë cikle, ka kaluar një sekondë. Prandaj, një cikël mund të thuhet se merr 625 ns.
  • skaji i një sinjali: Sinjalet e orës janë katrore dhe skajet mund të rriten ose bien. Një skaj është vija e drejtë e sinjalit kur ai ndryshon nga:
    • 0 (i ulët) në 1 (i lartë): buzë në rritje.
    • 1 (i lartë) në 0 (i ulët): buzë në rënie.

Skajet janë të rëndësishme sepse kohëmatësit Arduino matin ciklet nga skajet e sinjalit. A) Po kontadorin ai rritet me çdo cikël dhe kur arrin vlerën e regjistrit, ekzekutohet ndërprerja.

Prandaj, pasi ta dini këtë, nëse e keni 16 Mhz në MCU Arduino, dhe përdoret një Timer 8-bit, mund të thuhet se ndërprerjet do të ndodhin çdo 16 μs (256/16000000) ose 4 ms për 16-bit (65536/16000000). Prandaj, nëse e vendosni regjistrin e numëruesit 16-bit në maksimum, me vlerën 65535, atëherë ndërprerja do të ndodhë në 4 ms për të ekzekutuar çfarëdo detyre që është.

Kur numëruesi arrin vlerën maksimale të mundshme, do të kthehet sërish në 0. Kjo do të thotë, ndodh një tejmbushje dhe do të numërojë mbrapsht nga fillimi.

Për të kontrolluar shkallën e rritjes së kohëmatësit mund të përdorni gjithashtu një parashkallëzues, i cili merr vlerat 1, 8, 64, 256 dhe 1024 dhe ndryshon kohën si kjo:

Shpejtësia e kohëmatësit (Hz) = Frekuenca e orës së Arduino / Prescaler

Nëse është 1, parashkallëzuesi kontrolluesi do të rritet në 16 Mhz, nëse është 8 në 2 Mhz, nëse është 64 në 250 kHz, e kështu me radhë. Mos harroni se do të ketë një krahasues të gjendjes së numëruesit të kohëmatësit për të krahasuar vlerën e numëruesit dhe shkallëzuesit paraprak derisa të jenë të barabarta dhe më pas të ekzekutoni një veprim. Kështu që, frekuenca e ndërprerjes jepet me formulën:

+1 është sepse regjistri i numëruesit është i indeksuar me 0, pra nuk fillon të numërojë me 1, por me 0.

Shpejtësia e ndërprerjes (Hz) = Frekuenca e orës Arduino / Prescaler (vlera e regjistrit krahasues + 1)

Për fat të mirë, ne nuk duhet modifikoni të dhënat i Arduino Timers, pasi për të do të kujdesen bibliotekat që përdorim në kod. Por nëse ato nuk përdoren, ato duhet të konfigurohen.

Shembuj në Arduino IDE

Arduino IDE, llojet e të dhënave, programimi

Për t'i kuptuar të gjitha këto pak më mirë, këtu unë tregoj dy kode skice për Arduino IDE me të cilat mund të përjetoni përdorimin e kohëmatësve. I pari është kodi që do të pulsojë një LED të lidhur me pinin Arduino 8 çdo sekondë:

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

Programoni ndezjen ose ndezjen e LED-it, si në rastin e mëparshëm çdo sekondë, por këtë herë duke përdorur CTC dmth krahasimi:

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

Më shumë rreth programimit Arduino

blej një pjatë Arduino UNO Rev3

Bëhu i pari që komenton

Lini komentin tuaj

Adresa juaj e emailit nuk do të publikohet. Fusha e kërkuar janë shënuar me *

*

*

  1. Përgjegjës për të dhënat: Miguel Ángel Gatón
  2. Qëllimi i të dhënave: Kontrolloni SPAM, menaxhimin e komenteve.
  3. Legjitimimi: Pëlqimi juaj
  4. Komunikimi i të dhënave: Të dhënat nuk do t'u komunikohen palëve të treta përveç me detyrim ligjor.
  5. Ruajtja e të dhënave: Baza e të dhënave e organizuar nga Occentus Networks (BE)
  6. Të drejtat: Në çdo kohë mund të kufizoni, rikuperoni dhe fshini informacionin tuaj.