- ما هو TIMER في الإلكترونيات المدمجة؟
- تسجيلات عداد اردوينو
- المقاطعات اردوينو الموقت
- المكونات مطلوبة
- مخطط الرسم البياني
- برمجة Arduino UNO Timers
تم تطوير Arduino Development Platform في الأصل في عام 2005 كجهاز قابل للبرمجة سهل الاستخدام لمشاريع التصميم الفني. كانت نيته مساعدة غير المهندسين على العمل مع الإلكترونيات الأساسية والميكروكونترولر دون الكثير من المعرفة البرمجية. ولكن بعد ذلك ، نظرًا لطبيعته سهلة الاستخدام ، سرعان ما تم تكييفه من قبل مبتدئين في مجال الإلكترونيات والهواة في جميع أنحاء العالم ، واليوم يفضل تطوير النماذج الأولية وتطويرات POC.
في حين أنه من المقبول أن تبدأ مع Arduino ، فمن المهم الانتقال ببطء إلى وحدات التحكم الدقيقة الأساسية مثل AVR و ARM و PIC و STM وغيرها وبرمجتها باستخدام تطبيقاتها الأصلية. هذا لأن لغة برمجة Arduino سهلة الفهم لأن معظم العمل يتم من خلال وظائف سابقة الإنشاء مثل digitalWrite () و AnalogWrite () و Delay () وما إلى ذلك بينما يتم إخفاء لغة الآلة ذات المستوى المنخفض خلفها. لا تشبه برامج Arduino برامج الترميز C المضمنة الأخرى حيث نتعامل مع وحدات البت المسجلة ونجعلها مرتفعة أو منخفضة بناءً على منطق برنامجنا.
مؤقتات اردوينو بدون تأخير:
ومن ثم ، لفهم ما يحدث داخل الوظائف المبنية مسبقًا ، نحتاج إلى الحفر وراء هذه المصطلحات. على سبيل المثال ، عند استخدام وظيفة delay () ، فإنها تقوم فعليًا بتعيين بتات Timer و Counter Register لوحدة التحكم الدقيقة ATmega.
في هذا البرنامج التعليمي الخاص بمؤقت اردوينو ، سنتجنب استخدام وظيفة delay () هذه ، وبدلاً من ذلك نتعامل بالفعل مع المسجلات نفسها. الشيء الجيد هو أنه يمكنك استخدام نفس Arduino IDE لهذا الغرض. سنقوم بتعيين بتات تسجيل Timer الخاصة بنا واستخدام Timer Overflow Interrupt لتبديل مؤشر LED في كل مرة تحدث فيها المقاطعة. يمكن أيضًا ضبط قيمة أداة التحميل المسبق لبت المؤقت باستخدام الأزرار الانضغاطية للتحكم في المدة التي تحدث فيها المقاطعة.
ما هو TIMER في الإلكترونيات المدمجة؟
الموقت نوع من المقاطعة. إنها مثل ساعة بسيطة يمكنها قياس الفاصل الزمني لحدث ما. يحتوي كل متحكم دقيق على ساعة (مذبذب) ، على سبيل المثال في Arduino Uno تبلغ 16 ميجا هرتز. هذا هو المسؤول عن السرعة. سيكون تردد الساعة الأعلى هو سرعة المعالجة. يستخدم المؤقت عدادًا يتم حسابه بسرعة معينة اعتمادًا على تردد الساعة. في Arduino Uno ، يستغرق الأمر 1/16000000 ثانية أو 62 نانو ثانية لإحصاء واحد. المعنى ينتقل Arduino من تعليمة إلى أخرى لكل 62 نانو ثانية.
الموقتات في Arduino UNO:
يوجد في Arduino UNO ثلاثة موقتات تستخدم لوظائف مختلفة.
الموقت 0:
إنه مؤقت 8 بت ويستخدم في وظيفة المؤقت مثل التأخير () ، ميلي ().
المؤقت 1:
إنه مؤقت 16 بت ويستخدم في مكتبة المؤازرة.
الموقت 2:
إنه مؤقت 8 بت ويستخدم في وظيفة النغمة ().
تسجيلات عداد اردوينو
لتغيير تكوين العدادات ، يتم استخدام سجلات المؤقت.
1. المؤقت / سجلات التحكم في العداد (TCCRnA / B):
يحتوي هذا السجل على وحدات التحكم الرئيسية بالمؤقت ويستخدم للتحكم في أجهزة القياس المسبقة للموقت. كما يسمح بالتحكم في وضع المؤقت باستخدام وحدات بت WGM.
تنسيق الإطار:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
بريسكالر:
تحدد بتات CS12 و CS11 و CS10 في TCCR1B قيمة المقياس المسبق. يتم استخدام المقياس المسبق لإعداد سرعة ساعة المؤقت. يحتوي Arduino Uno على أجهزة قياس أولية من 1 ، 8 ، 64 ، 256 ، 1024.
CS12 | CS11 | CS10 | استعمال |
0 | 0 | 0 | لا يوجد توقف مؤقت الساعة |
0 | 0 | 1 | CLCK i / o / 1 بدون ترسبات مسبقة |
0 | 1 | 0 | CLK i / o / 8 (من Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (من Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (من Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (من Prescaler) |
1 | 1 | 0 | مصدر ساعة خارجي على T1 Pin. الساعة على حافة السقوط |
1 | 1 | 1 | مصدر الساعة الخارجية على دبوس T1. الساعة على الحافة الصاعدة. |
2. المؤقت / سجل العداد (TCNTn)
يستخدم هذا السجل للتحكم في قيمة العداد وتعيين قيمة أداة التحميل المسبق.
معادلة قيمة أداة التحميل المسبق للوقت المطلوب بالثانية:
TCNTn = 65535 - (16x10 10 xTime in sec / قيمة Prescaler)
لحساب قيمة أداة التحميل المسبق لـ timer1 لوقت 2 ثانية:
TCNT1 = 65535 - (16 × 10 10 × 2/1024) = 34285
المقاطعات اردوينو الموقت
لقد تعلمنا سابقًا عن مقاطعات Arduino ورأينا أن مقاطعات Timer هي نوع من مقاطعات البرامج. هناك العديد من مقاطعات المؤقت في Arduino موضحة أدناه.مؤقت تجاوز سعة المقاطعة:
عندما يصل المؤقت إلى قيمته القصوى ، قل على سبيل المثال (16 Bit-65535) ، تحدث مقاطعة Timer Overflow . لذلك ، يتم استدعاء روتين خدمة مقاطعة ISR عند تمكين بت Timer Overflow Interrupt في TOIEx الموجود في سجل قناع مقاطعة المؤقت TIMSKx.
تنسيق ISR:
ISR (TIMERx_OVF_vect) { }
إخراج مقارنة التسجيل (OCRnA / B):
هنا عند حدوث مقاطعة مطابقة مقارنة الإخراج ، يتم استدعاء خدمة المقاطعة ISR (TIMERx_COMPy_vect) وسيتم أيضًا تعيين بت علم OCFxy في سجل TIFRx. يتم تمكين ISR هذا عن طريق إعداد بت تمكين في OCIExy الموجود في سجل TIMSKx. حيث يكون TIMSKx هو Timer Interrupt Mask ، سجل.
الموقت التقاط الإدخال:
بعد ذلك ، عندما يحدث المقاطعة الخاصة بالمؤقت ، يتم استدعاء خدمة المقاطعة ISR (TIMERx_CAPT_vect) وسيتم أيضًا تعيين بت علم ICFx في TIFRx (Timer Interrupt Flag Register). يتم تمكين ISR هذا عن طريق تعيين بت التمكين في ICIEx الموجود في سجل TIMSKx.
المكونات مطلوبة
- اردوينو UNO
- أزرار الضغط (2)
- LED (أي لون)
- 10 كيلو المقاوم (2) ، 2.2 كيلو (1)
- شاشة LCD مقاس 16 × 2
مخطط الرسم البياني
توصيلات الدائرة بين Arduino UNO وشاشة LCD مقاس 16x2:
16x2 LCD |
اردوينو UNO |
VSS |
GND |
VDD |
+ 5 فولت |
V0 |
إلى دبوس مركز مقياس الجهد للتحكم في التباين في شاشة LCD |
RS |
8 |
RW |
GND |
ه |
9 |
د 4 |
10 |
د 5 |
11 |
د 6 |
12 |
د 7 |
13 |
أ |
+ 5 فولت |
ك |
GND |
اثنين من أزرار دفع ترتبط مع المنسدلة المقاومات من 10K مع دبابيس اردوينو 2 و 4 و توصيل LED لPIN 7 من اردوينو من خلال المقاوم 2.2K.
سيبدو الإعداد مثل الصورة أدناه.
برمجة Arduino UNO Timers
في هذا البرنامج التعليمي ، سنستخدم TIMER OVERFLOW INTERRUPT ونستخدمه في وميض LED ON و OFF لمدة معينة عن طريق ضبط قيمة أداة التحميل المسبق (TCNT1) باستخدام الأزرار الانضغاطية. يتم تقديم رمز كامل لـ Arduino Timer في النهاية. نحن هنا نوضح الكود سطرًا بسطر:
نظرًا لاستخدام شاشة LCD مقاس 16 × 2 في المشروع لعرض قيمة أداة التحميل المسبق ، يتم استخدام مكتبة الكريستال السائل.
#تضمن
يتم تعريف دبوس الأنود LED المتصل بـ Arduino pin 7 على أنه ledPin .
# تعريف ledPin 7
بعد ذلك ، يتم الإعلان عن الكائن للوصول إلى فئة الكريستال السائل مع دبابيس LCD (RS ، E ، D4 ، D5 ، D6 ، D7) المتصلة بـ Arduino UNO.
LiquidCrystal LCD (8،9،10،11،12،13) ؛
ثم قم بتعيين قيمة أداة التحميل المسبق 3035 لمدة 4 ثوانٍ. تحقق من الصيغة أعلاه لحساب قيمة أداة التحميل المسبق.
قيمة تعويم = 3035 ؛
بعد ذلك في الإعداد الباطل () ، اضبط أولاً شاشة LCD في وضع 16x2 واعرض رسالة ترحيب لبضع ثوان.
lcd.begin (16.2) ؛ lcd.setCursor (0،0) ؛ lcd.print ("ARDUINO TIMERS") ؛ تأخير (2000) ؛ lcd.clear () ؛
بعد ذلك ، قم بتعيين دبوس LED على أنه دبوس OUTPUT ويتم تعيين أزرار الضغط كدبابيس INPUT
pinMode (ledPin ، الإخراج) ؛ pinMode (2 ، الإدخال) ؛ pinMode (4 ، الإدخال) ؛
بعد ذلك ، قم بتعطيل جميع المقاطعات:
noInterrupts () ،
بعد ذلك تتم تهيئة Timer1.
TCCR1A = 0 ؛ TCCR1B = 0 ؛
تم ضبط قيمة مؤقت التحميل المسبق (مبدئيًا على 3035).
TCNT1 = القيمة ؛
ثم يتم تعيين قيمة قشارة ما قبل 1024 في سجل TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12) ؛
يتم تمكين مقاطعة تجاوز سعة Timer في سجل Timer Interrupt Mask بحيث يمكن استخدام ISR.
TIMSK1 - = (1 << TOIE1) ؛
أخيرًا ، تم تمكين جميع المقاطعات.
المقاطعات () ؛
اكتب الآن ISR لـ Timer Overflow Interrupt المسؤولة عن تشغيل وإيقاف تشغيل LED باستخدام digitalWrite . تتغير الحالة كلما حدثت مقاطعة تجاوز سعة المؤقت.
ISR (TIMER1_OVF_vect) { TCNT1 = القيمة ؛ digitalWrite (ledPin ، digitalRead (ledPin) ^ 1) ؛ }
في الحلقة الفارغة () ، يتم زيادة أو إنقاص قيمة أداة التحميل المسبق باستخدام إدخالات زر الضغط كما يتم عرض القيمة على شاشة LCD مقاس 16 × 2.
إذا (digitalRead (2) == HIGH) { القيمة = القيمة + 10 ؛ // Incement preload value } إذا كانت (digitalRead (4) == HIGH) { value = value-10 ؛ // Decrement preload value } lcd.setCursor (0،0) ؛ lcd.print (قيمة) ؛ }
هذه هي الطريقة التي يمكن بها استخدام المؤقت لإنتاج تأخير في برنامج Arduino. تحقق من الفيديو أدناه حيث أظهرنا التغيير في التأخير من خلال زيادة قيمة أداة التحميل المسبق وتقليلها باستخدام أزرار الضغط.