Pred časom sme zverejnili ďalšie informácie o funkciu millis(). de ArduinoTeraz sa ponoríme hlbšie do Arduino časovačAk chcete začať s touto funkciou, pochopte, ako táto doska riadi čas s MCU, ako aj s ďalšími funkciami nad rámec millis().
Čo je Arduino Timer?
El Arduino časovač alebo časovač, je funkcia implementovaná hardvérom (v mikrokontroléri pomocou kremenného kryštálu, ktorý generuje hodinové impulzy a nastavuje „rytmus“, bez potreby externého hardvéru alebo IC 555), ktorá umožňuje ovládanie dočasných udalostí vďaka hodinám interné. Napríklad vykonávanie úlohy v intervaloch, presné meranie času atď., nezávisle od kódu náčrtu.
Predstavte si, že používate funkcia delay()., toto zablokuje vykonávanie na Arduino MCU, kým neuplynie zadaný čas a potom bude pokračovať v programe, ale časovač sa nezablokuje. Bude to načasovanie, pretože MCU bude pokračovať vo vykonávaní ďalších pokynov súčasne. To je veľká výhoda.
Časovač súvisí s prerušenia Arduino, pretože budú prostredníctvom nich vykonávaní, aby sa zúčastnili nejakej konkrétnej úlohy. Inými slovami, Arduino Timer je funkcia, ktorá sa spúšťa v určitom čase a vykonáva funkciu prerušenia. Preto je tiež dôležité vedieť o týchto prerušeniach.
Režimy
Časovač Arduino má 2 prevádzkové režimy, môcť ho použiť v:
- signál PWM: Môžete ovládať Arduino kolíky (~).
- CTC (Vymazať časovač pri porovnávacom zápase): počíta čas vnútri počítadla a keď dosiahne hodnotu určenú v registri časovačov, vykoná sa prerušenie.
Koľko má časovačov? Typy časovačov
Tam 3 časovače na tanieroch Arduino UNO, aj keď na iných vrchných doskách môže byť viac:
- Časovač 0: 8-bit, môže počítať od 0 do 255 (256 možných hodnôt). Používajú ho funkcie ako delay(), millis() a micros(). Jeho úprava sa neodporúča, aby nedošlo k zmene programov.
- Časovač 1: rovná sa Timer 0. Používa sa knižnicou Servo v UNO (Timer 5 pre MEGA).
- Časovač 2: 16-bit a môže byť v rozsahu od 0 do 65.525 65.536 (XNUMX XNUMX možných hodnôt). Používa sa pre funkciu tone (), ak sa nepoužíva, môže byť voľne použitá pre vašu aplikáciu.
- Časovač 3, 4, 5 (iba na Arduino MEGA): všetko 16-bit.
Ako funguje Arduino Timer?
Byť schopný pracovať s časovačom Arduino, je dôležité vedieť, ako to všetko funguje elektronicky v MCU tejto vývojovej dosky:
- Frekvencia hodín: je počet cyklov za sekundu, ktoré je schopný vyvinúť, v prípade Arduina je to 16 Mhz, alebo čo je to isté, hodinový signál osciluje 16.000.000 XNUMX XNUMX krát za sekundu (cykly).
- perióda: je reprezentované T a meria sa v sekundách a je inverznou hodnotou cyklov. Napríklad T=1/C, čo by viedlo k 1/16000000 = 0.0000000625, čo je čas potrebný na dokončenie každého cyklu. A frekvencia je inverzná k perióde, takže f = 1/T.
- cyklus: je každé jedno z opakovaní signálu, ktoré sa vyskytuje za jednotku času. Na Arduine by to bolo 16 miliónov za sekundu. Alebo čo je to isté, v tomto prípade, keď prešlo 16 miliónov cyklov, uplynula jedna sekunda. Dá sa teda povedať, že jeden cyklus trvá 625 ns.
- okraj signálu: Hodinové signály sú štvorcové a okraje môžu stúpať alebo klesať. Hrana je priamka signálu, keď sa mení z:
- 0 (nízka) až 1 (vysoká): stúpajúca hrana.
- 1 (vysoká) až 0 (nízka): zostupná hrana.
Hrany sú dôležité, pretože časovače Arduino merajú cykly od hrán signálu. A) Áno Počítadlo zvyšuje sa s každým cyklom a keď dosiahne hodnotu registra, vykoná sa prerušenie.
Preto, keď to už viete, ak máte 16 MHz na Arduino MCU, a je použitý 8-bitový časovač, dá sa povedať, že prerušenia nastanú každých 16 μs (256/16000000) alebo 4 ms pre 16-bit (65536/16000000). Ak teda nastavíte 16-bitový register počítadla na maximum s hodnotou 65535, prerušenie nastane po 4 ms na vykonanie akejkoľvek úlohy.
Keď počítadlo dosiahne maximálnu možnú hodnotu, opäť sa vráti na 0. To znamená, že dôjde k pretečeniu a bude počítať späť od začiatku.
Na ovládanie rýchlosti zvyšovania môžete použiť aj časovač preddeličku, ktorý nadobúda hodnoty 1, 8, 64, 256 a 1024 a mení načasovanie takto:
Rýchlosť časovača (Hz) = taktovacia frekvencia Arduina / preddeličky
Ak je 1, preddelička sa zvýši na 16 Mhz, ak je 8 až 2 Mhz, ak je 64 až 250 kHz, atď. Nezabudnite, že bude existovať komparátor stavu počítadla časovača na porovnanie hodnoty počítadla a preddeličky, kým nebudú rovnaké, a potom vykoná akciu. takze frekvencia prerušenia je daný vzorcom:
Rýchlosť prerušenia (Hz) = frekvencia hodín Arduino / preddeličky (hodnota registra komparátora + 1)
Našťastie nesmieme upravovať záznamy časovačov Arduino, pretože sa o to postarajú knižnice, ktoré používame v kóde. Ak sa však nepoužívajú, mali by byť nakonfigurované.
Príklady v Arduino IDE
Aby som tomu všetkému trochu lepšie porozumel, tu uvádzam dva kódy náčrtu pre Arduino IDE, s ktorými si môžete vyskúšať používanie časovačov. Prvým je kód, ktorý každú sekundu zabliká LED pripojená 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 blikanie alebo blikanie LED, ako v predchádzajúcom prípade každú sekundu, ale tentoraz pomocou CTC t.j. porovnanie:
#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 }kúpiť tanier Arduino UNO Rev. 3