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?
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.
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čů
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?
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:
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
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 }koupit talíř Arduino UNO Rev