منذ بعض الوقت نشرنا المزيد من المعلومات حول مللي () وظيفة de اردوينوالآن سوف نتعمق أكثر في اردوينو الموقت، لبدء استخدام هذه الميزة للميزة ، افهم كيف تدير هذه اللوحة الوقت مع MCU ، بالإضافة إلى الوظائف الأخرى التي تتجاوز الميلي ().
ما هو مؤقت اردوينو؟
El اردوينو أو مؤقت، هي وظيفة تنفذها الأجهزة (في المتحكم الدقيق ، بمساعدة بلورة الكوارتز التي تولد نبضات الساعة وتضبط "الإيقاع" ، دون الحاجة إلى أجهزة خارجية أو دوائر متكاملة 555) تسمح بالتحكم في الأحداث المؤقتة بفضل الساعات داخلي. على سبيل المثال ، إجراء مهمة ما على فترات زمنية ، وإجراء قياسات زمنية دقيقة ، وما إلى ذلك ، بشكل مستقل عن رمز الرسم التخطيطي.
تخيل أنك تستخدم ملف وظيفة تأخير ()، سيؤدي هذا إلى حظر التنفيذ على Arduino MCU حتى انقضاء الوقت المحدد ثم متابعة البرنامج ، لكن لن يتم حظر المؤقت. سيكون الوقت مناسبًا حيث تستمر MCU في تنفيذ التعليمات الأخرى في وقت واحد. هذه هي الميزة العظيمة.
الموقت مرتبط بـ الانقطاعات من Arduino ، حيث سيتم تنفيذها من خلالهم للقيام ببعض المهام المحددة. بمعنى آخر ، يعد Arduino Timer وظيفة يتم تشغيلها في وقت معين ، حيث تقوم بتنفيذ وظيفة مقاطعة. هذا هو السبب في أنه من المهم أيضًا معرفة هذه الانقطاعات.
مودوس
مؤقت اردوينو له 2 أوضاع تشغيل، القدرة على استخدامه في:
- إشارة PWM: يمكنك التحكم في ملف دبابيس اردوينو (~).
- CTC (مسح المؤقت عند مقارنة المطابقة): يحسب الوقت داخل عداد وعندما يصل إلى القيمة المحددة في سجل العدادات ، يتم تنفيذ المقاطعة.
كم عدد الموقتات لديها؟ أنواع الموقتات
هناك 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 كيلو هرتز ، وهكذا. تذكر أنه سيكون هناك عداد مقارنة لحالة عداد المؤقت لمقارنة قيمة العداد والمقياس المسبق حتى يتساوى ثم تنفيذ إجراء ما. وبالتالي، تردد المقاطعة من خلال الصيغة:
سرعة المقاطعة (هرتز) = تردد ساعة Arduino / Prescaler (قيمة تسجيل المقارنة + 1)
لحسن الحظ ، يجب ألا نفعل ذلك تعديل السجلات من Arduino Timers ، حيث سيتم الاعتناء بها من قبل المكتبات التي نستخدمها في الكود. ولكن إذا لم يتم استخدامها ، فيجب تكوينها.
أمثلة في Arduino 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 UNO القس 3