Arduino időzítő: játsszon az időzítéssel a projektekben

Időzítő Arduino UNO

Nemrég több információt publikáltunk a millis() függvény de ArduinoMost mélyebbre fogunk ásni a Arduino időzítő, a funkció használatának megkezdéséhez ismerje meg, hogy ez az MCU-val rendelkező kártya hogyan kezeli az időt, valamint a millis()-on túli egyéb funkciókat.

Mi az Arduino időzítő?

arduino időzítő

El Arduino időzítő vagy időzítő, egy hardveresen megvalósított funkció (a mikrokontrollerben az óraimpulzusokat generáló kvarckristály segítségével, amely a "ritmust állítja", külső hardver vagy IC-k 555 nélkül), amely lehetővé teszi az átmeneti események vezérlését az óráknak köszönhetően. belső. Például egy feladat időközönkénti végrehajtása, pontos időmérés, stb., függetlenül a vázlatkódtól.

Como Arduino UNO Egy MCU chip van benne, ami 16 Mhz-en működik, másodpercenként 16.000.000 16 XNUMX hajtható végre. Az utasításoknak X ciklusra van szükségük a végrehajtáshoz, nem mindegyik fut ugyanabban az órajelben, például a XNUMX biteseknek ebben az AVR architektúrában több ciklusra van szükség.

Képzeld el, hogy használod a delay() függvény, ez blokkolja a végrehajtást az Arduino MCU-n a megadott idő leteltéig, majd folytatja a programot, de az időzítő nem blokkol. Ez időzítésre kerül, mivel az MCU folytatja a többi utasítás egyidejű végrehajtását. Ez a nagy előny.

Az időzítő ehhez kapcsolódik megszakítások az Arduino-nak, mivel rajtuk keresztül hajtják végre őket valamilyen konkrét feladat elvégzése érdekében. Más szavakkal, az Arduino Timer egy olyan funkció, amely egy adott időpontban aktiválódik, és egy megszakítási funkciót hajt végre. Ezért is fontos tudni ezekről a megszakításokról.

Módok

Az Arduino Timer rendelkezik 2 üzemmód, ahol használható:

  • PWM jel: Ön irányíthatja a Arduino tűk (~).
  • CTC (Időzítő törlése összehasonlítási mérkőzésnél): számolja a számlálón belüli időt, és amikor az eléri az időzítők regiszterében megadott értéket, akkor a megszakítás végrehajtódik.

Hány időzítője van? Időzítők típusai

Arduino UNO millis funkciók

Ott 3 időzítő a tányérokon Arduino UNO, bár más felső lemezeken több is lehet:

  • Időzítő 0: 8 bites, 0-tól 255-ig számolhat (256 lehetséges érték). Olyan függvények használják, mint a delay(), a millis() és a micros(). Módosítása nem javasolt, nehogy a programok megváltozzanak.
  • Időzítő 1: egyenlő a 0. időzítővel. Az UNO szervo könyvtára használja (5. időzítő MEGA-hoz).
  • Időzítő 2: 16 bites, és 0 és 65.525 65.536 között változhat (XNUMX XNUMX lehetséges érték). A tone() függvényhez használjuk, ha nem használjuk, szabadon használható az alkalmazásunkhoz.
  • Időzítő 3, 4, 5 (csak Arduino MEGA esetén): mind 16 bites.

Hogyan működik az Arduino Timer?

időzítők, időzítők

A dolgozzon egy Arduino időzítővel, létfontosságú tudni, hogyan működik mindez elektronikusan a fejlesztői kártya MCU-jában:

  • Óra gyakorisága: az a ciklusok száma másodpercenként, amit képes kifejleszteni, Arduino esetében 16 Mhz, vagy ami ugyanennyi, az órajel 16.000.000 XNUMX XNUMX-szer oszcillál egy másodperc alatt (ciklusok).
  • időszak: a T képviseli, és másodpercben mérjük, és a ciklusok inverze. Például, T=1/C, ami azt eredményezné, hogy 1/16000000 = 0.0000000625, vagyis az az idő, amelybe minden ciklus befejeződik. A frekvencia pedig a periódus inverze, tehát f = 1/T.
  • ciklus: a jelnek az időegység alatt előforduló minden egyes ismétlődése. Arduinón egy másodperc alatt 16 millió lenne. Vagy ami ugyanaz, ebben az esetben, amikor 16 millió ciklus telt el, egy másodperc telt el. Ezért elmondható, hogy egy ciklus 625 ns-t vesz igénybe.
  • egy jel széle: Az órajelek négyzet alakúak, az élek emelkedhetnek vagy csökkenhetnek. Az él a jel egyenes vonala, amikor megváltozik:
    • 0 (alacsony) - 1 (magas): felfutó él.
    • 1 (magas) - 0 (alacsony): lefutó él.

Az élek fontosak, mivel az Arduino időzítők a jel széleitől mérik a ciklusokat. A) Igen a kontador ciklusonként növekszik, és amikor eléri a regiszterértéket, a megszakítás végrehajtásra kerül.

Ezért, ha egyszer ezt tudod, ha tudod 16Mhz az Arduino MCU-n, és 8 bites időzítőt használunk, elmondható, hogy a megszakítások 16 μs-onként (256/16000000) vagy 4 ms-onként fordulnak elő 16 bites esetén (65536/16000000). Tehát, ha a 16 bites számlálóregisztert a maximumra állítja, 65535 értékkel, akkor a megszakítás 4 ms-nál fog bekövetkezni, hogy bármilyen feladatot végrehajtson.

Amikor a számláló eléri a lehetséges maximális értéket, ismét 0-ra tér vissza. Azaz túlcsordulás történik, és az elejétől fog visszaszámolni.

Az időzítő növekedési ütemének szabályozására is használhatja egy előskálázó, amely 1, 8, 64, 256 és 1024 értékeket vesz fel, és így módosítja az időzítést:

Időzítő sebesség (Hz) = Arduino / Előskálázó órafrekvenciája

Ha 1, az előskálázó a vezérlő 16 Mhz-re, ha 8-2 Mhz-re, ha 64-250 kHz-re, és így tovább. Ne feledje, hogy lesz egy időzítő számláló állapot-összehasonlítója, amely összehasonlítja a számláló és az előskálázó értékét, amíg azok egyenlőek nem lesznek, majd végrehajt egy műveletet. Így, megszakítási frekvencia képlettel adjuk meg:

A +1 azért van, mert a számlálóregiszter 0-ra van indexelve, vagyis nem 1-től kezdi a számolást, hanem 0-tól.

Megszakítási sebesség (Hz) = Arduino / Előskálázó órafrekvencia (összehasonlító regiszter értéke + 1)

Szerencsére nem szabad rekordokat módosítani az Arduino időzítők, mivel arról a kódban használt könyvtárak gondoskodnak. De ha nem használják őket, akkor konfigurálni kell őket.

Példák az Arduino IDE-ben

Arduino IDE, adattípusok, programozás

Hogy mindezt egy kicsit jobban megértsük, itt mutatok két vázlatkódot az Arduino IDE-hez, amelyekkel megtapasztalhatod az időzítők használatát. Az első egy kód, amely másodpercenként villog az Arduino 8-as érintkezőjéhez csatlakoztatott LED-en:

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

Programozza be a LED villogását vagy villogását, mint az előző esetben másodpercenként, de ezúttal használja CTC azaz összehasonlítás:

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

Bővebben az Arduino programozásról

vesz egy tányért Arduino UNO Rev3

Legyen Ön az első hozzászóló

Hagyja megjegyzését

E-mail címed nem kerül nyilvánosságra. Kötelező mezők vannak jelölve *

*

*

  1. Az adatokért felelős: Miguel Ángel Gatón
  2. Az adatok célja: A SPAM ellenőrzése, a megjegyzések kezelése.
  3. Legitimáció: Az Ön beleegyezése
  4. Az adatok közlése: Az adatokat csak jogi kötelezettség alapján továbbítjuk harmadik felekkel.
  5. Adattárolás: Az Occentus Networks (EU) által üzemeltetett adatbázis
  6. Jogok: Bármikor korlátozhatja, helyreállíthatja és törölheti adatait.