المؤقت 2
هو مؤقت/عداد بطول 8 بت مع خواص مقارنة الخرج وتوليد PWM
تماما كما في T/C1 .
يمكنه استخدام كريستالة منفصلة عن ساعة النظام كمصدر لنبضات
الساعة.
يتم اختيار الكريستالة عن طريق ضبط قيمة البت AS2 في ASSR .
البتات الثلاثة الأخرى هي للتأكد من عدم كتابة البيانات على T/C2 في
الوقت الذي يكون فيه T/C2 قيد التحديث.
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
98
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
استخدام المعالج كمصدر للوقت الحقيقي
يسمح المعالج الصغري باستخدام كريستالة ترددها 32.767 كيلوهرتز
لقيادة الهزاز الداخلي وذلك عن طريق
القطبين PINC.6 و PINC.7 .
يسمح ذلك ل T/C2 بالعمل كقاعدة من أجل حساب الزمن الحقيقي.
سيطفح T/C2128 مرة في كل ثانية.
إذا تمت تهيئته بنسبة تقسيم T1OSC/128 .
سيسمح ذلك للمؤقت 2 بالعد تصاعديا حتى 256 هرتز.
يتم توليد مقاطعة مرة واحدة في كل ثانية.
يوجد مسجل تحكم واحد للمؤقت 2 وهو TCCR2 .
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
99
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
تعريف بتات TCCR2
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
100
البت
الوصف
FOC2
يجبر حصول تطابق على المقارن في غير حالات PWM
WGM20
تفعيل هذا البت يقوم بتفعيل وظائف المؤقت 2
COM21
يقوم هذان البتان باختيار وظيفة نمط مقارنة الخرج. لهما نفس تعريف البتين COM1x1 و COM1x0 في المؤقت 1
COM20
WGM21
تفعيل هذا البت يؤدي إلى تفعيل نمط CTC
CS22
بتات تحديد نسبة التقسيم للعداد. انظر مواصفات AVR للمزيد من التفصيل.
CS21
CS20
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
المؤقت 2 بعد تهيئته
// مصدر الساعة هو القطب TOSC1
// قيمة الساعة هي PCK2/128
TCCR2=0x05;
ASSR=0x08;
للمؤقت 2 مسجل تحكم وحيد، TCCR2 ، يتحكم بعمل T/C2 .
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
101
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
تصميم النظام
يتم تصميم النظام لتسجيل:
عدد دورات المحرك بالدقيقة، بالاعتماد على نبضات من قابس الشوكات،
عدد دورات محور القيادة بالدقيقة، وذلك عن طريق قراءة حساس مغناطيسي
عن طريق مغناطيس مرتبط بالمحور
حرارة المحرك عن طريق مزدوجة حرارية RTD مرتبطة مع رأس اسطوانة
المحرك.
يمكن الحصول على قياسات سرعة الدوران بالدقيقة عن طريق
عد النبضات خلال ثانية واحدة وضربها ب 60 للحصول عليها بالدقيقة.
الخطوات المتبعة في تسجيل الثانية الواحدة يجب أن تسجل عدد الدورات ومن ثم تمحيها من أجل
العد اللازم للثانية التالية.
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
102
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
الجزء 1 : التسجيل خلال ثانية واحدة باستخدام
المؤقت 0
ستحاول الحصول على فاصل زمني طويل، ولديك العديد من العمليات المعتمدة على
المقاطعات.
سيكون من الجيد استخدام نبضة ساعة بطيئة وفعالة من أجل نبضات الساعة
كعملية تصغير قيمة الزمن المستخدم في روتين النبضات.
ساعة النظام بتردد 8 ميغاهرتز، ونسبة التقسيم 64 تنتج ساعة بتردد 125 كيلوهرتز
مطبقة على T/C0 .
يجب حدوث 125000 نبضة ساعة خلال ثانية واحدة.
تحديد قيمة T/C0 بحيث يعد 250 عدة في كل نبضة.
125000 / 250 = 500 ، أي أنه يجب أن تحصل مقاطعة المؤقت 500 مرة في كل
ثانية تمضي.
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
103
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
الجزء 1 : تهيئة المؤقت 0 في التابع main
inttime_cntr= 0;
/* متحول لتخزين عدد مرات طفحان المؤقت 0*/
main()
{
/* تهيئة ال مؤقت/عداد 0*/
TCCR0=0x03; /* تحديد تردد الساعة بنسبة تقسيم على 64*/
TCNT0=0x00; /* بدء المؤقت 0 عند القيمة 0*/
{
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
104
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
الجزء 1 : ISR لطفحان المؤقت 0
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
TCNT0 = 6; /* إعادة تحميل قيمة المؤقت 0 من أجل الدورة التالية */
if (time_cntr++ == 500) /* تحقق من مرور ثانية واحدة */{
if (data_set_cntr< 120) {
/* تسجيل البيانات إذا كانت أصغر من 120*/
/*تسجيل سرعة دوران المحرك والمحور بالدقيقة والحرارة */
e_rpm[data_set_cntr] = current_e_rpm;
s_rpm[data_set_cntr] = current_s_rpm;
temp[data_set_cntr++] = current_temp; }
time_cntr= 0; /* إعادة ضبط العداد */ } }
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
105
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
الجزء 2 : قياس سرعة دوران المحرك بالدقيقة
باستخدام المؤقت 1
نستخدم دارة متكاملة لالتقاط النبضات المعبرة عن سرعة الدوران بالدقيقة.
نستخدم ساعة نظام بتردد 8 ميغاهرتز وبتقسيم 8 للحصول على تردد ساعة
قدره 1 ميغاهرتز وبدور 1 ميكروثانية.
نستخدم ساعة بتردد 1 ميغاهرتز ل T/C1 ، ونستخدم ICR1 لالتقاط عدّات T1
عند كل جبهة هابطة على ICP .
يقوم ISR بمقارنة العدد الملتقط حاليا مع الزمن الملتقط سابقا، وذلك لتحديد الدور،
الذي يستخدم بدوره لحساب عدد دورات المحرك في الدقيقة.
ملاحظة: نحصل على نبضة واحدة من أجل كل دورتين للمحرك في محرك بأربعة أدوار.
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
106
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
الجزء 2 : تهيئة مقاطعة T/C0
/* تهيئة مقاطعة المؤقت/عداد */
TIMSK=0x21; /* طفحان المؤقت 0 » أي سي بي « ، تفعيل مقاطعة */
/* تهيئة المؤقت/عداد 1*/
TCCR1A=0x00;
TCCR1B=0x02; /* نسبة التقسيم = 8 ، عند الجبهة الهابطة */
TCNT1H=0x00; /* البدء عند 0*/
TCNT1L=0x00;
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
107
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
الجزء 2 : ISR للمؤقت 1 لالتقاط الحدث
unsigned intprevious_capture_time;/* الزمن الذي تم
التقاطه سابقا */
interrupt [TIM1_CAPT] void timer1_capt_isr(void) {
unsigned intcurrent_capture_time, period; /*الزمن والدور */
current_capture_time= (256* ICR1H) + ICR1L;
if (current_capture_time> previous_capture_time) /* العودة إلى
البداية */
period = current_capture_time-previous_capture_time;
else period = 0xFFFF -current_capture_time+
previous_capture_time;
current_e_rpm= (unsigned long)120E6 / (unsigned long)period;
previous_capture_time= current_capture_time; /* الحفظ من أجل
الحسابات التالية */
}
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
108
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
شرح الجزء 2 : قياس سرعة دوران المحرك بالدقيقة
باستخدام المؤقت 1
« نقوم بتهيئة المتحول العام previous_capture_time للحصول على القيمة التي »
تم التقاطها سابقا.
يقرأ ISR الزمن الحالي الذي تم التقاطه ويستخدمه لحساب عدد الدورات في الدقيقة.
يتم حساب عدد الدورات في الدقيقة كالتالي:
عدد الدورات في الدقيقة ) RPM = ) 1E6 ميكروثانية * 1 نبضة / الدور بالميكروثانية * 2
دورة في كل نبضة * 60 ثانية في كل دقيقة
انتبه إلى أنه:
تم استخدام هذه الصيغة لضمان الدقة مع الأعداد الكبيرة.
جمع الثوابت يؤدي إلى تصغير التعبير الحسابي.
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
109
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
الجزء 3 : قياس سرعة دوران محور القيادة في الدقيقة
باستخدام INT0
بما أنه لا يوجد مسجل التقاط ثاني وبما أن إشارة سرعة دوران المحور
في الدقيقة مرتبطة مع INT0 .
يمكن إنشاء ICR باستخدام ISR ل INT0 وذلك عن طريق قراءة العدد
في T/C1 عند حصول مقاطعة.
الحسابات تبقى ذاتها، باستثناء وجود نبضة واحدة في كل دورة عوضا
عن اثنتين.
بعض المتحولات المحلية لها الأسماء ذاتها.
بما أنها محلية فيمكن استخدام الأسماء ذاتها.
لكن مقاييس البرمجة لا ترضى بذلك.
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
110
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
الجزء 3 : ISR الخاص بالمقاطعة الخارجية 0
( INT0 )
unsigned intprevious_shaft_capture_time; /* القيمة
الملتقطة سابقا */
interrupt [EXT_INT0] void ext_int0_isr(void) {
unsigned intcurrent_capture_time, period;
/*الزمن والدور الحاليين */
current_capture_time= TCNT1; /* تخزين الزمن الموجود في المؤقت 1*/
/*تحقق من العودة إلى البداية */
if (current_capture_time>previous_shaft_capture_time)
period = current_capture_time-previous_shaft_capture_time;
else period = 0xFFFF -current_capture_time+
previous_shaft_capture_time;
current_s_rpm= (unsigned long)60E6 / (unsigned long)period;
previous_shaft_capture_time= current_capture_time; }
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
111
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
قياس حرارة المحرك باستخدام المبدل التشابهي
الرقمي ) ADC )
يتم ربط إشارة الحرارة مع ADC3 ، وهو دخل المبدل التشابهي الرقمي على
المنفذ A ، القطب 3 .
يقع مجال القياس بين 100 و 250 درجة فهرنهايت.
استخدام نمط ال 10 بتات في ال ADC يعني أن قيمة النتيجة ستكون:
100 درجة فهرنهايت = 0x000 = 010
250 درجة فهرنهايت = 0x3FF = 102310
ومنه يمكن استنتاج علاقة التحويل ليكون شكلها:
Temp ( = 150 درجة فهرنهايت * قراءة ال ADC / ) 1023 + 100 درجة
فهرنهايت
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
112
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
يمكن للمبدل التشابهي الرقمي أن يعمل في النمط الحر.
يتم الاحتفاظ بأحدث قيمة للحرارة، بحيث أنه عندما يتم حفظ
البيانات في كل ثانية،
يتم تسجيل أحدث قيمة.
تحدث مقاطعة ال ADC في نهاية كل تحويل ويمكن استخدامها
لتحديث قيمة الحرارة الحالية.
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
113
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
عملية تهيئة المبدل التشابهي الرقمي ADC
. 1 تحديد تردد الساعة المستخدم، باختيار نسبة التقسيم لساعة ال ADC .
. 2 يجب أن يكون تردد ساعة ال ADC بين 50 كيلوهرتز و 200 كيلوهرتز.
• قيمة تردد ساعة النظام لدينا هي 8 ميغاهرتز، ولذلك يجب اختيار نسبة تقسيم
على 64 للحصول على تردد ساعة للمبدل التشابهي الرقمي قيمته 125
كيلوهرتز.
. 3 اختيار القناة التي سيتم قياسها،
. 4 تفعيل نمط العمل الحر.
. 5 بدء التحويل الأول.
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
114
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
تهيئة ال ADC
ADMUX=0x3;
/* تحديد القناة 3 ليكون الكمون المرجعي » ايي ريف « و */
/*الدخل */
ADCSRA=0xE9; /* تفعيل المبدل التشابهي الرقمي، نمط العمل الحر، بدء
العمل، نسبة تقسيم الساعة هي 64*/
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
115
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
قراءة قيمة التحويل وتحويلها إلى حرارة :ADC ISR
[ADC_INT] void adc_isr(void){
unsigned intADC_DATA;
ADC_DATA = ADCW;
/*جلب البيانات من مسجل نتيجة المبدل التشابهي الرقمي */
current_temp=
((long)150*(long)ADC_DATA)
/ (long) 1023 +(long)100;
{
ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
116
انتهت المحاضرة الرابعة والأخيرة