Prieš kurį laiką paskelbėme daugiau informacijos apie millis() funkcija de ArduinoDabar mes gilinsimės į Arduino laikmatis, norėdami pradėti naudotis šia funkcija, supraskite, kaip ši plokštė valdo laiką su MCU, taip pat kitas funkcijas, ne tik milis().
Kas yra Arduino laikmatis?
El Arduino laikmatis arba laikmatis, yra aparatinės įrangos (mikrovaldiklyje, kvarco kristalo, kuris generuoja laikrodžio impulsus ir nustato "ritmą", nereikalaujant išorinės aparatinės įrangos ar IC 555) įdiegta funkcija, kuri leidžia valdyti laikinus įvykius laikrodžių dėka. vidinis. Pavyzdžiui, užduotį atlikti tam tikrais intervalais, atlikti tikslius laiko matavimus ir pan., nepriklausomai nuo eskizo kodo.
Įsivaizduokite, kad naudojate uždelsimo () funkcija, tai užblokuos vykdymą Arduino MCU, kol praeis nurodytas laikas, ir tada tęs programą, tačiau laikmatis neužblokuos. Tai bus laikas, nes MCU ir toliau vykdys kitas instrukcijas vienu metu. Tai yra didelis privalumas.
Laikmatis yra susijęs su trukdžių Arduino, nes jie bus vykdomi per juos, norint atlikti tam tikrą užduotį. Kitaip tariant, „Arduino“ laikmatis yra funkcija, kuri įjungiama tam tikru metu ir vykdo pertraukimo funkciją. Štai kodėl taip pat svarbu žinoti apie šiuos sutrikimus.
Režimai
Arduino laikmatis turi 2 darbo režimai, galintis jį naudoti:
- PWM signalas: Galite valdyti Arduino kaiščiai (~).
- CTC (išvalyti palyginimo rungtynių laikmatį): skaičiuoja laiką skaitiklyje ir jam pasiekus laikmačių registre nurodytą reikšmę, įvykdomas pertraukimas.
Kiek laikmačių jis turi? Laikmačių tipai
ten 3 laikmačiai ant lėkščių Arduino UNO, nors kitose viršutinėse plokštėse gali būti daugiau:
- Laikmatis 0: 8 bitų, gali skaičiuoti nuo 0 iki 255 (256 galimos reikšmės). Naudojamas tokiose funkcijose kaip delay (), millis () ir micros (). Jo keisti nerekomenduojama, kad nebūtų pakeistos programos.
- Laikmatis 1: lygus 0 laikmačiui. Naudojamas UNO servo bibliotekoje (5 laikmatis MEGA).
- Laikmatis 2: 16 bitų ir gali svyruoti nuo 0 iki 65.525 65.536 (XNUMX XNUMX galimos reikšmės). Naudojamas tone() funkcijai, jei nenaudojamas, jis gali būti laisvai naudojamas jūsų programai.
- Laikmatis 3, 4, 5 (tik Arduino MEGA): visi 16 bitų.
Kaip veikia Arduino laikmatis?
Į dirbti su Arduino laikmačiu, labai svarbu žinoti, kaip visa tai veikia elektroniniu būdu šios kūrimo plokštės MCU:
- Laikrodžio dažnis: yra ciklų skaičius per sekundę, kurį jis sugeba išvystyti, Arduino atveju jis yra 16 Mhz, arba kas yra tas pats, laikrodžio signalas svyruoja 16.000.000 XNUMX XNUMX kartų per sekundę (ciklai).
- Laikotarpis: žymimas T, matuojamas sekundėmis ir yra atvirkštinė ciklų vertė. Pavyzdžiui, T=1/C, dėl kurio gautųsi 1/16000000 = 0.0000000625, laikas, kurio prireiks kiekvienam ciklui užbaigti. O dažnis yra atvirkštinis periodui, taigi f = 1/T.
- Ciklas: yra kiekvienas iš signalo pasikartojimų, atsirandančių per laiko vienetą. „Arduino“ per sekundę būtų 16 mln. Arba kas yra tas pats, šiuo atveju, kai praėjo 16 milijonų ciklų, praėjo viena sekundė. Todėl galima sakyti, kad vienas ciklas trunka 625 ns.
- signalo kraštas: Laikrodžio signalai yra kvadratiniai, o kraštai gali kilti arba kristi. Briauna yra tiesi signalo linija, kai ji pasikeičia iš:
- 0 (žemas) iki 1 (aukštas): kylantis kraštas.
- 1 (aukštas) iki 0 (žemas): krentantis kraštas.
Briaunos yra svarbios, nes Arduino laikmačiai matuoja ciklus nuo signalo kraštų. A) Taip el Contador jis didėja su kiekvienu ciklu ir kai pasiekia registro reikšmę, pertraukimas vykdomas.
Todėl, kai tai žinosite, jei turite 16Mhz Arduino MCU, ir naudojamas 8 bitų laikmatis, galima sakyti, kad pertraukimai vyks kas 16 μs (256/16000000) arba 4 ms 16 bitų atveju (65536/16000000). Todėl, jei nustatysite didžiausią 16 bitų skaitiklio registrą su reikšme 65535, pertraukimas įvyks po 4 ms, kad būtų atlikta bet kokia užduotis.
Kai skaitiklis pasiekia maksimalią galimą vertę, jis vėl grįš į 0. Tai reiškia, kad įvyksta perpildymas ir jis bus skaičiuojamas nuo pat pradžių.
Norėdami valdyti laikmačio padidėjimo greitį, taip pat galite naudoti pirminis skaleris, kuris įgauna reikšmes 1, 8, 64, 256 ir 1024 ir keičia laiką taip:
Laikmačio greitis (Hz) = Arduino / Prescaler laikrodžio dažnis
Jei jis yra 1, preskaleris padidės iki 16 Mhz, jei jis yra nuo 8 iki 2 Mhz, jei jis yra nuo 64 iki 250 kHz ir pan. Atminkite, kad bus laikmačio skaitiklio būsenos lyginamoji priemonė, skirta palyginti skaitiklio ir išankstinio skalės reikšmes, kol jos bus lygios, ir tada atlikti veiksmą. Taigi, pertraukimo dažnis pateikiama pagal formulę:
Pertraukimo greitis (Hz) = Arduino / Prescaler laikrodžio dažnis (lyginamojo registro vertė + 1)
Laimei, neturime keisti įrašus Arduino laikmačių, nes tuo pasirūpins bibliotekos, kurias naudojame kode. Bet jei jie nenaudojami, juos reikia sukonfigūruoti.
Arduino IDE pavyzdžiai
Norėdami visa tai suprasti šiek tiek geriau, čia parodysiu du Arduino IDE eskizų kodus, su kuriais galite patirti laikmačių naudojimą. Pirmasis yra kodas, kuris kas sekundę mirksi šviesos diodu, prijungtu prie Arduino kaiščio 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 }
Užprogramuokite šviesos diodo mirksėjimą arba mirksėjimą, kaip ir ankstesniu atveju, kas sekundę, bet šį kartą naudodami CTC ty palyginimas:
#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 }
Daugiau apie Arduino programavimą
nusipirk lėkštę Arduino UNO 3 rev