Arduino Timer: speel met tydsberekening in jou projekte

Timer Arduino UNO

'n Tyd gelede het ons meer inligting gepubliseer oor die millis() funksie de ArduinoNou sal ons dieper in die Arduino timer, om met hierdie kenmerk vir die kenmerk te begin, verstaan ​​hoe hierdie bord tyd met die MCU bestuur, sowel as ander funksies buite millis().

Wat is die Arduino Timer?

arduino timer

El Arduino timer, of timer, is 'n funksie geïmplementeer deur hardeware (in die mikrobeheerder, met die hulp van die kwartskristal wat die klokpulse genereer en wat die "ritme" stel, sonder die behoefte aan eksterne hardeware of IC's 555) wat dit moontlik maak om tydelike gebeurtenisse te beheer danksy horlosies intern. Byvoorbeeld, om 'n taak met tussenposes te laat gebeur, presiese tydmetings te maak, ens., onafhanklik van die sketskode.

Como Arduino UNO Dit het 'n MCU-skyfie wat teen 16 Mhz werk, 16.000.000 16 XNUMX kan elke sekonde uitgevoer word. Die instruksies het X-siklusse nodig om uit te voer, nie almal word in dieselfde kloksiklusse uitgevoer nie, byvoorbeeld, die XNUMX-bis-siklusse benodig meer siklusse in hierdie AVR-argitektuur.

Stel jou voor dat jy die delay() funksie, sal dit uitvoering op die Arduino MCU blokkeer totdat die gespesifiseerde tyd verstryk en dan voortgaan met die program, maar die timer sal nie blokkeer nie. Dit sal tydsberekening wees aangesien die MCU voortgaan om ander instruksies gelyktydig uit te voer. Dit is die groot voordeel.

Die timer is verwant aan onderbrekings van Arduino, aangesien hulle deur hulle uitgevoer sal word om 'n spesifieke taak by te woon. Met ander woorde, die Arduino Timer is 'n funksie wat op 'n sekere tyd geaktiveer word, wat 'n onderbrekingsfunksie uitvoer. Daarom is dit ook belangrik om van hierdie onderbrekings te weet.

Modusse

Die Arduino Timer het 2 werkswyses, om dit te kan gebruik in:

  • PWM sein: Jy kan die beheer Arduino penne (~).
  • CTC (Vee timer op vergelyk wedstryd): tel die tyd binne 'n teller en wanneer dit die waarde bereik wat in 'n register van die tydtellers gespesifiseer is, word die onderbreking uitgevoer.

Hoeveel timers het dit? Tipes timers

Arduino UNO millis funksies

Daar 3 timers op die borde Arduino UNO, alhoewel daar meer op ander boonste plate kan wees:

  • Tydoproep 0: 8-bis, kan van 0 tot 255 tel (256 moontlike waardes). Word gebruik deur funksies soos delay(), millis() en micros(). Die wysiging daarvan word nie aanbeveel om nie die programme te verander nie.
  • Tydoproep 1: gelyk aan Timer 0. Gebruik deur die Servo-biblioteek in UNO (Timer 5 vir MEGA).
  • Tydoproep 2: 16-bis, en kan wissel van 0 tot 65.525 65.536 (XNUMX XNUMX moontlike waardes). Word gebruik vir die toon()-funksie, indien dit nie gebruik word nie, kan dit vrylik vir jou toepassing gebruik word.
  • Timer 3, 4, 5 (slegs op Arduino MEGA): alles 16-bis.

Hoe werk die Arduino Timer?

timers, timers

Om te kan werk met 'n Arduino Timer, is dit noodsaaklik om te weet hoe dit alles elektronies in die MCU van hierdie ontwikkelingsraad werk:

  • Klokfrekwensie: is die aantal siklusse per sekonde wat dit in staat is om te ontwikkel, in die geval van Arduino is dit 16 Mhz, of wat dieselfde is, die kloksein ossilleer 16.000.000 XNUMX XNUMX keer in 'n sekonde (siklusse).
  • tydperk: word voorgestel deur die T, en word gemeet in sekondes, en is die omgekeerde van die siklusse. Byvoorbeeld, T=1/C, wat sou lei tot 1/16000000 = 0.0000000625, die tyd wat dit sal neem vir elke siklus om te voltooi. En die frekwensie is die inverse van die periode, dus f = 1/T.
  • siklus: is elkeen van die herhalings van die sein wat per tydseenheid voorkom. Op Arduino sou dit 16M in 'n sekonde wees. Of wat is dieselfde, in hierdie geval, wanneer 16 miljoen siklusse verby is, is een sekonde verby. Daarom kan gesê word dat een siklus 625 ns neem.
  • rand van 'n sein: Klokseine is vierkantig, en die rande kan styg of daal. 'n Rand is die reguit lyn van die sein wanneer dit verander van:
    • 0 (laag) tot 1 (hoog): stygende rand.
    • 1 (hoog) tot 0 (laag): dalende rand.

Rande is belangrik omdat Arduino-timers siklusse vanaf seinrande meet. A) Ja die eienaar dit verhoog met elke siklus en wanneer dit die registerwaarde bereik, word die onderbreking uitgevoer.

Daarom, sodra jy dit weet, as jy het 16Mhz op die Arduino MCU, en 'n 8-bis Timer gebruik word, kan gesê word dat onderbrekings elke 16 μs (256/16000000) of 4 ms vir 16-bis (65536/16000000) sal voorkom. Dus, as jy die 16-bis tellerregister op die maksimum stel, met die waarde 65535, sal die onderbreking by 4 ms plaasvind om watter taak dit ook al is uit te voer.

Wanneer die teller die maksimum moontlike waarde bereik, dit sal weer na 0 terugkeer. Dit wil sê, 'n oorloop vind plaas en dit sal van die begin af terugtel.

Om die tempo van toename van die timer te beheer kan jy ook gebruik 'n voorskaaler, wat waardes 1, 8, 64, 256 en 1024 neem en die tydsberekening soos volg verander:

Timerspoed (Hz) = Klokfrekwensie van Arduino / Prescaler

As dit 1 is, sal die voorskaaler die beheerder verhoog na 16 Mhz, as dit 8 tot 2 Mhz is, as dit 64 tot 250 kHz is, ensovoorts. Onthou dat daar 'n tydteller-toestandvergelyker sal wees om die waarde van die teller en die voorskaaler te vergelyk totdat hulle gelyk is en dan 'n aksie uit te voer. Dus, onderbrekingsfrekwensie word gegee deur die formule:

+1 is omdat die tellerregister op 0 geïndekseer is, dit wil sê dit begin nie by 1 tel nie, maar by 0.

Onderbrekingspoed (Hz) = Arduino / Prescaler Klokfrekwensie (vergelykerregisterwaarde + 1)

Gelukkig moet ons nie rekords te verander van die Arduino Timers, aangesien dit versorg sal word deur die biblioteke wat ons in die kode gebruik. Maar as hulle nie gebruik word nie, moet hulle gekonfigureer word.

Voorbeelde in die Arduino IDE

Arduino IDE, datatipes, programmering

Om dit alles 'n bietjie beter te verstaan, wys ek hier twee sketskodes vir Arduino IDE waarmee jy die gebruik van timers kan ervaar. Die eerste is kode wat elke sekonde 'n LED sal flikker wat aan Arduino pen 8 gekoppel is:

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

Programmeer die flikkering of flikkering van die LED, soos in die vorige geval elke sekonde, maar hierdie keer gebruik CTC dws vergelyking:

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

Meer oor Arduino-programmering

koop 'n bord Arduino UNO Eerste 3

Die inhoud van die artikel voldoen aan ons beginsels van redaksionele etiek. Klik op om 'n fout te rapporteer hier.

Wees die eerste om te kommentaar lewer

Laat u kommentaar

Jou e-posadres sal nie gepubliseer word nie. Verpligte velde gemerk met *

*

*

  1. Verantwoordelik vir die data: Miguel Ángel Gatón
  2. Doel van die data: Beheer SPAM, bestuur van kommentaar.
  3. Wettiging: U toestemming
  4. Kommunikasie van die data: Die data sal nie aan derde partye oorgedra word nie, behalwe deur wettige verpligtinge.
  5. Datastoor: databasis aangebied deur Occentus Networks (EU)
  6. Regte: U kan u inligting te alle tye beperk, herstel en verwyder.

Engelse toetsToets KatalaansSpaanse vasvra