بسم الله الرحمن الرحيم
أثناء تصفحي للمنتدى وجدت مشاركة كنت قد أعددتها منذ مدة تحتوي على شرح سريع عن كيفية التحكم في سرعة المواتير DC Motros باستخدام خاصية
pwm
فقررت أن أنقل هذه المشاركة لكم لتعم الفائدة أكثر حيث أنها تعتبر درس مستقل
وإليكم الدرس ,,
===========================
والآن لنقوم بشرح pwm والذي من أهم استخداماته التحكم في سرعة الموتور dc motor وكذلك التحكم في شدة الإضاءة .
أولا :: PWM اختصار لـ Pulse Width Modulation . المقصود هو إرسال موجة مربعة أو مستطيلة sqare wave هذه الموجة عبارة عن hi و low كما هو معلوم فمثلا لو لدينا مصدر جهد خمسة فولت وقمنا بعمل موجة منه عن طريق المايكروكنترولر مثلا هذه الموجة قد تجعل معدل جهد الخرج أقل من خمسة فولت ( 4 فولت أو 3 أو 2.4 أو .. كما نريد ) ومن المعلومات المهمة الخاصة بالموتور dc أنه كلما قل الفولت الداخل إليه كلما قلت سرعته .
ثانيا : يمكننا عمل موجة عبارة عن hi , low بينهم زمن انتظار معين ومن خلال هذا الزمن يمكننا التحكم في الموجة الناتجة وبالتالي التحكم في الفولت الناتج أو الطاقة الناتجة وبالتالي التحكم في سرعة الموتور لأن سرعة الموتور تتغير إذا تغير جهد التغذية (فمثلا لو كان الجهد خمسة سيلف الموتور بسرعة معينة ولو كان الجهد ستة فولت سيلف بسرعة أكبر وهكذا .. على حسب نوع الموتور) .
أيضا يمكننا التحكم في شدة الإضاءة ,, وتطبيقات أخرى كثيرة .
ويمكن عمل ذلك في أي نوع من أنواع الـ pic فمثلا يمكننا كتابة الكود التالي :
كود:
wave:
portb.f0=1;
delay_us(500);
portb.f0=0;
delay_us(500);
goto wave;
الأوامر السابقة ستجعل البك يقوم بعمل موجة من الـ hi ,low أو ما نسميه بالواحد المنطقي والصفر المنطقي أو خمسة وفولت وصفر فولت ( أيا كانت التسمية)
هنا سنطبق خمسة فولت من الطرفB0 لمدة خمسمائة مايكرو ثانية ثم بعد ذلك نطبق صفر فولت لنفس المدة ثم تتكرر هذه الموجة باستمرار .
بتغيير هذا الوقت ( وقت الإنتظار 500 في هذا المثال ) يمكننا التحكم في الفولت الناتج فتغييرنا في هذا الرقم يقوم بتغيير ما يعرف بـ duty cycle .
ما فائدة الـ duty cycle ؟؟ إنه هو المسؤول عن الفولت الناتج عن عملية PWM وهو عبارة عن نسبة مئوية . فمثلا لو كان لدينا جهد المصدر خمسة فولت وجعلنا الـ duty cycle بخمسين في المئة 50% فإن معدل الفولت الناتج سيكون 2.5 فولت . ولو جعلنا الـ duty cycle بخمسة وعشرين في المئة 25% فإن معدل الفولت الناتج سيكون 1.25 فولت وهكذا ...
الطريقة السابقة يمكننا تنفيذها مع أي نوع من أنواع الميكروكنترولر لكننا نحتاج لمعادلات وبعض الحسابات لنعرف الفولت الناتج ولنعرف duty cycle .
(هذه الطريقة ليست موضوعنا الآن )
============================
ثالثا : هناك بعض الأنواع من المايكروكنترولر تدعم خاصية pwm بشكل مباشر حيث يوجد في داخل الميكروكنترولر هاردوير خاص بهذه المسألة ويوجد طرق برمجية أسهل تسهل عملية حساب duty cycle وتسهل حساب التردد . هذه الأنواع من البك pic التي تدعم هذه الخاصية تجد أحد أطرافها مكتوب بجواره ccp1 أو ccp2 . وتمتاز هذه الأنواع من البك أنه يمكنك أن تولد موجة من أحد الأطراف في نفس الوقت الذي ينفذ فيه البك أوامر أخرى وعمليات أخرى .
( وهذا طبعا لا نستطيع عمله في الأنواع التي لا تدعم pwm بشكل داخلي )
أهم الأنواع التي تدعم خاصية pwm بشكل مباشر والمتوفرة في الأسواق العربية
pic16f628a
pic16f877a
============================
رابعا : شرح الأوامر التي من خلالها نستطيع استخدام pwm في الأنواع التي تدعم هذه الخاصية .
في بداية البرنامج نقوم بكتابة الأمر الذي من خلاله نهيئ البك لهذه العملية ومن خلال هذا الأمر يمكننا ضبط التردد .... أنظر للمثال التالي :-
الأمر السابق قام بتهيئة البك وجعل التردد الخاص بالموجة هو 5 كيلو هيرتز ( 5000 هيرتز ) .. ويمكنك تغيير هذا الرقم ( هذا التردد ) على حسب الحاجة فبعض أنواع المواتير تحتاج لتردد معين . مثل مواتير السيرفو .
الأمر الثاني وهو الأهم على الإطلاق هو
كود:
pwm_change_duty(128);
هذا الأمر من خلاله نستطيع بكل سهولة ويسر تغيير الـ duty cycle الذي يغير الفولت الناتج . ففي المثال السابق ستكون النسبة ( duty cycle ) تساوي خمسين في المئة تقريبا أي لو كان الجهد المصدري خمسة فولت سيكون الفولت الناتج عن pwm هو 2.5 فولت .
ولكن كيف عرفت أن الـ duty cycle ستكون 50% ؟
ببساطة عن طريق الرقم المكتوب بين القوسين هنا في المثال السابق هو 128
إن الرقم المحصور بين هذين القوسين يجب أن يكون محصور بين الصفر و 255 .
فمثلا لو كان الرقم هو 128 فإننا يمكننا حساب duty cycle بواسطة المعادلة البسيطة التالية
الـ duty cycle = الرقم الذي بين القوسين على 255 ضرب 100%
هنا الـduty cycle = 128 /255
أي يساوي تقريبا 50 في المئة
=====================================
والآن ماذا لو كتبنا الأمر التالي :
كود:
pwm_change_duty(172);
ستكون النسبة المئوية لـ duty cycle هي خمسة وسبعون بالمئة 75%
لماذا ؟؟
172/255 = 75 % تقريبا وبالتالي يكون الفولت الناتج عن هذا الأمر لو كان الجهد المصدري لنا خمسة فولت ... 75. ضرب 5 = 3.75 فولت .
===============
عليك أن تنتبه أن الموجة المطلوبة لن تخرج إلا عن طريق الأمر الذي يبدأ هذه العملية وهذا الأمر هو :
بعد أن نقوم ببدء هذه العملية pwm يمكننا أن نقوم بتغيير الـ duty cycle لنغير الفولت ( الذي بدوره يغير سرعة الموتور )
===============
في النهاية :
إذا أردنا أن نوقف هذه الموجة ولا نخرج أي جهد من الطرف ccp1 علينا أن نكتب الأمر التالي :
==============================================
معلومة إضافية مهمة : بعض أنواع المتحكمات ( البك ) تحتوي على اثنين PWM وبالتالي يمكننا التحكم من خلالهما في موتورين كل موتور بسرعة معينة كما نريد ومن الأمثلة على هذه المتحكمات pic16f877a . فهو يحتوي على طرفين
ccp1
و
ccp2
يمكنك أن توصل بكل طرف منهم موتور يعمل بسرعة مستقلة عن الآخر .
ولكن كيف سأقوم بعمل ذلك في البرمجة :
الأمر بسيط جدا في لغة مايكروسي إن الأوامر السابقة التي كتبنها ستجعل البك يستخدم الطرف CCP1 أما إذا أردنا استخدام ccp2 فقط قم باستخدام نفس الأوامر ولكن مع إضافة الرقم اثنين . وإليك الأوامر التالية بعد إضافة الرقم اثنين :
كود:
pwm2_init(5000);
pwm2_change_duty(200):
pwm2_start();
pwm2_stop();
طبعا الأرقام التي بين الأقواس يمكنك تغييرها .
وبهذا يمكنك التحكم في سرعت موتورين أحدهما موصل بالطرف ccp1 والآخر ccp2
يمكنكم تحميل ملف أعددته مثال على التحكم في سرعة الموتور
به ملف الكود و المحاكاة ..
للتحميل من هنا
================= إضافة لم تكن موجودة .
ملاحظة هامة : يجب أن نقوم بتوصيل الموتور باستخدام ترانزستور لأن معظم المواتير تحتاج لتيار كبير لكي تعمل وتيار أكبر في بداية التشغيل وهذا التيار أكبر بكثير من التيار الذي يستطيع أن يقدمه الميكروكنترولر .
إذن لو كان الموتور مثلا يحتاج 24 فولت سنستخدم ترانزستور ونجعل تغذية الـ collector تساوي 24 فولت ( VCC=24 volt ) .
الملاحظة الثانية يجب أن نقوم بتوصيل دايود مع الموتور للحماية من التيار العكسي الناتج عن خاصية الحث الذاتي وهذا الدايود نستخدمه في أي تطبيق به ملف مثل الريلاي والموتور .
لاحظ الصورة التالية :
أيضا من الخطأ التحكم في سرعة الموتور عن طريق تشغيل واطفاء الريلاي ( أقصد الريلاي العادي وليس الـ reed relay ) وذلك لأننا نقوم بتوليد نبضات سريعة تشغيل واطفاء تشغيل واطفاء وللأسف سرعة استجابة الريلاي العادي بطئية جدا فربما لا يستطيع أن يعمل وينطفئ إلا مرات معدودة في الثانية الواحدة فبالتالي لن يكون مناسب في هذا التطبيق لذا نستخدم الترانزستور سواءا كان BJT أو MOSFET لأن سرعة استجابته عالية جدا .
=================
وأخيرا : إذا استفدتم من هذا الشرح لا تنسونا من دعواتكم
=================
وفقنا الله جميعا لما يحب ويرضى ورزقنا وإياكم العلم النافع والعمل الصالح
اللهم ارزقنا حبك يا كريم
والسلام عليكم ورحمة الله وبركاته