अर्डुइनो टाइमर: आपल्या प्रकल्पांमध्ये वेळेसह खेळा

टायमर Arduino UNO

काही काळापूर्वी आम्ही याबद्दल अधिक माहिती प्रकाशित केली millis() फंक्शन de Arduinoआता आपण सखोल अभ्यास करू अर्डिनो टाइमर, वैशिष्ट्यासाठी या वैशिष्ट्यासह प्रारंभ करण्यासाठी, हे बोर्ड MCU सह वेळ कसे व्यवस्थापित करते ते समजून घ्या, तसेच millis() च्या पलीकडे इतर कार्ये.

Arduino टाइमर काय आहे?

arduino टाइमर

El Arduino टाइमर, किंवा टाइमर, हे हार्डवेअरद्वारे अंमलात आणलेले कार्य आहे (मायक्रोकंट्रोलरमध्ये, क्वार्ट्ज क्रिस्टलच्या मदतीने जे घड्याळाची नाडी तयार करते आणि "लय" सेट करते, बाह्य हार्डवेअर किंवा ICs 555 ची गरज न ठेवता) जे घड्याळांमुळे तात्पुरत्या घटना नियंत्रित करण्यास अनुमती देते. अंतर्गत उदाहरणार्थ, स्केच कोडपासून स्वतंत्रपणे एखादे कार्य अंतराने घडवून आणणे, वेळेचे अचूक मोजमाप करणे इ.

कसे Arduino UNO यात एक MCU चिप आहे जी 16 Mhz वर कार्य करते, 16.000.000 प्रत्येक सेकंदाला कार्यान्वित केली जाऊ शकते. निर्देशांना कार्यान्वित करण्यासाठी X चक्रांची आवश्यकता आहे, ते सर्व एकाच घड्याळ चक्रात चालत नाहीत, उदाहरणार्थ, 16-बिटला या AVR आर्किटेक्चरमध्ये अधिक चक्रांची आवश्यकता आहे.

कल्पना करा की तुम्ही वापरता delay() फंक्शन, हे निर्दिष्ट वेळ संपेपर्यंत Arduino MCU वर अंमलबजावणी अवरोधित करेल आणि नंतर प्रोग्रामसह सुरू ठेवेल, परंतु टाइमर अवरोधित करणार नाही. MCU एकाच वेळी इतर सूचनांची अंमलबजावणी करत राहिल्याने ही वेळ असेल. हाच मोठा फायदा आहे.

टाइमर संबंधित आहे व्यत्यय Arduino च्या, कारण त्यांना काही विशिष्ट कार्यासाठी उपस्थित राहण्यासाठी त्यांच्याद्वारे कार्यान्वित केले जाईल. दुसऱ्या शब्दांत, Arduino Timer हे एक फंक्शन आहे जे एका विशिष्ट वेळी ट्रिगर केले जाते, एक व्यत्यय फंक्शन कार्यान्वित करते. म्हणूनच या व्यत्ययांबद्दल जाणून घेणे देखील महत्त्वाचे आहे.

मोड

Arduino Timer आहे 2 ऑपरेटिंग मोड, ते यामध्ये वापरण्यास सक्षम आहे:

  • PWM सिग्नल: आपण नियंत्रित करू शकता अर्डिनो पिन (~).
  • CTC (तुलना सामन्यावर क्लियर टाइमर): काउंटरमधील वेळ मोजतो आणि जेव्हा ते टाइमरच्या रजिस्टरमध्ये निर्दिष्ट केलेल्या मूल्यापर्यंत पोहोचते तेव्हा व्यत्यय अंमलात आणला जातो.

त्यात किती टाइमर आहेत? टाइमरचे प्रकार

Arduino UNO मिली फंक्शन्स

आहेत 3 टायमर प्लेट्स वर Arduino UNO, जरी इतर शीर्ष प्लेट्सवर अधिक असू शकतात:

  • टाइमर 0: 8-बिट, 0 ते 255 (256 संभाव्य मूल्ये) पर्यंत मोजू शकतात. delay(), millis(), आणि micros() सारख्या फंक्शन्सद्वारे वापरले जाते. प्रोग्राम्समध्ये बदल होऊ नये म्हणून त्यात बदल करण्याची शिफारस केलेली नाही.
  • टाइमर 1: टाइमर 0 च्या समान. UNO मधील सर्वो लायब्ररीद्वारे वापरले जाते (MEGA साठी टाइमर 5).
  • टाइमर 2: 16-बिट, आणि 0 ते 65.525 (65.536 संभाव्य मूल्ये) पर्यंत असू शकतात. टोन() फंक्शनसाठी वापरले जाते, वापरलेले नसल्यास, ते तुमच्या अनुप्रयोगासाठी मुक्तपणे वापरले जाऊ शकते.
  • टाइमर 3, 4, 5 (केवळ Arduino MEGA वर): सर्व 16-बिट.

Arduino टाइमर कसे कार्य करते?

टाइमर, टाइमर

सक्षम होण्यासाठी Arduino टाइमरसह कार्य कराया विकास मंडळाच्या MCU मध्ये हे सर्व इलेक्ट्रॉनिक पद्धतीने कसे कार्य करते हे जाणून घेणे अत्यावश्यक आहे:

  • घड्याळाची वारंवारता: प्रति सेकंद सायकलची संख्या आहे जी ते विकसित करण्यास सक्षम आहे, Arduino च्या बाबतीत ते 16 Mhz आहे, किंवा काय समान आहे, घड्याळ सिग्नल एका सेकंदात (चक्र) 16.000.000 वेळा oscillates.
  • कालावधी: T द्वारे दर्शविले जाते, आणि सेकंदात मोजले जाते आणि हे चक्रांचे व्यस्त आहे. उदाहरणार्थ, T=1/C, ज्याचा परिणाम 1/16000000 = 0.0000000625 होईल, प्रत्येक चक्र पूर्ण होण्यासाठी लागणारा वेळ. आणि वारंवारता कालावधीचा व्यस्त आहे, म्हणून f = 1/T.
  • सायकल: वेळेच्या प्रति युनिटमध्ये होणार्‍या सिग्नलच्या पुनरावृत्तींपैकी प्रत्येक आहे. Arduino वर ते एका सेकंदात 16M असेल. किंवा समान काय आहे, या प्रकरणात, जेव्हा 16 दशलक्ष चक्र निघून गेले, तेव्हा एक सेकंद निघून गेला. म्हणून, एक सायकल 625 एनएस घेते असे म्हणता येईल.
  • सिग्नलची किनार: घड्याळाचे संकेत चौरस असतात आणि कडा वरती किंवा घसरत असू शकतात. धार ही सिग्नलची सरळ रेषा असते जेव्हा ती येथून बदलते:
    • 0 (कमी) ते 1 (उच्च): वाढणारी किनार.
    • 1 (उच्च) ते 0 (कमी): पडणारी किनार.

कडा महत्वाच्या आहेत कारण Arduino टाइमर सिग्नल कडा पासून सायकल मोजतात. अ) होय कॉन्टॅडोर ते प्रत्येक चक्रासह वाढते आणि जेव्हा ते नोंदणी मूल्यापर्यंत पोहोचते, तेव्हा व्यत्यय कार्यान्वित केला जातो.

म्हणून, एकदा तुम्हाला हे कळले की, तुमच्याकडे असल्यास Arduino MCU वर 16Mhz, आणि 8-बिट टायमर वापरला जातो, असे म्हटले जाऊ शकते की 16-बिट (256/16000000) साठी प्रत्येक 4 μs (16/65536) किंवा 16000000 ms मध्ये व्यत्यय येईल. म्हणून, जर तुम्ही 16 मूल्यासह 65535-बिट काउंटर रजिस्टर जास्तीत जास्त सेट केले, तर कोणतेही कार्य पूर्ण करण्यासाठी इंटरप्ट 4 ms वाजता येईल.

जेव्हा काउंटर जास्तीत जास्त संभाव्य मूल्यापर्यंत पोहोचतो, ते पुन्हा 0 वर येईल. म्हणजेच, ओव्हरफ्लो होतो आणि तो सुरुवातीपासून परत मोजला जाईल.

टाइमरच्या वाढीचा दर नियंत्रित करण्यासाठी तुम्ही देखील वापरू शकता एक prescaler, जे 1, 8, 64, 256 आणि 1024 मूल्ये घेते आणि याप्रमाणे वेळ बदलते:

टाइमर स्पीड (Hz) = Arduino / Prescaler ची घड्याळ वारंवारता

जर ते 1 प्रीस्केलर असेल तर कंट्रोलर 16 मेगाहर्ट्झपर्यंत वाढेल, जर ते 8 ते 2 मेगाहर्ट्झ असेल, जर ते 64 ते 250 kHz असेल, आणि असेच. लक्षात ठेवा की काउंटर आणि प्रीस्केलरच्या मूल्याची तुलना करण्यासाठी एक टाइमर काउंटर स्टेट कंपॅरेटर असेल जोपर्यंत ते समान होत नाहीत आणि नंतर एक क्रिया करा. तर, व्यत्यय वारंवारता सूत्राद्वारे दिले जाते:

+1 असे आहे कारण काउंटर रजिस्टर 0 वर अनुक्रमित केले आहे, म्हणजेच ते 1 वर मोजणे सुरू होत नाही, परंतु 0 वर होते.

इंटरप्ट स्पीड (Hz) = Arduino / Prescaler घड्याळ वारंवारता (तुलनाक नोंदणी मूल्य + 1)

सुदैवाने, आम्ही करू नये रेकॉर्ड सुधारित करा Arduino टाइमर, कारण आम्ही कोडमध्ये वापरत असलेल्या लायब्ररीद्वारे त्याची काळजी घेतली जाईल. परंतु जर ते वापरले गेले नाहीत तर ते कॉन्फिगर केले पाहिजेत.

Arduino IDE मधील उदाहरणे

Arduino IDE, डेटा प्रकार, प्रोग्रामिंग

हे सर्व थोडे अधिक चांगल्या प्रकारे समजून घेण्यासाठी, मी येथे Arduino IDE साठी दोन स्केच कोड दाखवतो ज्याद्वारे तुम्ही टाइमर वापरण्याचा अनुभव घेऊ शकता. पहिला कोड आहे जो प्रत्येक सेकंदाला Arduino पिन 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
}

LED च्या ब्लिंकिंग किंवा फ्लॅशिंग प्रोग्राम करा, मागील केस प्रमाणे प्रत्येक सेकंदात, परंतु यावेळी वापरून CTC म्हणजेच तुलना:

#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

टिप्पणी करणारे सर्वप्रथम व्हा

आपली टिप्पणी द्या

आपला ई-मेल पत्ता प्रकाशित केला जाणार नाही. आवश्यक फील्ड चिन्हांकित केले आहेत *

*

*

  1. डेटा जबाबदार: मिगुएल Áन्गल गॅटन
  2. डेटाचा उद्देशः नियंत्रण स्पॅम, टिप्पणी व्यवस्थापन.
  3. कायदे: आपली संमती
  4. डेटा संप्रेषण: कायदेशीर बंधन वगळता डेटा तृतीय पक्षास कळविला जाणार नाही.
  5. डेटा संग्रहण: ओकेन्टस नेटवर्क (EU) द्वारा होस्ट केलेला डेटाबेस
  6. अधिकारः कोणत्याही वेळी आपण आपली माहिती मर्यादित, पुनर्प्राप्त आणि हटवू शकता.