التجربه العاشره :- تعديل عرض النبضات PWM

PWM اختصار لـ Pulse Width Modulation . المقصود هو إرسال موجة مربعة أو مستطيلة square wave هذه الموجة عبارة عن hi و low كما هو معلوم فمثلا لو لدينا مصدر جهد خمسة فولت وقمنا بعمل موجة منه عن طريق المايكروكنترولر مثلا هذه الموجة قد تجعل معدل جهد الخرج أقل من خمسة فولت (  4 فولت أو 3 أو 2.4 أو .. كما نريد ) ومن المعلومات المهمة الخاصة بالموتور dc أنه كلما قل الفولت الداخل إليه كلما قلت سرعته 

.

اولا :- لمحه عنPWM 

الكثير من دوائر التحكم فى القدرة الكهربائية تستخدم تقنية "التعديل فى عرض النبضاتPWM كأساس لعملها .لفهم كيف تقوم هذه التقنية بالتحكم فى القدرة الكهربائية , تخيل جزء من دائرة على شكل مفتاح "سريع الفعل" والحمل المراد التحكم فيه (مصباح على سبيل المثال) كما فى الشكل التالى 


عندما يكون المفتاح مفتوح open لا يمر تيار فى المصباح وتكون القدرة المغذاة بصفر . فى لحظة غلق closeالمفتاح يستقبل الحمل الجهد الكامل للمصدر ويتم الإمداد بأقصى قدرة

كيف نمد الحمل بقدرة متوسطة ؟ ولتكن 50% على سبيل المثال . أحد الأفكار هى جعل المفتاح يفتح ويغلق بسرعة للحصول على زمن فتح 50% وزمن غلق 50% . هذا يعنى أن , فى المتوسط , نصف الزمن يوجد به تيار (قدرة) ونصف الزمن لا يوجد به تيار (قدرة(

يمكن القول أن القدرة المتوسطة كما لو كنا طبقنا جهد متوسط بقيمة 50% من جهد الدخل




لاحظ أن غلق المفتاح يمكن أن يحدد عرض (زمن تواجد ) النبضة طالما أنه ظل فى هذه الحالة , وأن الفترة الزمنية بين النبضات تستمر طالما أنه مفتوح . ويعرف مجموع الإثنين معا "بالزمن الدورى " للدورة والذى يتحكم فى التردد . تعرف العلاقة بين زمن تواجد النبضة والزمن الكلى (الزمن الدورى) "بدورة الخدمةdutycycle .بتغيير عرض النبضة يمكننا التحكم فى القدرة المتوسطة المغذاة للحمل. وبالتالى عندما يتغير عرض النبضة من الصفر إلى أقصى قدرة تتغير أيضا دورة الخدمة كما هو مبين بالشكل التالى
هذا المبدأ يستخدم للتحكم الدقيق باستخدام PWMعن طريق تعديل (تغيير) عرض النبضة للتحكم فى دورة الخدمة للإشارة المطبقة على الحمل وبالتالى القدرة المغذاة إليه .
التعديل فى عرض النبضات PWM من أحد التقنيات القوية المستخدمة فى أنظمة التحكم حاليافهى تستخدم فى التحكم فى سرعة المحركات وفى القياسات وفى الاتصالات وفى التحكم فى القدرة .
يتم إنجاز التعديل فى عرض النبضات بمساعدة "موجة مربعة" والتى يتم تغيير "دورة خدمتها" ( زمن دوام أو فعالية النبضة ONtime وزمن تلاشى أو عدم فعالية النبضة) بغرض الحصول على "جهد خرج متغير" كنتيجة "للقيمة المتوسطة " للشكل الموجى كما فى الشكل العلوى , حيث Ton هو الزمن الذى يكون فيه الخرج مرتفعا و Toff هو الزمن الذى يكون فيه الخرج منخفضا . الزمن الإجمالى هو الزمن الدورى period للموجة حيث 

Ttotal = Ton +Toff 

يعرف دورة الخدمة Dutycycle للموجة المربعة بالصيغة التالية
D = Ton / (Ton+Toff)= Ton/Ttotal
جهد الخرج يتغيرمع دورة الخدمة بالصيغة التالية :
Vout = D x Vin

Vout = (Ton/Ttotal) x VIN
من هذه العلاقة يتضح أن جهد الخرج يمكن أن يتغير مباشرة عن طريق تغيير قيمة Ton . فإذا كانت Ton فإن Vout يكون بصفر أيضا
أمثلة 
بالرجوع إلى الشكل العلوى : إذا كان المنطق صفر logic(0) يدل (يشير) على حالة الفصل switch-off وأن المنطق واحد logic(1) يدل على حالة التوصيل switch-on فإن القدرة التى يستهلكها الحمل سوف تتناسب مباشرة مع فترة دوام (بقاء – وجود ) النبضة pulseduration.
مثال آخر شائع الاستخدام عمليا هو استخدام الإشارات ذات التعديل فى عرض النبضات PWM فى دوائر لتوليد إشارات بأشكال موجية محددة مثل الشكل الموجى الجيبى.

ثانيا مكتبهPWM
الميكركونترولر PIC16F877A, على سبيل المثال , فى بناءه الداخلى 2 موديول CCP "إلتقاط – مقارنة - تعديل بعرض النبضةهما CCP1 و CCP2 .
يمكننا التعامل بسهولة مع التعليمات الخاصة بتوليد أشارة ذات تعديل عرض النبضة PWM بالميكروسى برو.
ملحوظات هامة :
بعض الميكروكونترولر بها وحدات CCP متعددة . لكى تستخدم دوال مكتبة وحدة CCP محددةببياطة غير الرقم واحد بنموذج الدالة برقم الوحدة التى ترغب فى استخدامها , مثل PWM2_Start(); .
جميع وحدات PWM تستخدم المؤقت Timer2 فى عملها , لذلك لن تستطيع تعيين ترددات مختلفة لوحدات PWM مختلفة .

الدوال التى تتناول الموديول CCP1, هى 

 تستخدم الدالة Pwm_Init() فى تحديد تردد إشارة PWM بالهرتز (دورة لكل ثانية)
الصيغة :
void PWM1_Init(const long freq);
هذه الدالة تقوم بتهيئة وحدة PWM للبدء "بنسبة دورة خدمة تساوى الصفر " . البارامتر freq هوالتردد بالهرتز Hz المطلوب من وحدة PWM العمل به ( يجب الرجوع للداتا شيت الخاصة بالميكروكونترولر لمعرفة القيم الصحيحة الصالحة مع التردد Fosc ) . هذه الدالة "ليس لها عائد" ويجب إستدعاؤها قبل استخدام إى دالة أخرى من مكتبة PWM .
ملحوظة
حساب قيمة تردد PWM تم عن طريق المترجم ولذلك يحتاج المترجم لمعرفة البارامتر عند الترجمة وهذا هو السبب فى أن البارامتر freq يجب أن يكون "ثابت" const long
وليس متغير
ضبط دورة الخدمة لنظام PWM بالقيمة الموجودة فى متغير وتكون في الصوره التاليهPWM1_Set_Duty(192);وهذا يدل علي نسبه الاشاره 75% حيث يوضع الارقام من صفر الي 255 حيث صفر يكون الاشاره نسبتها صفر اما 127 فتكون نسبه الاشاره 50% ووضع الرقم 192 يعني ان الاشاره 75% او بمعني اخر عند اضاءه ليد علي طرف الذي يدعم PWMتكون الاشاره صفر% اي اليد منطفئ  اما 50% فيكون يضئ بنصف طقاته اما 75% فتعنى ان الليد يضئ بنسبه 75% وهكذا
داله بدايه العمل بنظامPWMولكن يجب ان يكتب قبله امر اعداد PWMوهوPWM1_Init(5000); وتكون هذه الداله علي الشكل التالي PWM1_Start();
داله نهايه العمل بنظامPWMولكن يجب ان يكتب قبله امر اعداد PWMوهوPWM1_Init(5000);وتكون هذه الداله علي الشكل التالي PWM1_Stop();

مخطط الدائرة


البرنامج

sbit DOWN at Rc0_bit;
 sbit UP at Rc1_bit;
 unsigned short new_DC, current_DC;
 void time(){
  Delay_ms(300);
 }
 void main() {
 CMCON = 0x07;
 PORTc = 0x00;
 TRISc = 0b00000011;                                               // RB0, RB1 input, RB3 (PWM1) output
 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
   time();
   if (new_DC < 250)                                             // Don't go above 250
   new_DC = new_DC + 25 ;                               // increment Duty Cycle by 25
  }
  if (!DOWN) {                                                      // If the button connected to RB1 is pressed
   time();
   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);
}

شرح البرنامج

النتائج 


فيديو التجربة

هناك 7 تعليقات :

  1. جزاك الله كل خير على هذا الشرح الرائع.

    ردحذف
  2. جزاك الله خيرا.

    ردحذف
  3. جعلها الله في ميزان حسناتك

    ردحذف
  4. كيف نستعمل هذه التعليمة للتحكم في حرارة المزدوجة الحرارية max 6675 مع الميكروكنترولر 16f876
    أرجو المساعدة

    ردحذف
  5. اخي العزيز
    كيف أستطيع تحويل الفولت من 5 فولت الي ٢فولت
    وشرح وافي
    واذا فيه احد يعرف يعطيني خبر
    شكرًا

    ردحذف
  6. Win Real Money with JackpotCity Casino - Get a 100% Bonus
    Jackpot City herzamanindir.com/ Casino is an instant-play and mobile casino, 토토사이트 launched in 2017. It is a new 1xbet app online gambling site https://deccasino.com/review/merit-casino/ that features goyangfc.com slots, poker, bingo,

    ردحذف