Muddo ka hor waxaan daabacnay macluumaad dheeraad ah oo ku saabsan millis() shaqada de ArduinoHadda waxaan si qoto dheer u sii wadi doonaa Arduino Timer, Si aad u bilawdo sifadan muuqaalka, faham sida guddigani u maareeyo wakhtiga MCU, iyo sidoo kale hawlo kale oo ka baxsan millis ().
Waa maxay saacada Arduino?
El Saacadaha Arduino, ama saacadeeyaha, waa shaqo ay hirgelisay qalabka (microcontroller-ka, iyadoo la kaashanayo kristanta quartz ee soo saarta garaaca saacadda oo dejisa "laxanka", iyada oo aan loo baahnayn qalab dibadda ah ama ICs 555) taas oo u oggolaanaysa xakamaynta dhacdooyinka ku-meel-gaarka ah iyada oo ay ugu wacan tahay saacadaha gudaha. Tusaale ahaan, samaynta hawl u dhacdo waqtiyo kala duwan, samaynta cabbiraad sax ah, iwm, oo ka madax bannaan koodka sawir-gacmeedka.
Ka fikir inaad isticmaasho daahitaanka() shaqada, tani waxay xannibi doontaa fulinta Arduino MCU ilaa wakhtiga la cayimay uu dhaafo ka dibna sii wad barnaamijka, laakiin saacaduhu ma xannibi doono. Waxay noqon doontaa waqti marka MCU ay sii wado fulinta tilmaamaha kale isku mar. Taasi waa faa'iidada weyn.
Saacadaha ayaa la xidhiidha carqaladayn ee Arduino, maadaama lagu fulin doono iyaga si ay uga qaybgalaan hawl gaar ah. Si kale haddii loo dhigo, Arduino Timer waa shaqo kicisa waqti go'an, oo fulinaysa shaqo joojin. Taasi waa sababta ay sidoo kale muhiim u tahay in la ogaado carqaladahaas.
Hababka
Arduino Timer ayaa leh 2 qaababka hawlgalkaawood u leh inuu ku isticmaalo:
- Calaamadaha PWM: Waad xakameyn kartaa biinanka Arduino (~).
- CTC (Nadiifi saacadaha isbarbardhigga): waxa uu xisaabiyaa wakhtiga gudaha miiska marka uu gaadho qiimaha lagu sheegay diiwaanka saacadaha, hakadka ayaa la fulinayaa.
Immisa saacadood ayay leedahay? Noocyada Saacadaha
Waxaa jira 3 saacadood on taarikada Arduino UNO, inkastoo laga yaabo inay wax badan ku jiraan taarikada kale ee sare:
- Saacad 0: 8-bit, waxaa lagu tirin karaa 0 ilaa 255 (256 qiimaha suurtagalka ah). Loo isticmaalo hawlaha sida daahitaanka(), millis(), iyo micros(). Wax ka beddelkeeda laguma talinayo si aan loo beddelin barnaamijyada.
- Saacad 1: waxay le'eg tahay saacada 0. Waxaa adeegsada maktabadda Servo ee UNO (Wakhtiga 5 ee MEGA).
- Saacad 2: 16-bit, waxayna u dhaxayn kartaa 0 ilaa 65.525 (65.536 qiimayaasha suurtagalka ah). Loo isticmaalo codka () shaqada, haddii aan la isticmaalin, waxa loo isticmaali karaa si xor ah codsigaaga.
- Saacadaha 3, 4, 5 (kaliya Arduino MEGA): dhammaan 16-bit.
Sidee buu Arduino Timer u shaqeeyaa?
Si aad u awooddo la shaqee Arduino Timer, waa muhiim in la ogaado sida waxaas oo dhami ay ugu shaqeeyaan si elektaroonig ah MCU ee guddiga horumarinta:
- Soocelinta saacadda: waa tirada wareegyada ilbiriqsikii ee ay awood u leedahay in ay kor u kacdo, Arduino waa 16 Mhz, ama waxa la mid ah, saacaddu waxay ku wareegtaa 16.000.000 jeer ilbiriqsi (wareegyo).
- Muddada: waxaa lagu matalaa T, waxaana lagu cabbiraa ilbiriqsiyo, waana rogaal celinta wareegyada. Tusaale ahaan, T=1/C, taas oo keeni karta 1/16000000 = 0.0000000625, wakhtiga ay qaadanayso in wareeg kasta la dhamaystiro. Inta jeerku waa rogaal celinta xilliga, markaa f = 1/T.
- Wareeg: waa mid kasta oo ka mid ah ku celcelinta calaamada ku dhacda halbeeg kasta. Arduino waxay noqon doontaa 16M ilbiriqsi gudaheed. Ama maxaa la mid ah, kiiskan, marka 16 milyan oo wareeg ah, hal ilbiriqsi ayaa gudbay. Sidaa darteed, hal wareeg ayaa la odhan karaa wuxuu qaadanayaa 625 ns.
- cidhifka calaamadCalaamadaha saacaddu waa afar gees, cidhifyadu waxay noqon karaan kuwo kor u kacaya ama soo dhacaya. Cidhifku waa xariiqda toosan ee calaamadda marka ay ka beddesho:
- 0 (hoose) ilaa 1 (sare): gees kor u kacaysa.
- 1 (sare) ilaa 0 (hoose): gees soo dhacaya.
Cidhifyadu waa muhiim sababtoo ah saacadaha Arduino waxay cabbiraan wareegyada cidhifyada calaamadaha. A) Haa kontadorka waxay kordhisaa wareeg kasta oo marka ay gaadho qiimaha diiwaanka, joojinta waa la fuliyay.
Sidaa darteed, marka aad tan ogaato, haddii aad leedahay 16Mhz ee Arduino MCU, iyo 8-bit Timer ayaa la isticmaalaa, waxaa la dhihi karaa hakadyadu waxay dhici doonaan 16 μs (256/16000000) ama 4 ms 16-bit (65536/16000000). Sidaa darteed, haddii aad dejiso diiwaanka counter 16-bit ugu badnaan, oo leh qiimaha 65535, ka dibna joojinta waxay ku dhici doontaa 4 ms si loo fuliyo hawl kasta oo ay tahay.
Marka miiska miiska uu gaaro qiimaha ugu badan ee suurtogalka ah, waxay ku noqon doontaa 0 mar kale. Taasi waa, qulqulitaan ayaa dhacaya oo dib ayay u tirin doontaa bilowga hore.
Si aad u xakamayso heerka korodhka saacada waxa kale oo aad isticmaali kartaa prescaler, kaas oo qaadata qiyamka 1, 8, 64, 256 iyo 1024 oo bedelaya wakhtiga sidan oo kale:
Xawaaraha saacada (Hz) = Inta jeer ee saacada Arduino / Prescaler
Haddii ay tahay 1 prescaler-ka koontarooluhu wuxuu kordhin doonaa ilaa 16 Mhz, haddii ay tahay 8 ilaa 2 Mhz, haddii ay tahay 64 ilaa 250 kHz, iyo wixii la mid ah. Xasuusnoow in uu jiri doono saacadeeyaha counter state comparator si loo isbarbar dhigo qiimaha miiska iyo kan hore ilaa ay ka siman yihiin kadibna ay fuliyaan ficil. Haddaba, joojinta inta jeer waxaa lagu bixiyaa qaacidada:
Xawaaraha kala go'a (Hz) = Inta jeer ee Arduino / Prescaler (qiimaha diiwaanka isbarbardhiga + 1)
Nasiib wanaag, waa inaan wax ka beddel xogta ee Arduino Timers, maadaama ay daryeeli doonaan maktabadaha aan ku isticmaalno koodhka. Laakiin haddii aan la isticmaalin, waa in la habeeyaa.
Tusaalooyinka ku jira Arduino IDE
Si aan waxaas oo dhan u yara yara fahmo, halkan waxaan ku tusayaa laba kood oo sawir-gacmeed oo Arduino IDE ah oo aad kula kulmi karto isticmaalka saacadaha. Midka koowaad waa koodka ilbiriqsi doona LED ku xiran Arduino pin 8 ilbiriqsi kasta:
#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 diyaari biliglashada ama biliglashada LED-ka, sida kiiskii hore ilbiriqsi kasta, laakiin markan isticmaal CTC tusaale ahaan isbarbardhigga:
#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 }
Wax badan oo ku saabsan barnaamijka Arduino
soo iibso saxan Arduino UNO Nolosha 3