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

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

الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 725
نشاط [ ahmad_s_f ]
قوة السمعة:80
قديم 07-05-2010, 11:39 AM المشاركة 1   
افتراضي درس التحكم في سرعة المواتير أو شدة الإضاءة أو غيرها باستخدام pwm Twitter FaceBook Google+



بسم الله الرحمن الرحيم

أثناء تصفحي للمنتدى وجدت مشاركة كنت قد أعددتها منذ مدة تحتوي على شرح سريع عن كيفية التحكم في سرعة المواتير 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 في الأنواع التي تدعم هذه الخاصية .

في بداية البرنامج نقوم بكتابة الأمر الذي من خلاله نهيئ البك لهذه العملية ومن خلال هذا الأمر يمكننا ضبط التردد .... أنظر للمثال التالي :-
كود:
pwm_init(5000);
الأمر السابق قام بتهيئة البك وجعل التردد الخاص بالموجة هو 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_start();
بعد أن نقوم ببدء هذه العملية pwm يمكننا أن نقوم بتغيير الـ duty cycle لنغير الفولت ( الذي بدوره يغير سرعة الموتور )

===============
في النهاية : إذا أردنا أن نوقف هذه الموجة ولا نخرج أي جهد من الطرف ccp1 علينا أن نكتب الأمر التالي :
كود:
pwm_stop();
==============================================
معلومة إضافية مهمة : بعض أنواع المتحكمات ( البك ) تحتوي على اثنين 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 لأن سرعة استجابته عالية جدا .


=================
وأخيرا : إذا استفدتم من هذا الشرح لا تنسونا من دعواتكم
=================

وفقنا الله جميعا لما يحب ويرضى ورزقنا وإياكم العلم النافع والعمل الصالح
اللهم ارزقنا حبك يا كريم
والسلام عليكم ورحمة الله وبركاته

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

الصورة الرمزية Eng-Rayan
Eng-Rayan
:: عضو فضي ::
تاريخ التسجيل: Feb 2010
الدولة: تونس (بدرس بالأردن)
المشاركات: 455
نشاط [ Eng-Rayan ]
قوة السمعة:79
قديم 07-05-2010, 11:52 AM المشاركة 2   
افتراضي


ربنا يكرمك
شرح مفيد و رائر
شكرا لك

معذرة و لكن رابط المحاكاة و الكود لا يعمل


التعديل الأخير تم بواسطة : Eng-Rayan بتاريخ 07-05-2010 الساعة 11:57 AM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 725
نشاط [ ahmad_s_f ]
قوة السمعة:80
قديم 07-05-2010, 12:14 PM المشاركة 3   
افتراضي


سأقوم بتعديله بإذن الله


الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 725
نشاط [ ahmad_s_f ]
قوة السمعة:80
قديم 07-05-2010, 12:30 PM المشاركة 4   
افتراضي


كود:
char x; void main () { portb=0xff; trisb=0; pwm_init(5000); pwm_start(); while(1) { pwm_change_duty(100); delay_ms(2000); pwm_change_duty(150); delay_ms(2000); pwm_change_duty(200); delay_ms(2000); pwm_change_duty(250); delay_ms(2000); } }
هذا مثال بسيط .. بالنسبة لملف المحاكاة فلدي مشكلة للأسف في حاسبي الشخصي .. الرجاء أن يتبرع أحد الإخوة وأن يقوم بعمل ملف المحاكاة .

كل ما في الأمر أننا نحضر موتور ونوصله بطرف الميكروكنترولر المكتوب بجواره ccp1 .
(ليس شرطا أن نوصل الترانزستور أثناء المحاكاة )

وسنلاحظ عند تشغيل الدائرة تغير سرعة الموتور .


تمنياتي بالتوفيق


s00ndream
:: مهندس ::
تاريخ التسجيل: Mar 2010
المشاركات: 18
نشاط [ s00ndream ]
قوة السمعة:0
قديم 07-05-2010, 02:46 PM المشاركة 5   
افتراضي اللهم لك الحمد والشكر


استاذي المحترم.. أشكر الله ان رجعت لنا سالما معافا متع الله بالعافية..

استاذي جربت الكود باستخدام البيك والموتور فقط في البروتوس وعندما اشغله يظهر لي مربع صغير يومض ومضا فهل يعني هذا انه اشتغل ام انني اخطأت..


والامر الاخر استاذي..كيف نستطيع الاستفادة في مسالة التحكم بالاضاء واسف على الاطالة استاذي..


صهيب البلال
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2009
المشاركات: 85
نشاط [ صهيب البلال ]
قوة السمعة:0
قديم 07-05-2010, 03:13 PM المشاركة 6   
افتراضي


جزاك الله خيرا استاذي الفاضل على هذا الشرح
هنا ملف المحاكاة
http://www.4shared.com/file/FHMainco/motor.html
ارجو ان يكون هو المطلوب
وشكرا


الصورة الرمزية Eng-Rayan
Eng-Rayan
:: عضو فضي ::
تاريخ التسجيل: Feb 2010
الدولة: تونس (بدرس بالأردن)
المشاركات: 455
نشاط [ Eng-Rayan ]
قوة السمعة:79
قديم 07-05-2010, 03:28 PM المشاركة 7   
افتراضي


اخ صهيب اظن ان ملف الsimultion غلط لان الموتور لا يغير سرعته


الصورة الرمزية king5star
king5star
:: مهندس جيد ::
تاريخ التسجيل: Jun 2008
الدولة: Alexandria, Egypt
المشاركات: 240
نشاط [ king5star ]
قوة السمعة:0
قديم 07-05-2010, 06:18 PM المشاركة 8   
افتراضي


تسلم ايدك يا بشمهندس على الشغل الجميل والاهتمام بتوصيل كل شئ الى تلاميذك وشكراً مرة ثانية

إضافة رد

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

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

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


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

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