कुछ समय पहले हमने इसके बारे में अधिक जानकारी प्रकाशित की थी मिलिस () फ़ंक्शन de Arduinoअब हम गहराई में उतरेंगे Arduino टाइमर, सुविधा के लिए इस सुविधा के साथ आरंभ करने के लिए, समझें कि यह बोर्ड एमसीयू के साथ-साथ मिलिस() से परे अन्य कार्यों के साथ समय का प्रबंधन कैसे करता है।
Arduino टाइमर क्या है?
El Arduino टाइमर, या टाइमर, हार्डवेयर द्वारा कार्यान्वित एक फ़ंक्शन है (माइक्रोकंट्रोलर में, क्वार्ट्ज क्रिस्टल की मदद से जो घड़ी की दालों को उत्पन्न करता है और जो "ताल" सेट करता है, बाहरी हार्डवेयर या आईसी 555 की आवश्यकता के बिना) जो अस्थायी घटनाओं को नियंत्रित करने की अनुमति देता है। अंदर का। उदाहरण के लिए, किसी कार्य को अंतराल पर करना, सटीक समय मापन करना, आदि, स्केच कोड से स्वतंत्र रूप से।
कल्पना कीजिए कि आप का उपयोग करते हैं देरी () फ़ंक्शन, यह निर्दिष्ट समय समाप्त होने तक Arduino MCU पर निष्पादन को रोक देगा और फिर प्रोग्राम के साथ जारी रहेगा, लेकिन टाइमर ब्लॉक नहीं होगा। यह समय होगा क्योंकि एमसीयू एक साथ अन्य निर्देशों को निष्पादित करना जारी रखता है। यही बड़ा फायदा है।
टाइमर से संबंधित है रुकावट Arduino के, क्योंकि उन्हें किसी विशिष्ट कार्य में भाग लेने के लिए उनके माध्यम से निष्पादित किया जाएगा। दूसरे शब्दों में, Arduino Timer एक फ़ंक्शन है जो एक निश्चित समय पर चालू होता है, एक इंटरप्ट फ़ंक्शन निष्पादित करता है। इसलिए इन रुकावटों के बारे में जानना भी जरूरी है।
मोडोस
Arduino टाइमर में है 2 ऑपरेटिंग मोड, इसका उपयोग करने में सक्षम होने के नाते:
- पीडब्लूएम सिग्नल: आप नियंत्रित कर सकते हैं Arduino पिन (~).
- सीटीसी (तुलना मैच पर स्पष्ट टाइमर): एक काउंटर के अंदर समय की गणना करता है और जब यह टाइमर के एक रजिस्टर में निर्दिष्ट मूल्य तक पहुँच जाता है, तो रुकावट निष्पादित हो जाती है।
इसमें कितने टाइमर हैं? टाइमर के प्रकार
वहाँ 3 टाइमर प्लेटों पर Arduino UNO, हालांकि अन्य शीर्ष प्लेटों पर और भी हो सकते हैं:
- समय ०: 8-बिट, 0 से 255 (256 संभावित मान) तक गिना जा सकता है। देरी (), मिलिस (), और माइक्रो () जैसे कार्यों द्वारा उपयोग किया जाता है। इसके संशोधन की अनुशंसा नहीं की जाती है ताकि कार्यक्रमों में परिवर्तन न हो।
- समय ०: टाइमर 0 के बराबर। यूएनओ में सर्वो लाइब्रेरी द्वारा उपयोग किया जाता है (मेगा के लिए टाइमर 5)।
- समय ०: 16-बिट, और 0 से 65.525 (65.536 संभावित मान) तक हो सकता है। टोन () फ़ंक्शन के लिए उपयोग किया जाता है, यदि उपयोग नहीं किया जाता है, तो इसे आपके एप्लिकेशन के लिए स्वतंत्र रूप से उपयोग किया जा सकता है।
- टाइमर 3, 4, 5 (केवल Arduino MEGA पर): सभी 16-बिट।
Arduino टाइमर कैसे काम करता है?
को एक Arduino टाइमर के साथ काम करें, यह जानना महत्वपूर्ण है कि यह सब इस विकास बोर्ड के एमसीयू में इलेक्ट्रॉनिक रूप से कैसे काम करता है:
- घड़ी की आवृत्ति: प्रति सेकंड चक्रों की संख्या है कि यह विकसित करने में सक्षम है, Arduino के मामले में यह 16 मेगाहर्ट्ज है, या क्या समान है, घड़ी संकेत एक सेकंड (चक्र) में 16.000.000 बार दोलन करता है।
- अवधि: टी द्वारा दर्शाया गया है, और सेकंड में मापा जाता है, और चक्रों का उलटा होता है। उदाहरण के लिए, T=1/C, जिसके परिणामस्वरूप 1/16000000 = 0.0000000625 होगा, प्रत्येक चक्र को पूरा होने में लगने वाला समय। और आवृत्ति आवर्त का विलोम है, इसलिए f = 1/T।
- चक्र: समय की प्रति इकाई होने वाले सिग्नल के दोहराव में से प्रत्येक है। Arduino पर यह एक सेकंड में 16M होगा। या क्या ऐसा ही है, इस मामले में जब 16 मिलियन चक्र बीत चुके हैं, एक सेकंड बीत चुका है। इसलिए, एक चक्र को 625 ns लेने के लिए कहा जा सकता है।
- सिग्नल का किनारा: घड़ी के संकेत वर्गाकार होते हैं, और किनारे ऊपर या नीचे हो सकते हैं। एक किनारा सिग्नल की सीधी रेखा है जब यह बदलता है:
- 0 (निम्न) से 1 (उच्च): बढ़ती बढ़त।
- 1 (उच्च) से 0 (निम्न): गिरने वाला किनारा।
किनारे महत्वपूर्ण हैं क्योंकि Arduino टाइमर सिग्नल किनारों से चक्र को मापते हैं। ए) हाँ एल कोंटाडोर यह प्रत्येक चक्र के साथ बढ़ता है और जब यह रजिस्टर मूल्य तक पहुँच जाता है, तो व्यवधान निष्पादित हो जाता है।
इसलिए, एक बार जब आप यह जान लेते हैं, यदि आपके पास है Arduino MCU पर 16 मेगाहर्ट्ज, और एक 8-बिट टाइमर का उपयोग किया जाता है, यह कहा जा सकता है कि हर 16 μs (256/16000000) या 4-बिट (16/65536) के लिए 16000000 ms में व्यवधान उत्पन्न होगा। इसलिए, यदि आप 16-बिट काउंटर रजिस्टर को 65535 के मान के साथ अधिकतम पर सेट करते हैं, तो जो भी कार्य है उसे निष्पादित करने के लिए 4 एमएस पर बाधा उत्पन्न होगी।
जब काउंटर अधिकतम संभव मूल्य तक पहुँच जाता है, यह फिर से 0 पर वापस आ जाएगा. यानी एक अतिप्रवाह होता है और यह शुरुआत से ही वापस गिना जाएगा।
टाइमर की वृद्धि दर को नियंत्रित करने के लिए आप इसका उपयोग भी कर सकते हैं एक प्रीस्कूलर, जो मान 1, 8, 64, 256 और 1024 लेता है और समय को इस तरह बदल देता है:
टाइमर स्पीड (Hz) = Arduino / Prescaler . की घड़ी की आवृत्ति
यदि यह 1 प्रीस्केलर है तो नियंत्रक 16 मेगाहर्ट्ज तक बढ़ जाएगा, यदि यह 8 से 2 मेगाहर्ट्ज है, यदि यह 64 से 250 किलोहर्ट्ज़ है, और इसी तरह। याद रखें कि काउंटर और प्रीस्केलर के मूल्य की तुलना करने के लिए एक टाइमर काउंटर स्टेट तुलनित्र होगा जब तक कि वे बराबर न हों और फिर एक क्रिया निष्पादित करें। इसलिए, इंटरप्ट आवृत्ति सूत्र द्वारा दिया गया है:
इंटरप्ट स्पीड (Hz) = Arduino / Prescaler क्लॉक फ़्रीक्वेंसी (तुलनित्र रजिस्टर मान + 1)
सौभाग्य से, हमें नहीं करना चाहिए रिकॉर्ड संशोधित करें Arduino Timers की, क्योंकि यह उन पुस्तकालयों द्वारा ध्यान रखा जाएगा जिनका उपयोग हम कोड में करते हैं। लेकिन अगर उनका उपयोग नहीं किया जाता है, तो उन्हें कॉन्फ़िगर किया जाना चाहिए।
Arduino IDE में उदाहरण
इस सब को थोड़ा बेहतर ढंग से समझने के लिए, यहाँ मैं Arduino IDE के लिए दो स्केच कोड दिखा रहा हूँ जिसके साथ आप टाइमर के उपयोग का अनुभव प्राप्त कर सकते हैं। पहला कोड है जो हर सेकंड Arduino pin 8 से जुड़ी एक LED को झपकाएगा:
#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 }
एलईडी के ब्लिंकिंग या फ्लैशिंग को प्रोग्राम करें, जैसा कि पिछले मामले में हर सेकेंड में होता है, लेकिन इस बार का उपयोग कर सीटीसी यानी तुलना:
#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 }
Arduino प्रोग्रामिंग के बारे में अधिक जानकारी
एक प्लेट खरीदें Arduino UNO रेव 3