Arduino Timer: hrajte sa s načasovaním vo svojich projektoch

Časovač Arduino UNO

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?

arduino časovač

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.

como Arduino UNO Má čip MCU, ktorý pracuje na frekvencii 16 Mhz, každú sekundu môže byť vykonaných 16.000.000 16 XNUMX. Inštrukcie potrebujú na vykonanie X cyklov, nie všetky sa vykonávajú v rovnakých hodinových cykloch, napríklad XNUMX-bitové potrebujú v tejto architektúre AVR viac cyklov.

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

Arduino UNO millis funkcie

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?

časovače, časovače

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:

+1 je preto, že register počítadla je indexovaný na 0, t.j. nezačína počítať od 1, ale od 0.

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

Arduino IDE, dátové typy, programovanie

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
}

Viac o programovaní Arduino

kúpiť tanier Arduino UNO Rev. 3

Buďte prvý komentár

Zanechajte svoj komentár

Vaša e-mailová adresa nebude zverejnená. Povinné položky sú označené *

*

*

  1. Zodpovedný za údaje: Miguel Ángel Gatón
  2. Účel údajov: Kontrolný SPAM, správa komentárov.
  3. Legitimácia: Váš súhlas
  4. Oznamovanie údajov: Údaje nebudú poskytnuté tretím stranám, iba ak to vyplýva zo zákona.
  5. Ukladanie dát: Databáza hostená spoločnosťou Occentus Networks (EU)
  6. Práva: Svoje údaje môžete kedykoľvek obmedziť, obnoviť a vymazať.