قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-03-2012, 01:08 AM المشاركة 73   
افتراضي





مثال توضيحى :

فى هذا المثال سوف يتم تهيئة موديول PWM1 وتحديده لكى يعطى قطار من النبضات بدورة خدمة بنسبة 50% .
لهذا الغرض : نستخدم الثلاثة دوال : دالة التهيئة PWM1_Init() ودالة البدء PWM1_Start() ودالة تحديد دورة الخدمة PWM1_Set_Duty() .
جميع هذه الدوال ضمن مكتبة PWM بالمترجم mikroC PRO for PIC فقط يجب ضم المكتبة لمشروع البرنامج عندئذ يمكن استدعائها .

كود:
unsigned short duty_c; // Define variable duty_c void initMain() { PORTC = 0;// Initial state of port C TRISC = 0; // output pins PWM1_Init(5000); // PWM module initialization (initMain) } void main() { initMain(); duty_c = 127; // Initial value of duty-cycle PWM1_Start(); // Start PWM1 module PWM1_Set_Duty(duty_c); // Set PWM duty-cycle to 50% ... ...

الخطوات :
  • تعريف متغير يمثل دورة الخدمة

كود:
unsigned short duty_c; // Define variable duty_c
  • إنشاء دالة جديدة تضم جميع الإعدادات الابتدائية الرئيسية باسم initMain ويتم استدعائها فى بداية الدالة الرئيسية بغرض تسهيل قراءة وفهم البرنامج علاوة على حفظ تلك الإعدادات لاستخدامها فى برامج أخرى مما يوفر سهولة تطوير وقت البرمجة .
كود:
void initMain() {

تحتوى هذه الدالة على الإعدادات التالية :
# إعداد جميع أطراف المنافذ :
# إعداد الحالة الابتدائية لأطراف المنفذ PORTC كمخارج لإخراج إشارة PWM من الطرف RC2:

كود:
PORTC = TRISC = 0; // Initial state of port C output pins

# إعداد نظام PWM1 للوحدة الأولى CCP1 ليعمل على تردد 5KHz


كود:
PWM1_Init(5000); // PWM module initialization (initMain) }
  • الدالة الرئيسية :
كود:
void main() {

وتحتوى على :
# كما ذكرنا فى بدايتها يتم استدعاء دالة الأعدادات الرئيسية بما فى ذلك تهيئة نظام PWM.
initMain();
# الخطوة الأولى فى نظام PWM هى إعطاء(إسناد أو تخصيص) قيمة ابتدائية لمتغير دورة الخدمة , الرقم 127 يعنى النسبة 50% :

كود:
duty_c = 127; // Initial value of duty-cycle

# والخطوة الثانية بدء وحدة (موديول) نظام PWM باستدعاء دالة البدء :


كود:
PWM1_Start(); // Start PWM1 module

# والخطوة الثالثة استدعاء دالة تحديد (ضبط) نظام PWM ليعمل على القيمة المحددة بمتغيره وهى 50% :


كود:
PWM1_Set_Duty(duty_c); // Set PWM duty-cycle to 50%


...
...


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 23-03-2012 الساعة 01:14 AM
اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-03-2012, 02:27 AM المشاركة 74   
افتراضي


الدرس السادس عشر الجزء الثالث تدريبات
تدريبات متنوعة :
التدريب الأول :
التحكم فى شدة إضاءة ليد (كمثال لخرج) بصفة متدرجة ( 0-1-2-3-4….255) من 0 % وحتى 100 % مع التكرار بصفة مستمرة .
الدائرة الكهربية :





البرنامج :

كود:
/* microcontroller : P16F877A Use PWM1 module is set on RC2 Pin No 17.*/
unsigned short i; // counter for "for loop" void main() { PORTC = 00; // clear PORTC TRISC = 0; // PORTC is output Pwm1_Init(5000); //step1: Initialize PWM module with F= 5KHz Pwm1_Start(); //step2 : Start PWM
while (1) { // Endless loop for(i=0;i<=255;i++)
{
PWM1_Set_Duty(i); // step 3 :Set current duty for PWM1
delay_ms(10); }
} }
التدريب الثانى :

تعديل عرض النبضات PWM باستخدام موديول المقارنة CCP1 بالميكروكونترولر PIC16f877A وإجراء التزايد والتناقص فى دورة الخدمة عن طريق مفاتيح ضاغطة .
الدائرة الكهربية :

يتم توصيل 2 مفتاح ضاغط إلى الأطراف RB0 , RB1 كمداخل . ويتم تشغيل ليد بواسطة الخرج المعدل PWM من الطرف RC2/CCP1 خلال مقاومة لتحديد التيار 330R.يتم تزايد أو تناقص دورة الخدمة لإشارة الخرج PWM باستخدام المفاتيح الموجودة كمداخل وهذا يؤدى إلى التغيير فى شدة إضاءة الليد .




البرنامج :
البرنامج يعطى عشر مستويات مختلفة للتحكم فى شدة إضاءة الليد بتغيير دورة الخدمة من 0 إلى 250 بخطوة 25 فى كل مستوى . يتم تغيير دورة الخدمة عن طريق الضغط على المفاتيح الضاغطة UP , DOWN .

كود:
/* Pulse Width Modulation Description: CCP1 module (at RC2) generating a PWM signal MCU: PIC16F877A Oscillator: XT, 4.0 MHz, MCLR Enabled */
sbit UP at RB0_bit; sbit DOWN at RB1_bit;
unsigned short new_DC, current_DC;
void debounce(){ Delay_ms(300); }
void main() {
TRISB = 0b00000011; // RB0, RB1 input, PORTB = 0x00; TRISC.B2 = 0; //RC2 (PWM1) output PORTC.B2=0;
PWM1_Init(5000); // PWM module initialization (5KHz) new_DC = 0; // Initial value of variable Duty Cycle current_DC = 0; PWM1_Start(); // Start PWM1 module with Zero DC PWM1_Set_Duty(current_DC);
do {
if (!UP){ // If the button connected to RB0 is pressed debounce(); if (new_DC < 250) // Don't go above 250 new_DC = new_DC + 25 ; // increment Duty Cycle by 25 ie 10 steps }
if (!DOWN) { // If the button connected to RB1 is pressed debounce(); if (new_DC !=0) // Don't go below 0 new_DC= new_DC - 25 ; // Decrement Duty Cycle by 25 }
if (current_DC != new_DC) { current_DC = new_DC ; PWM1_Set_Duty(current_DC); // Change the current DC to new value }
} while(1); } // END main()

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-03-2012, 02:35 AM المشاركة 75   
افتراضي


التدريب الثالث :
التحكم فى سرعة محرك بنظام PWMبالتعديل فى دورة الخدمة عن طريق مقاومة متغيرة متصلة بمدخل تناظرى :
سوف نقوم بإنشاء برنامج بلغة السى الغرض منه تحميل دالة دورة الخدمة Pwm_set_duty() بقيمة ناتجة عن قراءة جهد تناظرى على المدخل AN0 أى أن دورة الخدمة تتغير من 0% إلى 100% تبعا لتغير جهد الدخل التناظرى والمناظر للقيمة من 0255 وبالتالى يقوم الخرج PWM بالتحكم فى سرعة محرك المروحة .

الدائرة الكهربية :




البرنامج :


كود:
/* ************************************************ البرنامج : دخل تناظرى و تعديل فى عرض النبضة الغرض : التحكم فى محرك مروحة عن طريق تعديل عرض النبضات من خلال دخل تناظرى إعداد : مهندس / فتح الله عبد العزيز http://www.eeecb.com/vb/index.php */ void main () { int a = 0; // تعريف متغير نوع عدد صحيح لحفظ نتيجة التحويل من تناظرى لرقمى //ADCON1 = 0b00001001; // تهيئة طرف الدخل التناظرى TRISA = 255; // تهيئة أطراف المنفذ كمداخل Pwm_Init (5000); // تهيئة موديول تعديل عرض النبضة بتردد 5 كيلوهرتز Pwm_Start (); //بدء عمل موديول تعديل عرض النبضة do // حلقة غير منتهية { a=Adc_Read(0); //قراءة القناة التناظرية صفر وحفظ قيمة نتيجة التحويل فى سجل مؤقت a = (a * 0.25); // تحويل القيمة السابقة إلى نسبة مئوية لدورة الخدمة 255/1023=0.25 Pwm_Set_Duty (a); //إرسال دورة الخدمة إلى موديول التحكم فى عرض النبضات لتظهر على الطرف Delay_10us; // الانتظار لمدة 10 ميكروثانية } while (1); // التكرار بصفة مستمرة }

التدريب الرابع:
استخدام الوحدة (الموديول) CCP1 فى توليد إشارة ذات تعديل فى عرض النبضات PWM :
لكى نجعل التدريب أكثر فائدة فسوف يتم تغيير فترة بقاء النبضات على الطرف RC2(PORTC,2) باستخدام المفاتيح الضاغطة المسماة ‘DARK’ "إظلام" أو تقليل شدة الإضاءة و ‘BRIGHT’ "نصوع" أو زيادة شدة الإضاءة . فى نفس الوقت يتم مشاهدة فترة دوام النبضة المحددة كمزيج من الأعداد الثنائية على المنفذ PORTB لإدراك التزايد والتناقص لأن التزايد أو التناقص بقيمة صغيرة لن يلاحظ على التغيير فى شدة الإضاءة .

الدائرة الكهربية :





البرنامج :



كود:
unsigned short current_duty, old_duty;     // Define variables
// current_duty and old_duty

void initMain() {
ADCON1 = 6; // ALL PORTA I/O
PORTA = 0; // Port A initial state
TRISA = 255;            // All port A pins are configured as inputs
PORTB = 0;               // Initial state of port B
TRISB = 0;                // All port B pins are configured as outputs
PORTC = 0;              // Port C initial state
TRISC = 0;                // All port C pins are configured as outputs

PWM1_Init(5000);    // PWM module initialization (5KHz)

}

void main() {

initMain();

current_duty = 16;    // Initial value of variable current_duty
old_duty = 0;              // Reset variable old_duty

PWM1_Start();          // Start PWM1 module

while (1) { // Endless loop

   if (Button(&PORTA, 0,1,1))         // If the button connected to RA0 is pressed
   current_duty++ ;                            // increment variable current_duty

   if (Button(&PORTA, 1,1,1))         // If the pressed button is connected to RA1
  current_duty-- ;                               // decrement value current_duty

   if (old_duty != current_duty) {      // If current_duty and old_duty are not
PWM1_Set_Duty(current_duty); // equal set PWM to a new value,

   old_duty = current_duty;              // save the new value
   PORTB = old_duty;                                   // and show it on port B
   }

Delay_ms(200);          // 200mS delay

}
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 26-03-2012, 11:13 PM المشاركة 76   
افتراضي


الدرس السابع عشر :
المؤقتات Timers والعدادات Counters
الميكروكونترولر PIC مجهز بوحدة (موديول) أو أكثر للتوقيت الدقيق تعرف باسم المؤقتات Timers والتى يمكن استخدامها لتنفيذ مجموعة متنوعة من وظائف التوقيت الدقيقة مثل توليد أحداث في أوقات محددة ، وقياس مدة (فترة دوام) duration حدث وحفظ تسجيل التاريخ والوقت وعد الأحداث counting وما إلى ذلك.
العنصر الرئيسي فى وحدة (موديول) المؤقت هو "عداد ثنائى حر يتزايد عند كل نبضة ترد إليه" , ونظرا لأنه يعمل بشكل مستقل فإنه يمكن أن يعد النبضات فى وقت واحد (بالتزامن) مع تنفيذ البرنامج الرئيسي.
يمتلك الميكروكونترولر PIC16F877A , على سبيل المثال , ثلاثة من المؤقتات كأجهزة hardwareمدمجة به وتسمى : Timer0 و Timer1و Timer2 وسوف نتناول فى هذا الدرس وحدة (موديول) المؤقت Timer0.

وحدة (موديول) المؤقت / العداد Timer 0 :
وحدة (موديول) المؤقت / العداد timer/counter module ببساطة هى عداد ثنائى binary counter مستقل والذى يمكن تهيئته (إعداده) لكى يقوم بعد نبضات ساعة دورات التعليمات الداخلية أو عد نبضات ساعة خارجية .
المؤقت Timer 0 هو عداد متزامن بسعة 8 بتات 8-bit والذى يقوم بحفظ (تخزين) قيمة العداد فى سجل وظائف خاصة يسمى TMR0 . هذا السجل قابل للقراءة وللكتابة فى أى وقت عن طريق البرنامج . إذا كتبت قيمة عليه فسوف يبدأ العداد التزايد من هذه القيمة .
عندما يتم تشغيل الموديول Timer 0 بنبضات ساعة تعليمات المعالج فيقال أنه يعمل كمؤقتtimer لأنه يتزايد بمعدل ثابت ( يتحدد بنبضات ساعة المعالج) , وإذا علمت عدد النبضات التى قام بعدها يمكنك إشتقاق (إستنتاج) الوقت المنقضى .
يمكن للمؤقت Timer 0 أيضا عد النبضات الخارجية الواصلة إلى الطرف RA4 واسمه البديل هو :
T0CKI (Timer Zero Clock Input) " مدخل نبضات الساعة للمؤقت صفر " . عندما يقوم الموديول بعد النبضات الخارجية يقال أنه يعمل كعداد counter . سوف نناقش نظامى العمل كل على حدة .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 26-03-2012, 11:17 PM المشاركة 77   
افتراضي


نظام المؤقت Timer mode




يتم اختيار نظام المؤقت بمسح clear البت TOCS " بت اختيار مصدر ساعة المؤقت Timer0 " وهى البت 5 بسجل الخيارات : (OPTION register, bit 5) إى TOCS=0.
فى نظام المؤقت يتزايد السجل TMR0 عند كل دورة تعليمة , ولأن هذا السجل ذو سعة 8-bit فيمكنه العد من الصفر 00 إلى FF (255) , وعندما يصل إلى أقصى قيمة له وهى FF (255) ويتقدم (يتجاوز) فى التزايد يعود للعد من الصفر 00 من جديد وتعرف هذه الحالة بالطفحان overflow (تجاوز الحد الأقصى) ويتم تسجيلها عن طريق "رفع علم أو راية البت T0IF " بت علم مقاطعة المؤقت Timer0 "(Timer0 Interrupt Flag) وهى البت 3 بسجل التحكم فى المقاطعة :
(INTCON,bit 3) (Interrupt Control) وذلك بجعلها بالقيمة set أى T0IF=1 , حيث يمكن لهذه الحالة بدء (توليد) مقاطعة والتى تعرف باسم " المقاطعة بالمؤقت صفر " Timer0 Interrupt إذا ما كانت ممكنة لعمل مقاطعة .
يتم تمكين مقاطعة المؤقت Timer0 بجعل البت T0IE(Timer0 Interrupt Enable)" تمكين المقاطعة بالمؤقت صفر " بسجل التحكم فى المقاطعة ( INTCON,bit5) بجعلها بالقيمة set أى T0IE=1 بالأضافة إلى خانة التمكين العام GIE( INTCON,bit7). هذه المقاطعة هى التى يجب أن تبين أن الوقت إنتهى وتحدث عند حدوث طفحان بالسجل TMR0 .
يجب مسح clear الخانة TOIF " علم مقاطعة المؤقت صفر " بواسطة روتين خدمة المقاطعة بحيث يمكن حدوث مقاطعة بالمؤقت من جديد أى TOIF=0.
مثال :
نفترض أن الميكروكونترولر PIC يعمل على مذبذب ساعة بتردد Fosc =4 MHz فإن تردد نبضات ساعة التعليمات سوف تكون Fosc /4 = 1 MHz . نتيجة لذلك يقوم العداد بالتزايد كل واحد ميكروثانية 1 μs بالضبط .وهذا يعنى أن المؤقت Timer0 سوف يستغرق 256 μs لكى يعد من الصفر إلى الصفر التالى .
عن طريق تحميل سجل المؤقت TMR0 بقيمة مسبقة مناسبة يمكن اختيار فترات زمنية أصغر .على سبيل المثال إذا تم تحميل السجل TMR0 مسبقا بالقيمة 206 فإن المؤقت Timer0 سوف يحدث له طفحان بعد 50 μs فقط .

علاوة على ذلك يوجد قاسم تردد مبرمج بسعة 8-bit يعرف باسم prescaler"المقياس المسبق " أو
" معامل القسمة " وهو متاح لقياس الفترات الزمنية الطويلة . والمقياس المسبق هو دائرة قسمة تقع بين مصدر نبضات الساعة والمؤقت وتقوم بقسمة التردد الداخل إلى المؤقت على قيمة من ثمانى قيم ثنائية تقع ما بين القيمة 2 والقيمة 256 .

مثال :
إذا كان تردد نبضات ساعة التعليمات 1MHz فإن أقصى فترة زمنية تناظر أكبر معامل قسمة وهو 256 أى :

256 x 256 μs = 65.536 ms

قيم معامل القسمة يتم اختيارها برمجيا بواسطة البتات الثلاثة : PS0, PS1,PS2 " بتات اختيار معامل القسمة " بسجل الخيارات (OPTION,bit0-bit2) .

من أجل تخصيص استخدام معامل القسمة مع موديول المؤقت Timer0يجب مسح clear = 0 البت PSA " تخصيص معامل القسمة " أى PSA=0. إما إذا كانت الخانة PSA بواحد set = 1 فلا يتم تخصيص أى معامل قسمة لموديول المؤقت .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 26-03-2012, 11:21 PM المشاركة 78   
افتراضي



فيما يلى تفاصيل سجل الخيارات OPTION_REG وسجل التحكم فى المقاطعة INTCON للرجوع إليها عند الحاجة:








الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 26-03-2012, 11:22 PM المشاركة 79   
افتراضي


نظام العداد Counter Mode
يتم اختيار نظام العداد بجعل البت TOCSبالسجل OPTION بواحد set = 1 أى TOCS=1. فى هذا النظام يقوم موديول المؤقت Timer0 بعد نبضات الساعة الخارجية الموجودة على الطرف RA4/T0CKI. يتزايد المؤقت سواء عند الحافة الصاعدة أو عند الحافة الهابطة لنبضات الساعة ويتم اختيار ذلك برمجيا بواسطة البت T0SE(Timer0 Source Edge) " حافة مصدر المؤقت صفر " بسجل الخيارات (OPTION,bit4) .إذا كانت هذه البت بواحد set أى T0SE=1 فسوف يتزايد المؤقت عند الحافة الهابطة لكل نبضة من نبضات الساعة التى تصل إلى الطرف RA4/T0CKI (عند الانتقال من الحالة المرتفعة إلى الحالة المنخفضة ) . مرة أخرى يمكن توسعة أو تمديد مدى العداد باستخدام prescaler .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 26-03-2012, 11:26 PM المشاركة 80   
افتراضي


التدريب على نظام المؤقت :
مقدمة :
فى البداية سوف نتناول خطوة بخطوة إعداد الأجزاء المختلفة لمةديول المؤقت باستخدام سجل الخيارات OPTION_REG :
1- اختيار مصدر المؤقت Timer كما فى الشكل التالى :





البت T0CS : بت اختيار مصدر ساعة المؤقت Timer0 .
T0CS=1 : نظام العداد : الإشارة الموجودة على الطرف T0CKI (Timer0 Clock Input) تستخدم كمصدر للمؤقت Timer0 .
T0CS=0 : نظام مؤقت : تستخدم ساعة التعليمات الداخلية كمصدر للمؤقت Timer0 .
ملحوظة :
دورة التعليمات الداخلية تساوى تردد مذبذب الميكروكونترولر مقسوم على أربعة Fosc/4 .
2- اختيار حافة المصدر ( للمصدر الخارجى فقط أى فى نظام العداد) :
البت T0SE : بت اختيار حافة مصدر المؤقت Timer0 .
T0SE=1 : يتزايد السجل TMR0 عند إنتقال حالة الطرف T0CKI من الحالة المرتفعة إلى الحالة المنخفضة ( الحافة الهابطة) .
T0SE=0 : يتزايد السجل TMR0 عند إنتقال حالة الطرف T0CKI من الحالة المنخفضة إلى الحالة المرتفعة ( الحافة الصاعدة) .





الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 04:55 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)