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

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 30-07-2017, 01:06 PM المشاركة 1   
افتراضي التعديل فى عرض النبضات PWM Twitter FaceBook Google+



التعديل فى عرض النبضات PWM



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



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



لاحظ أن غلق المفتاح يمكن أن يحدد عرض (زمن تواجد ) النبضة طالما أنه ظل فى هذه الحالة ، وأن الفترة الزمنية بين النبضات تستمر طالما أنه مفتوح . ويعرف مجموع الإثنين معا "بالزمن الدورى " للدورة والذى يتحكم فى التردد . العلاقة بين زمن تواجد النبضة والزمن الكلى (الزمن الدورى) تعرف"بدورة الخدمة أو العمل " duty cycle .
بتغيير عرض النبضة يمكننا التحكم فى القدرة المتوسطة المغذاة للحمل . وبالتالى عندما يتغير عرض النبضة من الصفر إلى أقصى قدرة تتغير أيضا دورة الخدمة كما هو مبين بالشكل التالى :



هذا المبدأ يستخدم للتحكم الدقيق باستخدام PWM عن طريق تعديل (تغيير) عرض النبضة للتحكم فى دورة الخدمة للإشارة المطبقة على الحمل وبالتالى القدرة المغذاة إليه .



مما سبق نستنج أن إشارة PWM تتحدد عن طريق :
• تردد الإشارة .
• دورة خدمة الإشارة .
العمل بتعديل عرض النبضات PWM والميكروكونترولر PIC :
الميكركونترولر PIC16F877A ، على سبيل المثال ، فى بناءه الداخلى 2 موديول CCP "إلتقاط – مقارنة - تعديل بعرض النبضة) هما CCP1 و CCP2 .
يمكننا التعامل بسهولة مع الدوال الخاصة بتوليد أشارة ذات تعديل عرض النبضة PWM بالميكروسى .
الدوال التى تتناول الموديول CCP1 هى :

كود:
• Pwm1_Init
• Pwm1_ Set _Duty
• Pwm1_Start
• Pwm1_Stop
1- دالة تهيئة تردد إشارة تعديل عرض النبضة PWM :
فى الميكروسى تستخدم الدالة Pwm_Init() فى تحديد تردد إشارة PWM :

الصيغة :

كود:
 Pwm1_Init (freq);
حيث :
freq : هو التردد المطلوب لإشارة PWM .
مثال:

كود:
Pwm1_Init (4000) // بدء توليد إشارة بتعديل عرض النبضة بتردد 4 كيلوهرتز
2- دالة "دورة الخدمة" Duty Cycle
من خلال هذه الدالة يمكن التحكم فى دورة الخدمة لأشارة PWM . قيمة دورة الخدمة تتغير من الصفر إلى 255 ، الصفر يساوى 0% والقيمة 127 تساوى 50% والقيمة 255 تساوى 100% .

الصيغة :

كود:
PWM1_Set_Duty (duty_ratio);
حيث :
duty_ratio : قيمة من نوع الحرف char (0 to 255) تحدد النسبة المئوية لدورة خدمة PWM .

مثال :

كود:
PWM1_Set_ Duty (192); // تحديد دورة الخدمة بالقيمة 75 بالمئة



ونظرا لأن الميكروكونترولر يتعامل مع الأرقام ، ينبغى تحويل النسبة المئوية لدورة الخدمة إلى رقم .
يتم حساب قيمة دورة الخدمة من العلاقة :

كود:
 (Percent * 255) / 100
• لحساب القيمة المناظرة لدورة خدمة 10 % :

كود:
 (10 * 255) / 100 = 25.5
ولأن القيمة يجب أن تكون من نوع الحرف char فيجب أن تكون عدد صحيح بين الصفر و 255 , بالتالى نأخد القيمة 25 أى :

كود:
 PWM1_Set_Duty(25);
• Duty of 50%

كود:
 (50 * 255) / 100 = 127.50
كود:
PWM1_Set_Duty(127);
• Duty of 90%

كود:
 (90 * 255) / 100 = 229.50
كود:
PWM1_Set_Duty(229);
3- دالة البدء Start ودالة الانتهاء Stop :
من خلال دالة البدء PWM1_Start(); نقوم ببدء توليد إشارة PWM بالميكروكونترولر PIC ومن خلال دالة النهاية PWM1_Stop(); يتم إنهاء توليد إشارة PWM .

الصيغة :

كود:
 Pwm1_Start (); // initial signal generation module CCP1 PWM PIC
Pwm1_Stop (); / / stops the PWM signal generation module CCP1 PIC
مثال بسيط :


كود:
void main () {
  
     Pwm1_init (5000);
     Pwm1_ Set_Duty (127);
     Pwm1_Start ();

     while (1);
}

فى هذا البرنامج يتم تهيئة الموديول CCP1 بالميكروكونترولر PIC ليعمل بنظام PWM بتردد 5Khz ودورة خدمة 50% كما هو مبين فى الشكل التالى :



مثال آخر :
استخدام الموديول CCP2 بالميكروكونترولر PIC16F877A :

كود:
void main() {
  
    Pwm2_init(5000);
    Pwm2_Set_Duty(127);
    Pwm2_Start();

    while(1);.
}

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )
اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 30-07-2017, 02:27 PM المشاركة 2   
افتراضي


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



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

كود:
/*
Description: CCP module generating PWM
 MCU: PIC16F628A
 Oscillator: XT, 4.0 MHz
*/
 sbit UP at RB0_bit;
 sbit DOWN at RB1_bit;
 unsigned short new_DC, current_DC;

 void debounce(){
  Delay_ms(300);
 }

 void main() {
 CMCON = 0x07; // Disable comparators
 PORTB = 0x00; 
 TRISB = 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
   debounce();
   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
   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()
النتائج :
عند توصيل القدرة للدائرة تبدأ الإضاءة بمستوى الصفر (الدورة كلها OFF مستمر ) أى دورة الخدمة بصفر . بالضغط على المفتاح الضاغط UP تتزايد دورة الخدمة (يتزايد الجزء الموجب من الدورة ON) وتتزايد شدة إضاءة الليد حتى تصل دورة الخدمة إلى الواحد الصحيح (الدورة كلها ON مستمر) .

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 30-07-2017, 02:37 PM المشاركة 3   
افتراضي


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

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



البرنامج :

كود:
/*
************************************************ 
البرنامج : دخل تناظرى و تعديل فى عرض النبضة
الغرض : التحكم فى محرك مروحة عن طريق تعديل عرض النبضات من خلال دخل تناظرى
*/

void main () {

unsigned int a = 0; // تعريف متغير نوع عدد صحيح لحفظ نتيجة التحويل من تناظرى لرقمى  

ADCON1 = 0b00001001; // تهيئة طرف الدخل التناظرى  
TRISA = 255; // تهيئة أطراف المنفذ كمداخل 

Pwm_Init (5000); // تهيئة موديول تعديل عرض النبضة بتردد 5 كيلوهرتز 
Pwm_Start (); //بدء عمل موديول تعديل عرض النبضة  

do // حلقة غير منتهية 
 {
 a=Adc_Read(0); // قراءة القناة التناظرية صفر وحفظ قيمة نتيجة التحويل فى سجل مؤقت   
 a = (a / 4); // تحويل القيمة السابقة إلى نسبة مئوية لدورة الخدمة  
 Pwm_Set_Duty (a); //إرسال دورة الخدمة إلى موديول التحكم فى عرض النبضات لتظهر على طرف الخرج الخاص به  Delay_10us; // الانتظار لمدة 10 ميكروثانية 
}
   while (1); // التكرار بصفة مستمرة 

}
الشكل الموجى الناتج كما فى الشكل التالى :






احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )

الصورة الرمزية younescdse
younescdse
:: مهندس متواجد ::
تاريخ التسجيل: Sep 2009
المشاركات: 90
نشاط [ younescdse ]
قوة السمعة:0
قديم 03-08-2017, 05:10 PM المشاركة 4   
افتراضي


بارك الله فيك
هل تم تنظيم جميع دروسك الجيدة في ملف واحد؟
لديا جزاين فقط الان

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً F.Abdelaziz ( شكر العضو على هذه المشاركة )

MJELEC
:: مهندس ::
تاريخ التسجيل: Aug 2017
المشاركات: 6
نشاط [ MJELEC ]
قوة السمعة:0
قديم 20-08-2017, 09:34 AM المشاركة 5   
افتراضي هنا تجدون مثال تطبيقي مرفق بالكود الخاص به


هنا تجدون مثال تطبيقي مرفق بالكود الخاص به

https://youtu.be/ot6RENhu758

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025