Arduino Timer: speel met timing in je projecten

Timer Arduino UNO

Enige tijd geleden publiceerden we meer informatie over de millis() functie de ArduinoNu gaan we dieper in op de Arduino-timer, om aan de slag te gaan met deze functie voor de functie, moet u begrijpen hoe dit bord de tijd beheert met de MCU, evenals andere functies buiten millis().

Wat is de Arduino-timer?

arduino-timer

El Arduino-timer, of timer, is een functie geïmplementeerd door hardware (in de microcontroller, met behulp van het kwartskristal dat de klokpulsen genereert en dat het "ritme" instelt, zonder dat externe hardware of IC's 555 nodig zijn) waarmee tijdelijke gebeurtenissen kunnen worden bestuurd dankzij klokken intern. Bijvoorbeeld een taak met tussenpozen laten gebeuren, nauwkeurige tijdmetingen doen, enz., onafhankelijk van de schetscode.

Como Arduino UNO Het heeft een MCU-chip die werkt op 16 Mhz, 16.000.000 kan elke seconde worden uitgevoerd. De instructies hebben X cycli nodig om uit te voeren, ze worden niet allemaal uitgevoerd in dezelfde klokcycli, de 16-bits cycli hebben bijvoorbeeld meer cycli nodig in deze AVR-architectuur.

Stel je voor dat je de vertraging() functie, blokkeert dit de uitvoering op de Arduino MCU totdat de opgegeven tijd is verstreken en gaat dan verder met het programma, maar de timer blokkeert niet. Het zal een timing zijn omdat de MCU andere instructies tegelijkertijd blijft uitvoeren. Dat is het grote voordeel.

De timer is gerelateerd aan: onderbrekingen van Arduino, omdat ze via hen worden uitgevoerd om een ​​specifieke taak bij te wonen. Met andere woorden, de Arduino Timer is een functie die op een bepaald moment wordt geactiveerd en een onderbrekingsfunctie uitvoert. Daarom is het ook belangrijk om van deze onderbrekingen op de hoogte te zijn.

modes

De Arduino Timer heeft: 2 bedrijfsmodi, in staat zijn om het te gebruiken in:

  • PWM-signaal:: U kunt de Arduino-pinnen (~).
  • CTC (Timer wissen bij vergelijkingswedstrijd): telt de tijd binnen een teller en wanneer deze de waarde bereikt die is gespecificeerd in een register van de timers, wordt de onderbreking uitgevoerd.

Hoeveel timers heeft het? Soorten timers

Arduino UNO millis-functies

Er 3 timers op de borden Arduino UNO, hoewel er mogelijk meer op andere bovenplaten staat:

  • timer 0: 8-bit, kan tellen van 0 tot 255 (256 mogelijke waarden). Gebruikt door functies zoals delay(), millis() en micros(). De wijziging ervan wordt niet aanbevolen om de programma's niet te wijzigen.
  • timer 1: gelijk aan Timer 0. Gebruikt door de Servo-bibliotheek in UNO (Timer 5 voor MEGA).
  • timer 2: 16-bit, en kan variëren van 0 tot 65.525 (65.536 mogelijke waarden). Wordt gebruikt voor de tone()-functie, indien niet gebruikt, kan deze vrij worden gebruikt voor uw toepassing.
  • Timer 3, 4, 5 (alleen op Arduino MEGA): allemaal 16-bits.

Hoe werkt de Arduino-timer?

timers, timers

Naar werken met een Arduino Timer, is het van vitaal belang om te weten hoe dit allemaal elektronisch werkt in de MCU van dit ontwikkelbord:

  • Klokfrequentie: is het aantal cycli per seconde dat het kan ontwikkelen, in het geval van Arduino is het 16 Mhz, of wat hetzelfde is, het kloksignaal oscilleert 16.000.000 keer in een seconde (cycli).
  • periode: wordt weergegeven door de T, en wordt gemeten in seconden, en is het omgekeerde van de cycli. Bijvoorbeeld T=1/C, wat zou resulteren in 1/16000000 = 0.0000000625, de tijd die nodig is om elke cyclus te voltooien. En de frequentie is het omgekeerde van de periode, dus f = 1/T.
  • cyclus: is elk van de herhalingen van het signaal die per tijdseenheid optreden. Op Arduino zou het 16M in een seconde zijn. Of wat hetzelfde is, in dit geval, wanneer 16 miljoen cycli zijn verstreken, is er één seconde verstreken. Daarom kan worden gezegd dat één cyclus 625 ns duurt.
  • rand van een signaal: Kloksignalen zijn vierkant en de randen kunnen stijgen of dalen. Een rand is de rechte lijn van het signaal wanneer het verandert van:
    • 0 (laag) tot 1 (hoog): stijgende flank.
    • 1 (hoog) tot 0 (laag): dalende flank.

Randen zijn belangrijk omdat Arduino-timers cycli van signaalranden meten. A) Ja de contador het neemt toe met elke cyclus en wanneer het de registerwaarde bereikt, wordt de onderbreking uitgevoerd.

Daarom, als u dit eenmaal weet, als u 16Mhz op de Arduino MCU, en een 8-bit Timer wordt gebruikt, kan worden gezegd dat interrupts elke 16 μs (256/16000000) of 4 ms voor 16-bit (65536/16000000) zullen plaatsvinden. Daarom, als u het 16-bits tellerregister op het maximum instelt, met de waarde 65535, dan zal de onderbreking plaatsvinden op 4 ms om welke taak dan ook uit te voeren.

Wanneer de teller de maximaal mogelijke waarde bereikt, het zal weer terugkeren naar 0. Dat wil zeggen, er treedt een overloop op en deze zal vanaf het begin terugtellen.

Om de toenamesnelheid van de timer te regelen, kunt u ook een prescaler, die de waarden 1, 8, 64, 256 en 1024 aanneemt en de timing als volgt verandert:

Timersnelheid (Hz) = Klokfrequentie van Arduino / Prescaler

Als het 1 is, zal de prescaler de controller verhogen tot 16 Mhz, als het 8 tot 2 Mhz is, als het 64 tot 250 kHz is, enzovoort. Onthoud dat er een timer-tellerstatusvergelijker zal zijn om de waarde van de teller en de prescaler te vergelijken totdat ze gelijk zijn en vervolgens een actie uit te voeren. Dus, onderbrekingsfrequentie: wordt gegeven door de formule:

+1 is omdat het tellerregister op 0 is geïndexeerd, d.w.z. het begint niet te tellen bij 1, maar bij 0.

Interrupt Speed ​​​​(Hz) = Arduino / Prescaler Clock Frequency (vergelijkerregisterwaarde + 1)

Gelukkig moeten we niet records wijzigen van de Arduino Timers, omdat dit wordt geregeld door de bibliotheken die we in de code gebruiken. Maar als ze niet worden gebruikt, moeten ze worden geconfigureerd.

Voorbeelden in de Arduino IDE

Arduino IDE, datatypes, programmeren

Om dit allemaal wat beter te begrijpen laat ik hier twee schetscodes voor Arduino IDE zien waarmee je het gebruik van timers kunt ervaren. De eerste is een code die elke seconde een LED knippert die is aangesloten op Arduino-pin 8:

#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 het knipperen of knipperen van de LED, zoals in het vorige geval elke seconde, maar deze keer met CTC, d.w.z. vergelijking:

#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 over Arduino-programmering

koop een bord Arduino UNO Rev3

Wees de eerste om te reageren

Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.