الدرس السادس عشر الجزء الثانى
ثانيا : التعامل مع تعديل عرض النبضات PWM بالمترجم ميكروسى برو والميكروكونترولر PIC :
الميكركونترولر PIC16F877A, على سبيل المثال , فى بناءه الداخلى 2 موديول CCP "إلتقاط – مقارنة - تعديل بعرض النبضة" هما CCP1 و CCP2 .
يمكننا التعامل بسهولة مع التعليمات الخاصة بتوليد أشارة ذات تعديل عرض النبضة PWM بالميكروسى برو.
ملحوظات هامة :- بعض الميكروكونترولر بها وحدات CCP متعددة . لكى تستخدم دوال مكتبة وحدة CCP محددة , ببياطة غير الرقم واحد بنموذج الدالة برقم الوحدة التى ترغب فى استخدامها , مثل PWM2_Start(); .
- جميع وحدات PWM تستخدم المؤقت Timer2 فى عملها , لذلك لن تستطيع تعيين ترددات مختلفة لوحدات PWM مختلفة .
الدوال التى تتناول الموديول CCP1, على سبيل المثال , هى :
• Pwm1_Init
• Pwm1_ Set _Duty
• Pwm1_Start
• Pwm1_Stop
1- دالة تهيئة تردد إشارة PWM :
فى الميكروسى تستخدم الدالة Pwm_Init() فى تحديد تردد إشارة PWM بالهرتز (دورة لكل ثانية) :
الصيغة :
كود:
void PWM1_Init(const long freq);
هذه الدالة تقوم بتهيئة وحدة PWM للبدء "بنسبة دورة خدمة تساوى الصفر " . البارامتر freq هوالتردد بالهرتز Hz المطلوب من وحدة PWM العمل به ( يجب الرجوع للداتا شيت الخاصة بالميكروكونترولر لمعرفة القيم الصحيحة الصالحة مع التردد Fosc ) . هذه الدالة "ليس لها عائد" ويجب إستدعاؤها قبل استخدام إى دالة أخرى من مكتبة PWM .
ملحوظة :
حساب قيمة تردد PWM تم عن طريق المترجم ولذلك يحتاج المترجم لمعرفة البارامتر عند الترجمة وهذا هو السبب فى أن البارامتر freq يجب أن يكون "ثابت" const longوليس متغير .
مثال:
تهيئة وحدة PWM1 للعمل عند تردد 5KHz :
2- دالة "تحديد دورة الخدمة" Duty Cycle
الصيغة :
كود:
void PWM1_Set_Duty(unsigned short duty_ratio);
هذه الدالة بدون عائد void ويجب استدعاء الدالة Pwm1_Init قبل استخدام هذه الدالة .
عن طريق هذه الدالة يمكن تحديد دورة خدمة إشارة PWM . البارامتر duty_ratio يحدد النسبة المئوية لدرة الخدمة ويأخد القيمة من 0 إلى 255 (متغير من النوع unsigned short ) حيث أن القيمة 0 تمثل دورة خدمة بنسبة 0% و القيمة 127 تمثل دورة خدمة بنسبة 50% و القيمة 255 تمثل دورة خدمة بنسبة 100%.
يمكن حساب قيمة معينة لنسبة دورة الخدمة عن طريق العلاقة الخطية : (Percent*255)/100 .- لحساب القيمة المناظرة لدورة خدمة 10 % :
(10% * 255) / 100 = 25.5
ولأن القيمة يجب أن تكون من النوع unsigned short فيجب أن تكون عدد صحيح بين الصفر و 255 , بالتالى نأخد القيمة 25 ونكتب ما يلى :
مثال :
كود:
PWM1_Set_ Duty (191); // تحديد دورة الخدمة بالقيمة 75 بالمئة
3- دالة البدء ودالة الإنتهاء :
من خلال دالة البدء PWM1_Start(); نقوم ببدء توليد إشارة PWM بالميكروكونترولر PIC ومن خلال دالة النهاية PWM1_Stop(); يتم إنهاء توليد إشارة PWM .
الصيغة :
كود:
void PWM1_Start(void); // initial signal generation module CCP1 PWM PIC
void PWM1_Stop(void); stops the PWM signal generation module CCP1 PIC
هذه الدوال ليس لها عائد فهى من النوع void كما أن ليس لها بارامترات ويجب استدعاء الدالة Pwm1_Init قبل استخدام هذه الدالة .
مثال بسيط :
كود:
void main () {
Pwm1_init (5000); // step 1: Initialize PWM1 module at 5KHz
Pwm1_Start (); //step2:start PWM1 Pwm1_Set_Duty (127); // step 3: Set duty for PWM1 : 50% while (1);
}
فى البرنامج السابق تم تهيئة الموديول CCP1 بالميكروكونترولر PIC ليعمل بنظام PWM بتردد 5KHz ودورة خدمة 50% كما هو مبين فى الشكل التالى :
مثال آخر :
استخدام الموديول CCP2 بالميكروكونترولر PIC16F877A :
كود:
void main () {
Pwm2_init (5000); // step 1: Initialize PWM2 module at 5KHz
Pwm2_Start (); //step2:start PWM2 Pwm2_Set_Duty (127); // step 3: Set duty for PWM2 : 50% while (1);
}