جدول المحتويات:

متحكم AVR. المصابيح المتوهجة باستخدام الموقت. الموقتات المقاطعات. وضع مؤقت CTC: 6 خطوات
متحكم AVR. المصابيح المتوهجة باستخدام الموقت. الموقتات المقاطعات. وضع مؤقت CTC: 6 خطوات

فيديو: متحكم AVR. المصابيح المتوهجة باستخدام الموقت. الموقتات المقاطعات. وضع مؤقت CTC: 6 خطوات

فيديو: متحكم AVR. المصابيح المتوهجة باستخدام الموقت. الموقتات المقاطعات. وضع مؤقت CTC: 6 خطوات
فيديو: Light Up the Sky: Create Your Own Multi-Pattern LED Drone Light System | ATtiny85 2024, شهر نوفمبر
Anonim
Image
Image

مرحبا بالجميع!

الموقتات مفهوم مهم في مجال الإلكترونيات. كل مكون إلكتروني يعمل على أساس زمني. تساعد هذه القاعدة الزمنية في الحفاظ على تزامن جميع الأعمال. تعمل جميع وحدات التحكم الدقيقة بتردد ساعة محدد مسبقًا ، ولديهم جميعًا توفيرًا لإعداد أجهزة ضبط الوقت. تفتخر AVR بوجود مؤقت دقيق للغاية وموثوق. يقدم الكثير من الميزات فيه ، مما يجعله موضوعًا واسعًا. أفضل جزء هو أن المؤقت مستقل تمامًا عن وحدة المعالجة المركزية. وبالتالي ، فهو يعمل بالتوازي مع وحدة المعالجة المركزية ولا يوجد تدخل من وحدة المعالجة المركزية ، مما يجعل الموقت دقيقًا تمامًا. في هذا القسم ، أشرح المفاهيم الأساسية لـ AVR Timers. أنا أكتب برنامجًا بسيطًا في كود C للتحكم في وميض LED ، باستخدام أجهزة ضبط الوقت.

الخطوة 1: الوصف

بيان المشكلة 1: لنبدأ وميض مؤشر LED الأول (أخضر) كل 50 مللي ثانية
بيان المشكلة 1: لنبدأ وميض مؤشر LED الأول (أخضر) كل 50 مللي ثانية

يوجد في ATMega328 ثلاثة أنواع من أجهزة ضبط الوقت:

Timer / Counter0 (TC0) - هو وحدة عداد / عداد 8 بت للأغراض العامة ، مع وحدتي OutputCompare مستقلتين ، ودعم PWM ؛

Timer / Counter1 (TC1) - تتيح وحدة المؤقت / العداد ذات 16 بت توقيت تنفيذ البرنامج بدقة (إدارة الأحداث) ، وتوليد الموجات ، وقياس توقيت الإشارة ؛

Timer / Counter2 (TC2) - هو غرض عام ، قناة ، وحدة عداد / عداد 8 بت مع PWM والتشغيل غير المتزامن ؛

الخطوة 2: بيان المشكلة 1: دعنا نضيء مؤشر LED الأول (أخضر) كل 50 مللي ثانية

بيان المشكلة 1: لنبدأ وميض مؤشر LED الأول (أخضر) كل 50 مللي ثانية
بيان المشكلة 1: لنبدأ وميض مؤشر LED الأول (أخضر) كل 50 مللي ثانية
بيان المشكلة 1: لنبدأ وميض مؤشر LED الأول (أخضر) كل 50 مللي ثانية
بيان المشكلة 1: لنبدأ وميض مؤشر LED الأول (أخضر) كل 50 مللي ثانية

المنهجية:

- استخدام جهاز القياس المسبق Timer0 لتقليل الإشارة الكهربائية عالية التردد إلى تردد أقل عن طريق القسمة الصحيحة ؛

- استخدام المقاطعة في كل مرة يفيض Timer0 ؛

Timer0 (8 بت) يحسب من 0 إلى 255 بعد ذلك ، يفيض ، هذه القيمة تتغير في كل نبضة على مدار الساعة.

F_CPU = 16 ميجا هرتز: فترة الساعة = 1000 مللي ثانية / 16000000 هرتز = 0.0000625 مللي ثانية

عدد المؤقت = (التأخير المطلوب / الفترة الزمنية على مدار الساعة) -1 = (50 مللي ثانية / 0.0000625 مللي ثانية) = 799999

لقد قطعت الساعة بالفعل 799999 مرة لإعطاء تأخير قدره 50 مللي ثانية فقط!

يمكننا استخدام تقنية تقسيم التردد تسمى التقسيم المسبق لتقليل عدد المؤقت. يوفر لنا AVR القيم التالية للمقياس المسبق للاختيار من بينها: 8 و 64 و 256 و 1024. انظر الجدول يلخص نتائج استخدام أجهزة قياس مسبقة مختلفة.

يجب أن تكون قيمة العداد عددًا صحيحًا دائمًا. دعونا نختار prescaler 256!

في معظم المتحكمات الدقيقة ، يوجد شيء يسمى المقاطعة. يمكن إطلاق هذه المقاطعة عند استيفاء شروط معينة. الآن عندما يتم تشغيل المقاطعة ، يتوقف AVR ويحفظ تنفيذها للروتين الرئيسي ، ويحضر مكالمة المقاطعة (عن طريق تنفيذ روتين خاص ، يسمى Interrupt Service Routine ، ISR) وبمجرد الانتهاء منه ، يعود إلى الروتين الرئيسي ويستمر في تنفيذه.

نظرًا لأن التأخير المطلوب (50 مللي ثانية) أكبر من الحد الأقصى للتأخير المحتمل: 4 ، 096 مللي ثانية = 1000 مللي ثانية / 62500 هرتز * 256 ، من الواضح أن المؤقت سوف يفيض. وكلما تجاوز العداد ، يتم تشغيل المقاطعة.

كم مرة يجب أن تطلق المقاطعة؟

50 مللي ثانية / 4.096 مللي ثانية = 3125/256 = 12.207 إذا تجاوز المؤقت 12 مرة ، فقد مرت 12 * 4.096 مللي ثانية = 49.152 مللي ثانية. في التكرار الثالث عشر ، نحتاج إلى تأخير قدره 50 مللي ثانية - 49.152 مللي ثانية = 0.848 مللي ثانية.

عند تردد 62500 هرتز (مقياس مسبق = 256) ، تستغرق كل علامة 0.016 مللي ثانية. وبالتالي لتحقيق تأخير يبلغ 0.848 مللي ثانية ، فإنه يتطلب 0.848 مللي ثانية / 0.016 مللي ثانية = 53 علامة. وبالتالي ، في التكرار الثالث عشر ، نسمح فقط للمؤقت بالعد حتى 53 ، ثم إعادة ضبطه.

تهيئة Timer0 / Counter (انظر الصورة):

TCCR0B | = (1 << CS02) // إعداد المؤقت باستخدام مقياس مسبق = 256 TCNT0 = 0 // تهيئة العداد TIMSK0 | = (1 << TOIE0) // تمكين مقاطعة تجاوز التدفق sei () // تمكين المقاطعات العامة tot_overflow = 0 // تهيئة متغير عداد الفائض

الخطوة 3: بيان المشكلة 2: فلنومض مؤشر LED الثاني (أزرق) كل 1 ثانية

بيان المشكلة 2: فلنومض مؤشر LED الثاني (أزرق) كل ثانية
بيان المشكلة 2: فلنومض مؤشر LED الثاني (أزرق) كل ثانية
بيان المشكلة 2: فلنومض مؤشر LED الثاني (أزرق) كل ثانية
بيان المشكلة 2: فلنومض مؤشر LED الثاني (أزرق) كل ثانية
بيان المشكلة 2: فلنومض مؤشر LED الثاني (أزرق) كل ثانية
بيان المشكلة 2: فلنومض مؤشر LED الثاني (أزرق) كل ثانية

المنهجية:

- استخدام جهاز القياس المسبق Timer1 لتقليل الإشارة الكهربائية عالية التردد إلى تردد أقل عن طريق القسمة الصحيحة ؛

- استخدام Clear Timer في وضع المقارنة (CTC) ؛

- استخدام المقاطعات مع وضع CTC ؛

Timer1 (16 بت) يحسب من 0 إلى 65534 بعد ذلك ، يفيض. تتغير هذه القيمة مع كل نبضة على مدار الساعة.

F_CPU = 16 ميجا هرتز: الفترة الزمنية على مدار الساعة = 1000 مللي ثانية / 16000000 هرتز = 0.0000625 مللي ثانية عدد المؤقت = (التأخير المطلوب / الفترة الزمنية للساعة) -1 = (1000 مللي ثانية / 0.0000625 مللي ثانية) = 15999999

لقد قطعت الساعة بالفعل 15999999 مرة لإعطاء تأخير قدره 1 ثانية!

يمكننا استخدام تقنية تقسيم التردد تسمى التقسيم المسبق لتقليل عدد المؤقت. يوفر لنا AVR القيم التالية للمقياس المسبق للاختيار من بينها: 8 و 64 و 256 و 1024. انظر الجدول يلخص نتائج استخدام أجهزة قياس مسبقة مختلفة. يجب أن تكون قيمة العداد عددًا صحيحًا دائمًا. دعونا نختار prescaler 256!

في مؤقت المسح في وضع المقارنة (CTC) ، يتم استخدام سجل OCR1A أو ICR1 لمعالجة دقة العداد. في وضع CTC ، يتم مسح العداد إلى الصفر عندما تتطابق قيمة العداد (TCNT1) مع OCR1A أو ICR1. يحدد OCR1A أو ICR1 أعلى قيمة للعداد ، وبالتالي أيضًا حلها. يسمح هذا الوضع بتحكم أكبر في مقارنة تردد خرج المطابقة كما أنه يبسط عملية حساب الأحداث الخارجية. يجب أن نخبر AVR بإعادة ضبط Timer1 / Counter بمجرد أن تصل قيمته إلى القيمة 62500 ، وبالتالي تحقيق تأخير قدره 1 ثانية.

تهيئة Timer1 / Counter (انظر الصورة):

TCCR1B | = (1 << WGM12) | (1 << CS12) // إعداد المؤقت باستخدام مقياس مسبق = 256 ووضع CTC TCNT1 = 0 // تهيئة العداد TIMSK1 | = (1 << OCIE1A) // تمكين مقاطعة OCR1A = 62500 // تهيئة قيمة المقارنة

الخطوة 4: بيان المشكلة 3: فلنومض مؤشر LED الثالث (أحمر) كل 16 مللي ثانية

بيان المشكلة 3: لنومض مؤشر LED الثالث (أحمر) كل 16 مللي ثانية
بيان المشكلة 3: لنومض مؤشر LED الثالث (أحمر) كل 16 مللي ثانية
بيان المشكلة 3: لنومض مؤشر LED الثالث (أحمر) كل 16 مللي ثانية
بيان المشكلة 3: لنومض مؤشر LED الثالث (أحمر) كل 16 مللي ثانية
بيان المشكلة 3: لنومض مؤشر LED الثالث (أحمر) كل 16 مللي ثانية
بيان المشكلة 3: لنومض مؤشر LED الثالث (أحمر) كل 16 مللي ثانية
بيان المشكلة 3: لنومض مؤشر LED الثالث (أحمر) كل 16 مللي ثانية
بيان المشكلة 3: لنومض مؤشر LED الثالث (أحمر) كل 16 مللي ثانية

المنهجية:

- استخدام جهاز القياس المسبق Timer2 لتقليل الإشارة الكهربائية عالية التردد إلى تردد أقل عن طريق القسمة الصحيحة ؛

- استخدام Clear Timer في وضع المقارنة (CTC) ؛

- استخدام وضع CTC للأجهزة دون انقطاع ؛

Timer2 (8 بت) يحسب من 0 إلى 255 بعد ذلك ، يفيضون. تتغير هذه القيمة مع كل نبضة على مدار الساعة.

F_CPU = 16 ميجا هرتز: فترة الساعة = 1000 مللي ثانية / 16000000 هرتز = 0.0000625 مللي ثانية

عدد المؤقت = (التأخير المطلوب / الفترة الزمنية على مدار الساعة) -1 = (16 مللي ثانية / 0.0000625 مللي ثانية) = 255999

لقد قطعت الساعة بالفعل 255999 مرة لإعطاء تأخير قدره 16 مللي ثانية!

انظر إلى الجدول الذي يلخص نتائج استخدام مقويات مسبقة مختلفة. يجب أن تكون قيمة العداد عددًا صحيحًا دائمًا. دعونا نختار مقياس مسبق 1024!

في وضع CTC ، يتم مسح العداد إلى الصفر عندما تتطابق قيمة العداد (TCNT2) مع OCR2A أو ICR2. Pin PB3 هو أيضًا دبوس مقارنة الإخراج لـ TIMER2 - OC2A (انظر الرسم التخطيطي).

سجل التحكم في المؤقت / العداد 2 A - TCCR2A بت 7: 6 - COM2A1: 0 - قارن وضع الإخراج لوحدة المقارنة أ. نظرًا لأننا نحتاج إلى تبديل مؤشر LED ، فإننا نختار الخيار: تبديل OC2A على مقارنة المطابقة كلما حدث تطابق ، يتم تبديل دبوس OC2A تلقائيًا. لا حاجة للتحقق من أي بت علم ، ولا حاجة لحضور أي مقاطعات.

تهيئة Timer2 / Counter

TCCR2A | = (1 << COM2A0) | (1 << WGM21) // إعداد مؤقت OC2A pin في وضع التبديل ووضع CTC TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // إعداد المؤقت باستخدام مقياس مسبق = 1024 TCNT2 = 0 // تهيئة عداد OCR2A = 250 // تهيئة قيمة المقارنة

الخطوة 5: كتابة رمز لبرنامج في C. تحميل ملف HEX إلى ذاكرة فلاش متحكم دقيق

كتابة رمز لبرنامج في C. تحميل ملف HEX في ذاكرة فلاش متحكم دقيق
كتابة رمز لبرنامج في C. تحميل ملف HEX في ذاكرة فلاش متحكم دقيق
كتابة رمز لبرنامج في C. تحميل ملف HEX في ذاكرة فلاش متحكم دقيق
كتابة رمز لبرنامج في C. تحميل ملف HEX في ذاكرة فلاش متحكم دقيق

كتابة وبناء تطبيق متحكم AVR في كود C باستخدام منصة التطوير المتكاملة - Atmel Studio.

يحدد F_CPU تردد الساعة بالهرتز وهو شائع في البرامج التي تستخدم مكتبة avr-libc. في هذه الحالة يتم استخدامه بواسطة إجراءات التأخير لتحديد كيفية حساب التأخير الزمني.

#ifndef F_CPU

#define F_CPU 16000000UL // إخبار وحدة التحكم بتردد الكريستال (16 ميجا هرتز AVR ATMega328P) #endif

# تضمين // رأس لتمكين التحكم في تدفق البيانات عبر المسامير. يحدد المسامير والمنافذ وما إلى ذلك.

يعد ملف التضمين الأول جزءًا من avr-libc وسيتم استخدامه في أي مشروع AVR تعمل عليه تقريبًا. سيحدد io.h وحدة المعالجة المركزية التي تستخدمها (وهذا هو سبب تحديد الجزء عند التجميع) ، وبدوره يتضمن رأس تعريف الإدخال / الإخراج المناسب للشريحة التي نستخدمها. إنه يحدد ببساطة الثوابت لجميع المسامير والمنافذ والسجلات الخاصة وما إلى ذلك.

# تضمين // رأس لتمكين المقاطعة

متقلبة uint8_t tot_overflow؛ // المتغير الشامل لحساب عدد الفائض

منهجية بيان المشكلة: ضوء فلاش أولاً (أخضر) كل 50 مللي ثانية

- استخدام جهاز القياس المسبق Timer0 لتقليل الإشارة الكهربائية عالية التردد إلى تردد أقل عن طريق القسمة الصحيحة ؛

- استخدام المقاطعة في كل مرة يفيض Timer0 ؛

timer0_init () // تهيئة timer0 والمقاطعة والمتغير

{TCCR0B | = (1 << CS02) ؛ // إعداد جهاز ضبط الوقت باستخدام مقياس مسبق = 256 TCNT0 = 0 ؛ // تهيئة العداد TIMSK0 | = (1 << TOIE0) ؛ // تمكين overflow nterrupt sei () ؛ // تمكين المقاطعات العمومية tot_overflow = 0 ؛ // تهيئة متغير عداد تجاوز}

منهجية بيان المشكلة: وميض مؤشر LED الثاني (أزرق) كل 1 ثانية

- استخدام جهاز القياس المسبق Timer1 لتقليل الإشارة الكهربائية عالية التردد إلى تردد أقل عن طريق القسمة الصحيحة ؛

- استخدام Clear Timer في وضع المقارنة (CTC) ؛

- استخدام المقاطعات مع وضع CTC ؛

timer1_init () // تهيئة الموقت 1 والمقاطعة والمتغير {TCCR1B | = (1 << WGM12) | (1 << CS12) ؛ // إعداد جهاز ضبط الوقت باستخدام مقياس مسبق = 256 ووضع CTC TCNT1 = 0 ؛ // تهيئة عداد OCR1A = 62500 ؛ // تهيئة قيمة المقارنة TIMSK1 | = (1 << OCIE1A) ؛ // تمكين مقاطعة المقارنة}

منهجية بيان المشكلة: وميض مؤشر LED الثالث (أحمر) كل 16 مللي ثانية

- استخدام جهاز القياس المسبق Timer2 لتقليل الإشارة الكهربائية عالية التردد إلى تردد أقل عن طريق القسمة الصحيحة ؛

- استخدام Clear Timer في وضع المقارنة (CTC) ؛

- استخدام وضع CTC للأجهزة دون انقطاع ؛

timer2_init () // تهيئة الموقت 2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21) ؛ // إعداد دبوس OC2A المؤقت في وضع التبديل ووضع CTC TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) ؛ // إعداد جهاز ضبط الوقت باستخدام مقياس مسبق = 1024 TCNT2 = 0 ؛ // تهيئة العداد OCR2A = 250 ؛ // تهيئة قيمة المقارنة}

يتم استدعاء روتين خدمة مقاطعة تجاوز السعة TIMER0 كلما تجاوز TCNT0:

ISR (TIMER0_OVF_vect)

{tot_overflow ++ ؛ // تتبع عدد الفائض}

يتم تشغيل ISR هذا كلما حدث تطابق ، أدى التبديل هنا نفسه:

ISR (TIMER1_COMPA_vect) {PORTC ^ = (1 << 1) ؛ // تبديل الصمام هنا}

int main (باطل)

{DDRB | = (1 << 0) ؛ // connect 1 (أخضر) أدى إلى pin PB0 DDRC | = (1 << 1) ؛ // connect 2 (أزرق) أدى إلى pin PC1 DDRB | = (1 << 3) ؛ // connect 3 (أحمر) أدى إلى timer0_init () PB3 (OC2A) ؛ // تهيئة timer0 timer1_init () ؛ // تهيئة timer1 timer2_init () ؛ // تهيئة timer2 while (1) // loop forever {

إذا تجاوز Timer0 12 مرة ، فقد مرت 12 * 4.096ms = 49.152ms. في التكرار الثالث عشر ، نحتاج إلى تأخير قدره 50 مللي ثانية - 49.152 مللي ثانية = 0.848 مللي ثانية. وبالتالي ، في التكرار الثالث عشر ، نسمح فقط للمؤقت بالعد حتى 53 ، ثم إعادة ضبطه.

if (tot_overflow> = 12) // تحقق مما إذا كان لا. من الفائض = 12 ملاحظة: يتم استخدام '> ='

{if (TCNT0> = 53) // تحقق مما إذا كان عدد المؤقت يصل إلى 53 {PORTB ^ = (1 << 0) ؛ // تبديل الصمام TCNT0 = 0 ؛ // إعادة تعيين العداد tot_overflow = 0 ؛ // إعادة تعيين عداد التدفق}}}}

تحميل ملف HEX في ذاكرة فلاش المتحكم الدقيق:

اكتب الأمر في نافذة موجه DOS الأمر:

avrdude –c [اسم المبرمج] –p m328p –u –U flash: w: [اسم ملف hex الخاص بك] في حالتي هو: avrdude –c ISPProgv1 –p m328p –u –U flash: w: Timers.hex

يقوم هذا الأمر بكتابة ملف ست عشري في ذاكرة وحدة التحكم الدقيقة. شاهد الفيديو مع وصف تفصيلي لحرق ذاكرة فلاش متحكم:

حرق ذاكرة فلاش متحكم دقيق …

نعم! الآن ، يعمل الميكروكونترولر وفقًا لتعليمات برنامجنا. دعونا التحقق من ذلك!

الخطوة السادسة: عمل الدائرة الكهربائية

صنع الدائرة الكهربائية
صنع الدائرة الكهربائية
صنع الدائرة الكهربائية
صنع الدائرة الكهربائية
صنع الدائرة الكهربائية
صنع الدائرة الكهربائية

قم بتوصيل المكونات وفقًا للرسم التخطيطي.

موصى به: