Arduino Timer: hrajte si s načasováním ve svých projektech

Časový spínač Arduino UNO

Před časem jsme zveřejnili více informací o funkce millis(). de ArduinoNyní se ponoříme hlouběji do Časovač ArduinoChcete-li začít s touto funkcí této funkce, pochopte, jak tato deska s MCU řídí čas a další funkce nad rámec millis().

Co je Arduino Timer?

časovač arduino

El Arduino časovač nebo časovač, je hardwarově implementovaná funkce (v mikrokontroléru pomocí křemenného krystalu, který generuje hodinové impulsy a nastavuje „rytmus“, bez potřeby externího hardwaru nebo IC 555), která umožňuje ovládání dočasných událostí díky hodinám vnitřní. Například provádění úkolu v intervalech, přesná měření času atd., nezávisle na kódu náčrtu.

Como Arduino UNO Má čip MCU, který pracuje na frekvenci 16 Mhz, každou sekundu lze spustit 16.000.000 16 XNUMX. Instrukce potřebují ke svému provedení X cyklů, ne všechny se provádějí ve stejných hodinových cyklech, například ty XNUMXbitové potřebují v této architektuře AVR více cyklů.

Představte si, že používáte funkce delay()., toto zablokuje provádění na Arduino MCU, dokud neuplyne zadaný čas, a poté bude pokračovat v programu, ale časovač se nezablokuje. Bude to načasování, protože MCU bude pokračovat ve vykonávání dalších instrukcí současně. To je velká výhoda.

Časovač souvisí s přerušení Arduina, protože budou spouštěny jejich prostřednictvím, aby se zúčastnily nějakého konkrétního úkolu. Jinými slovy, Arduino Timer je funkce, která se spouští v určitý čas a provádí funkci přerušení. Proto je také důležité o těchto přerušeních vědět.

Režimy

Časovač Arduino má 2 provozní režimy, je možné jej použít v:

  • signál PWM: Můžete ovládat Arduino piny (~).
  • CTC (Vymazat časovač při srovnávacím zápasu): počítá čas uvnitř čítače a když dosáhne hodnoty zadané v registru časovačů, provede se přerušení.

Kolik to má časovačů? Typy časovačů

Arduino UNO millis funkce

Tam 3 časovače na talířích Arduino UNO, i když na jiných horních deskách může být více:

  • Časovač 0: 8-bit, může počítat od 0 do 255 (256 možných hodnot). Používají se funkcemi jako delay(), millis() a micros(). Jeho úprava se nedoporučuje, aby nedošlo ke změně programů.
  • Časovač 1: rovná se Timer 0. Používá knihovna Servo v UNO (Timer 5 pro MEGA).
  • Časovač 2: 16-bit a může být v rozsahu od 0 do 65.525 65.536 (XNUMX XNUMX možných hodnot). Používá se pro funkci tone(), pokud se nepoužívá, lze ji volně použít pro vaši aplikaci.
  • Časovač 3, 4, 5 (pouze na Arduino MEGA): vše 16bitové.

Jak funguje Arduino Timer?

časovače, časovače

Na pracovat s časovačem Arduino, je důležité vědět, jak to vše elektronicky funguje v MCU této vývojové desky:

  • Frekvence hodin: je počet cyklů za sekundu, které je schopen vyvinout, v případě Arduina je to 16 Mhz, nebo co je totéž, hodinový signál osciluje 16.000.000 XNUMX XNUMX krát za sekundu (cykly).
  • Období: je reprezentováno T a je měřeno v sekundách a je inverzí k cyklům. Například T=1/C, což by vedlo k 1/16000000 = 0.0000000625, což je doba potřebná k dokončení každého cyklu. A frekvence je převrácená hodnota periody, takže f = 1/T.
  • Cyklus: je každé jedno z opakování signálu, ke kterému dochází za jednotku času. Na Arduinu by to bylo 16 milionů za sekundu. Nebo co je totéž, v tomto případě, když prošlo 16 milionů cyklů, uplynula jedna sekunda. Dá se tedy říci, že jeden cyklus trvá 625 ns.
  • okraj signálu: Hodinové signály jsou čtvercové a okraje mohou stoupat nebo klesat. Hrana je přímka signálu, když se změní z:
    • 0 (nízká) až 1 (vysoká): náběžná hrana.
    • 1 (vysoká) až 0 (nízká): sestupná hrana.

Hrany jsou důležité, protože časovače Arduino měří cykly od hran signálu. A) Ano contador zvyšuje se s každým cyklem a když dosáhne hodnoty registru, provede se přerušení.

Proto, jakmile to víte, pokud ano 16Mhz na Arduino MCU, a je použit 8bitový časovač, lze říci, že k přerušením dojde každých 16 μs (256/16000000) nebo 4 ms u 16bitového (65536/16000000). Pokud tedy nastavíte 16bitový registr čítače na maximum, s hodnotou 65535, dojde k přerušení za 4 ms, aby bylo možné provést jakoukoli úlohu.

Když počítadlo dosáhne maximální možné hodnoty, vrátí se znovu na 0. To znamená, že dojde k přetečení a bude počítat zpět od začátku.

K ovládání rychlosti nárůstu můžete také použít časovač předdělovač, který nabývá hodnot 1, 8, 64, 256 a 1024 a mění časování takto:

Rychlost časovače (Hz) = taktovací frekvence Arduina / předděličky

Pokud je 1, předdělička se zvýší na 16 Mhz, pokud je 8 až 2 Mhz, pokud je 64 až 250 kHz, atd. Pamatujte, že bude k dispozici komparátor stavu počítadla časovače, který porovná hodnotu počítadla a předděličky, dokud se nebudou rovnat, a poté provede akci. Tak, frekvence přerušení je dáno vzorcem:

+1 je proto, že registr čítače je indexován na 0, tj. nezačíná počítat od 1, ale od 0.

Rychlost přerušení (Hz) = frekvence hodin Arduino / předděličky (hodnota registru komparátoru + 1)

Naštěstí nesmíme upravovat záznamy časovačů Arduino, protože se o to postarají knihovny, které používáme v kódu. Pokud se však nepoužívají, je třeba je nakonfigurovat.

Příklady v Arduino IDE

Arduino IDE, datové typy, programování

Abychom tomu všemu trochu lépe porozuměli, zde uvedu dva skicovací kódy pro Arduino IDE, se kterými si můžete vyzkoušet používání časovačů. První je kód, který každou sekundu zabliká LED připojená k Arduino pinu 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
}

Naprogramujte blikání nebo blikání LED jako v předchozím případě každou sekundu, ale tentokrát pomocí CTC tj. srovnání:

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

Více o programování Arduino

koupit talíř Arduino UNO Rev

Buďte první komentář

Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Odpovědný za údaje: Miguel Ángel Gatón
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.