اردوينو Timer: العب مع التوقيت في مشاريعك

عداد Arduino UNO

منذ بعض الوقت نشرنا المزيد من المعلومات حول مللي () وظيفة de اردوينوالآن سوف نتعمق أكثر في اردوينو الموقت، لبدء استخدام هذه الميزة للميزة ، افهم كيف تدير هذه اللوحة الوقت مع MCU ، بالإضافة إلى الوظائف الأخرى التي تتجاوز الميلي ().

ما هو مؤقت اردوينو؟

توقيت اردوينو

El اردوينو أو مؤقت، هي وظيفة تنفذها الأجهزة (في المتحكم الدقيق ، بمساعدة بلورة الكوارتز التي تولد نبضات الساعة وتضبط "الإيقاع" ، دون الحاجة إلى أجهزة خارجية أو دوائر متكاملة 555) تسمح بالتحكم في الأحداث المؤقتة بفضل الساعات داخلي. على سبيل المثال ، إجراء مهمة ما على فترات زمنية ، وإجراء قياسات زمنية دقيقة ، وما إلى ذلك ، بشكل مستقل عن رمز الرسم التخطيطي.

كومو Arduino UNO يحتوي على شريحة MCU تعمل بسرعة 16 ميجا هرتز ، ويمكن تنفيذ 16.000.000 كل ثانية. تحتاج التعليمات إلى تنفيذ دورات X ، وليس جميعها يتم تنفيذها في نفس دورات الساعة ، على سبيل المثال ، تحتاج الدورات ذات 16 بت إلى مزيد من الدورات في بنية AVR هذه.

تخيل أنك تستخدم ملف وظيفة تأخير ()، سيؤدي هذا إلى حظر التنفيذ على Arduino MCU حتى انقضاء الوقت المحدد ثم متابعة البرنامج ، لكن لن يتم حظر المؤقت. سيكون الوقت مناسبًا حيث تستمر MCU في تنفيذ التعليمات الأخرى في وقت واحد. هذه هي الميزة العظيمة.

الموقت مرتبط بـ الانقطاعات من Arduino ، حيث سيتم تنفيذها من خلالهم للقيام ببعض المهام المحددة. بمعنى آخر ، يعد Arduino Timer وظيفة يتم تشغيلها في وقت معين ، حيث تقوم بتنفيذ وظيفة مقاطعة. هذا هو السبب في أنه من المهم أيضًا معرفة هذه الانقطاعات.

مودوس

مؤقت اردوينو له 2 أوضاع تشغيل، القدرة على استخدامه في:

  • إشارة PWM: يمكنك التحكم في ملف دبابيس اردوينو (~).
  • CTC (مسح المؤقت عند مقارنة المطابقة): يحسب الوقت داخل عداد وعندما يصل إلى القيمة المحددة في سجل العدادات ، يتم تنفيذ المقاطعة.

كم عدد الموقتات لديها؟ أنواع الموقتات

Arduino UNO وظائف ميلي

هناك 3 مؤقت على الأطباق Arduino UNO، على الرغم من أنه قد يكون هناك المزيد في اللوحات العلوية الأخرى:

  • المؤقت 0: 8 بت ، يمكن العد من 0 إلى 255 (256 قيمة ممكنة). تُستخدم بواسطة دالات مثل delay () و millis () و micros (). لا ينصح بتعديله حتى لا يغير البرامج.
  • المؤقت 1: يساوي Timer 0. تستخدمه مكتبة المؤازرة في UNO (Timer 5 for MEGA).
  • المؤقت 2: 16 بت ، ويمكن أن تتراوح من 0 إلى 65.525 (65.536 قيمة ممكنة). تستخدم لوظيفة النغمة () ، إذا لم يتم استخدامها ، فيمكن استخدامها بحرية لتطبيقك.
  • المؤقت 3 ، 4 ، 5 (فقط على Arduino MEGA): كل ​​16 بت.

كيف يعمل Arduino Timer؟

الموقتات ، الموقتات

إلى العمل مع Arduino Timer، من الأهمية بمكان معرفة كيفية عمل كل هذا إلكترونيًا في MCU في لوحة التطوير هذه:

  • تردد الساعة: هو عدد الدورات في الثانية التي يمكن تطويرها ، في حالة Arduino تبلغ 16 ميجاهرتز ، أو ما هو نفسه ، تتأرجح إشارة الساعة 16.000.000 مرة في الثانية (الدورات).
  • فترة: يمثله حرف T ويقاس بالثواني وهو معكوس الدورات. على سبيل المثال ، T = 1 / C ، والذي سينتج عنه 1/16000000 = 0.0000000625 ، الوقت الذي تستغرقه كل دورة حتى تكتمل. والتردد هو معكوس الدورة ، لذا f = 1 / T.
  • دورة: هي كل تكرار للإشارة تحدث لكل وحدة زمنية. على اردوينو سيكون 16 ميغا في الثانية. أو ما هو نفسه ، في هذه الحالة ، عندما تمر 16 مليون دورة ، تكون ثانية واحدة قد مرت. لذلك ، يمكن القول إن دورة واحدة تستغرق 625 نانوثانية.
  • حافة الإشارة: إشارات الساعة مربعة ، ويمكن أن ترتفع أو تنخفض الحواف. الحافة هي الخط المستقيم للإشارة عندما تتغير من:
    • من 0 (منخفض) إلى 1 (مرتفع): حافة صاعدة.
    • 1 (مرتفع) إلى 0 (منخفض): حافة هبوط.

تعتبر الحواف مهمة لأن مؤقتات Arduino تقيس الدورات من حواف الإشارة. أ) نعم الكونتادور تتزايد مع كل دورة وعندما تصل إلى قيمة التسجيل ، يتم تنفيذ المقاطعة.

لذلك ، بمجرد أن تعرف هذا ، إذا كان لديك 16 ميجا هرتز على Arduino MCU، ويتم استخدام مؤقت 8 بت ، يمكن القول أن المقاطعات ستحدث كل 16 ميكرو ثانية (256/16000000) أو 4 مللي ثانية لـ 16 بت (65536/16000000). لذلك ، إذا قمت بتعيين سجل عداد 16 بت على الحد الأقصى ، بقيمة 65535 ، فستحدث المقاطعة عند 4 مللي ثانية لتنفيذ أي مهمة.

عندما يصل العداد إلى أقصى قيمة ممكنة ، سيعود إلى 0 مرة أخرى. وهذا يعني حدوث فائض وسيعود إلى الوراء من البداية.

للتحكم في معدل زيادة عداد الوقت ، يمكنك أيضًا استخدامه جهاز قياس الوزن، والتي تأخذ القيم 1 و 8 و 64 و 256 و 1024 وتغير التوقيت على النحو التالي:

سرعة الموقت (هرتز) = تردد ساعة Arduino / Prescaler

إذا كان 1 ، فإن جهاز التحكم المسبق سيزيد إلى 16 ميجا هرتز ، إذا كان 8 إلى 2 ميجا هرتز ، إذا كان 64 إلى 250 كيلو هرتز ، وهكذا. تذكر أنه سيكون هناك عداد مقارنة لحالة عداد المؤقت لمقارنة قيمة العداد والمقياس المسبق حتى يتساوى ثم تنفيذ إجراء ما. وبالتالي، تردد المقاطعة من خلال الصيغة:

+1 هو أن سجل العداد مفهرس عند 0 ، أي أنه لا يبدأ بالعد عند 1 ، ولكن عند 0.

سرعة المقاطعة (هرتز) = تردد ساعة Arduino / Prescaler (قيمة تسجيل المقارنة + 1)

لحسن الحظ ، يجب ألا نفعل ذلك تعديل السجلات من Arduino Timers ، حيث سيتم الاعتناء بها من قبل المكتبات التي نستخدمها في الكود. ولكن إذا لم يتم استخدامها ، فيجب تكوينها.

أمثلة في Arduino IDE

اردوينو IDE ، أنواع البيانات ، البرمجة

من أجل فهم كل هذا بشكل أفضل قليلاً ، أعرض هنا رمزين تخطيطيين لـ Arduino IDE يمكنك من خلالهما تجربة استخدام أجهزة ضبط الوقت. الأول هو الكود الذي سيومض مؤشر LED متصل بـ Arduino pin 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
}

قم ببرمجة وميض أو وميض 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. تخزين البيانات: قاعدة البيانات التي تستضيفها شركة Occentus Networks (الاتحاد الأوروبي)
  6. الحقوق: يمكنك في أي وقت تقييد معلوماتك واستعادتها وحذفها.