جدول المحتويات:
- الخطوة 1: الوصف
- الخطوة 2: بيان المشكلة 1: دعنا نضيء مؤشر LED الأول (أخضر) كل 50 مللي ثانية
- الخطوة 3: بيان المشكلة 2: فلنومض مؤشر LED الثاني (أزرق) كل 1 ثانية
- الخطوة 4: بيان المشكلة 3: فلنومض مؤشر LED الثالث (أحمر) كل 16 مللي ثانية
- الخطوة 5: كتابة رمز لبرنامج في C. تحميل ملف HEX إلى ذاكرة فلاش متحكم دقيق
- الخطوة السادسة: عمل الدائرة الكهربائية
فيديو: متحكم AVR. المصابيح المتوهجة باستخدام الموقت. الموقتات المقاطعات. وضع مؤقت CTC: 6 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:40
مرحبا بالجميع!
الموقتات مفهوم مهم في مجال الإلكترونيات. كل مكون إلكتروني يعمل على أساس زمني. تساعد هذه القاعدة الزمنية في الحفاظ على تزامن جميع الأعمال. تعمل جميع وحدات التحكم الدقيقة بتردد ساعة محدد مسبقًا ، ولديهم جميعًا توفيرًا لإعداد أجهزة ضبط الوقت. تفتخر AVR بوجود مؤقت دقيق للغاية وموثوق. يقدم الكثير من الميزات فيه ، مما يجعله موضوعًا واسعًا. أفضل جزء هو أن المؤقت مستقل تمامًا عن وحدة المعالجة المركزية. وبالتالي ، فهو يعمل بالتوازي مع وحدة المعالجة المركزية ولا يوجد تدخل من وحدة المعالجة المركزية ، مما يجعل الموقت دقيقًا تمامًا. في هذا القسم ، أشرح المفاهيم الأساسية لـ AVR Timers. أنا أكتب برنامجًا بسيطًا في كود C للتحكم في وميض LED ، باستخدام أجهزة ضبط الوقت.
الخطوة 1: الوصف
يوجد في ATMega328 ثلاثة أنواع من أجهزة ضبط الوقت:
Timer / Counter0 (TC0) - هو وحدة عداد / عداد 8 بت للأغراض العامة ، مع وحدتي OutputCompare مستقلتين ، ودعم PWM ؛
Timer / Counter1 (TC1) - تتيح وحدة المؤقت / العداد ذات 16 بت توقيت تنفيذ البرنامج بدقة (إدارة الأحداث) ، وتوليد الموجات ، وقياس توقيت الإشارة ؛
Timer / Counter2 (TC2) - هو غرض عام ، قناة ، وحدة عداد / عداد 8 بت مع PWM والتشغيل غير المتزامن ؛
الخطوة 2: بيان المشكلة 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 ثانية
المنهجية:
- استخدام جهاز القياس المسبق 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 مللي ثانية
المنهجية:
- استخدام جهاز القياس المسبق 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 إلى ذاكرة فلاش متحكم دقيق
كتابة وبناء تطبيق متحكم 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
يقوم هذا الأمر بكتابة ملف ست عشري في ذاكرة وحدة التحكم الدقيقة. شاهد الفيديو مع وصف تفصيلي لحرق ذاكرة فلاش متحكم:
حرق ذاكرة فلاش متحكم دقيق …
نعم! الآن ، يعمل الميكروكونترولر وفقًا لتعليمات برنامجنا. دعونا التحقق من ذلك!
الخطوة السادسة: عمل الدائرة الكهربائية
قم بتوصيل المكونات وفقًا للرسم التخطيطي.
موصى به:
عداد كبير على المصابيح المتوهجة 220 فولت: 18 خطوة (بالصور)
عداد كبير على المصابيح المتوهجة 220 فولت: مساء الخير أيها القراء والقراء الأعزاء. سأخبرك اليوم عن مؤشر مستوى الصوت على المصابيح المتوهجة 220 فولت
كرات الجرم السماوية المتوهجة باستخدام الأردوينو: 8 خطوات (بالصور)
كرات الجرم السماوية المتوهجة DIY مع Arduino: Hello Guys :-) في هذه التعليمات ، سأقوم ببناء مشروع Arduino LED مذهل لقد استخدمت كرات التنين المصنوعة من الزجاج ، وألصق مؤشر LED أبيض مع كل كرة تنين وبرمجت Arduino بمختلف نمط مثل تأثير التنفس ، كومة من شارع
ذراع متحكم بهاتف ذكي رخيص (+ وضع توفير الخيار): 5 خطوات
ذراع متحكم بهاتف ذكي رخيص (+ وضع توفير الخيار): المشروع يقود ذراعًا آليًا يتحكم فيه الهاتف الذكي باستخدام جهاز بلوتوث مكافأة الوضع: لدينا زر يسمح لاردوينو بتذكر موقع. متى أردنا ، يمكننا الذهاب إلى هذا الموضع المحفوظ بزر آخر. أمر FRLE PROJET
متحكم AVR. تعديل عرض النبض. متحكم محرك DC وشدة ضوء LED: 6 خطوات
متحكم AVR. تعديل عرض النبض. متحكم محرك التيار المستمر وشدة ضوء LED: مرحبًا بالجميع! يعد تعديل عرض النبض (PWM) تقنية شائعة جدًا في الاتصالات السلكية واللاسلكية والتحكم في الطاقة. يتم استخدامه بشكل شائع للتحكم في الطاقة التي يتم تغذيتها لجهاز كهربائي ، سواء كان محركًا أو مصباح LED أو مكبرات صوت وما إلى ذلك
روبوت تتبع خط متحكم به متحكم به مع تجنب العوائق: 6 خطوات
روبوت تتبع خط متحكم به متحكم به مع تجنب عقبة: كانت هذه مجرد فكرة تم فيها دمج العديد من الميزات مثل تجنب العوائق ، ومتابعة الخط ، والتحكم في الهاتف المحمول ، وما إلى ذلك معًا وصنعها في قطعة واحدة. كل ما تحتاجه هو وحدة تحكم مع بعض المستشعرات و الزي لهذا الإعداد. في هذا ، أنا