'n Tyd gelede het ons meer inligting gepubliseer oor die millis() funksie de ArduinoNou sal ons dieper in die Arduino timer, om met hierdie kenmerk vir die kenmerk te begin, verstaan hoe hierdie bord tyd met die MCU bestuur, sowel as ander funksies buite millis().
Index
Wat is die Arduino Timer?
El Arduino timer, of timer, is 'n funksie geïmplementeer deur hardeware (in die mikrobeheerder, met die hulp van die kwartskristal wat die klokpulse genereer en wat die "ritme" stel, sonder die behoefte aan eksterne hardeware of IC's 555) wat dit moontlik maak om tydelike gebeurtenisse te beheer danksy horlosies intern. Byvoorbeeld, om 'n taak met tussenposes te laat gebeur, presiese tydmetings te maak, ens., onafhanklik van die sketskode.
Stel jou voor dat jy die delay() funksie, sal dit uitvoering op die Arduino MCU blokkeer totdat die gespesifiseerde tyd verstryk en dan voortgaan met die program, maar die timer sal nie blokkeer nie. Dit sal tydsberekening wees aangesien die MCU voortgaan om ander instruksies gelyktydig uit te voer. Dit is die groot voordeel.
Die timer is verwant aan onderbrekings van Arduino, aangesien hulle deur hulle uitgevoer sal word om 'n spesifieke taak by te woon. Met ander woorde, die Arduino Timer is 'n funksie wat op 'n sekere tyd geaktiveer word, wat 'n onderbrekingsfunksie uitvoer. Daarom is dit ook belangrik om van hierdie onderbrekings te weet.
Modusse
Die Arduino Timer het 2 werkswyses, om dit te kan gebruik in:
- PWM sein: Jy kan die beheer Arduino penne (~).
- CTC (Vee timer op vergelyk wedstryd): tel die tyd binne 'n teller en wanneer dit die waarde bereik wat in 'n register van die tydtellers gespesifiseer is, word die onderbreking uitgevoer.
Hoeveel timers het dit? Tipes timers
Daar 3 timers op die borde Arduino UNO, alhoewel daar meer op ander boonste plate kan wees:
- Tydoproep 0: 8-bis, kan van 0 tot 255 tel (256 moontlike waardes). Word gebruik deur funksies soos delay(), millis() en micros(). Die wysiging daarvan word nie aanbeveel om nie die programme te verander nie.
- Tydoproep 1: gelyk aan Timer 0. Gebruik deur die Servo-biblioteek in UNO (Timer 5 vir MEGA).
- Tydoproep 2: 16-bis, en kan wissel van 0 tot 65.525 65.536 (XNUMX XNUMX moontlike waardes). Word gebruik vir die toon()-funksie, indien dit nie gebruik word nie, kan dit vrylik vir jou toepassing gebruik word.
- Timer 3, 4, 5 (slegs op Arduino MEGA): alles 16-bis.
Hoe werk die Arduino Timer?
Om te kan werk met 'n Arduino Timer, is dit noodsaaklik om te weet hoe dit alles elektronies in die MCU van hierdie ontwikkelingsraad werk:
- Klokfrekwensie: is die aantal siklusse per sekonde wat dit in staat is om te ontwikkel, in die geval van Arduino is dit 16 Mhz, of wat dieselfde is, die kloksein ossilleer 16.000.000 XNUMX XNUMX keer in 'n sekonde (siklusse).
- tydperk: word voorgestel deur die T, en word gemeet in sekondes, en is die omgekeerde van die siklusse. Byvoorbeeld, T=1/C, wat sou lei tot 1/16000000 = 0.0000000625, die tyd wat dit sal neem vir elke siklus om te voltooi. En die frekwensie is die inverse van die periode, dus f = 1/T.
- siklus: is elkeen van die herhalings van die sein wat per tydseenheid voorkom. Op Arduino sou dit 16M in 'n sekonde wees. Of wat is dieselfde, in hierdie geval, wanneer 16 miljoen siklusse verby is, is een sekonde verby. Daarom kan gesê word dat een siklus 625 ns neem.
- rand van 'n sein: Klokseine is vierkantig, en die rande kan styg of daal. 'n Rand is die reguit lyn van die sein wanneer dit verander van:
- 0 (laag) tot 1 (hoog): stygende rand.
- 1 (hoog) tot 0 (laag): dalende rand.
Rande is belangrik omdat Arduino-timers siklusse vanaf seinrande meet. A) Ja die eienaar dit verhoog met elke siklus en wanneer dit die registerwaarde bereik, word die onderbreking uitgevoer.
Daarom, sodra jy dit weet, as jy het 16Mhz op die Arduino MCU, en 'n 8-bis Timer gebruik word, kan gesê word dat onderbrekings elke 16 μs (256/16000000) of 4 ms vir 16-bis (65536/16000000) sal voorkom. Dus, as jy die 16-bis tellerregister op die maksimum stel, met die waarde 65535, sal die onderbreking by 4 ms plaasvind om watter taak dit ook al is uit te voer.
Wanneer die teller die maksimum moontlike waarde bereik, dit sal weer na 0 terugkeer. Dit wil sê, 'n oorloop vind plaas en dit sal van die begin af terugtel.
Om die tempo van toename van die timer te beheer kan jy ook gebruik 'n voorskaaler, wat waardes 1, 8, 64, 256 en 1024 neem en die tydsberekening soos volg verander:
Timerspoed (Hz) = Klokfrekwensie van Arduino / Prescaler
As dit 1 is, sal die voorskaaler die beheerder verhoog na 16 Mhz, as dit 8 tot 2 Mhz is, as dit 64 tot 250 kHz is, ensovoorts. Onthou dat daar 'n tydteller-toestandvergelyker sal wees om die waarde van die teller en die voorskaaler te vergelyk totdat hulle gelyk is en dan 'n aksie uit te voer. Dus, onderbrekingsfrekwensie word gegee deur die formule:
Onderbrekingspoed (Hz) = Arduino / Prescaler Klokfrekwensie (vergelykerregisterwaarde + 1)
Gelukkig moet ons nie rekords te verander van die Arduino Timers, aangesien dit versorg sal word deur die biblioteke wat ons in die kode gebruik. Maar as hulle nie gebruik word nie, moet hulle gekonfigureer word.
Voorbeelde in die Arduino IDE
Om dit alles 'n bietjie beter te verstaan, wys ek hier twee sketskodes vir Arduino IDE waarmee jy die gebruik van timers kan ervaar. Die eerste is kode wat elke sekonde 'n LED sal flikker wat aan Arduino pen 8 gekoppel is:
#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 }
Programmeer die flikkering of flikkering van die LED, soos in die vorige geval elke sekonde, maar hierdie keer gebruik CTC dws vergelyking:
#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 }
Meer oor Arduino-programmering
koop 'n bord Arduino UNO Eerste 3
Wees die eerste om te kommentaar lewer