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

   

الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 632
نشاط [ ahmad_s_f ]
قوة السمعة:
قديم 10-04-2009, 09:29 PM المشاركة 25   
افتراضي



هذه صورة ملف المحاكاة من جديد
اضغط هنا


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

لتحميل ملف المحاكة من هنا

وإن شاء الله خلال يوم أو يومين أشرح الأوامر وكيفية التحكم بالتفصيل .

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

اعلانات

polarise
:: مهندس ::
تاريخ التسجيل: Apr 2009
الدولة: egypt
المشاركات: 6
نشاط [ polarise ]
قوة السمعة:
قديم 10-04-2009, 10:19 PM المشاركة 26   
افتراضي


هو ممكن يابشمهندس تكتب نفس الكود ده بس بالبيسك عشان افهمه

كمان هو الكود ده خاص بالبيك 16 بس ولا ممكن استخدمه ف اليك 18

وشكرا

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

zainab.hm
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
المشاركات: 67
نشاط [ zainab.hm ]
قوة السمعة:
قديم 11-04-2009, 12:05 AM المشاركة 27   
افتراضي


هل يمكن استخدامpic16f877
شكرا لك استاذ سمير


الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 632
نشاط [ ahmad_s_f ]
قوة السمعة:
قديم 11-04-2009, 06:42 PM المشاركة 28   
افتراضي


يمكن استخدام هذا الكود للعائلة 16 و 18 بشرط أن يكون البك المستخدم يدعم خاصية pwm ونعرف ذلك من خلال الأطراف فإذا كان أحد الأطراف مكتوب عليه ccp1 أو ccp2 فهذا يدل على وجود هذه الخاصية وإذا لم تكن موجودة فيمكن عمل pwm ولكن بكود مختلف .
نعم يمكن استخدام pic16f877a كل ما سيتم تغييره هو في ملف المشروع يتم تغيير نوع البك فقط .

============
ملحوظة اسمي هو احمد سمير وليس سمير .


zainab.hm
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
المشاركات: 67
نشاط [ zainab.hm ]
قوة السمعة:
قديم 11-04-2009, 07:34 PM المشاركة 29   
افتراضي


هل اوقف المحرك عن العمل بتعليمة
pwm_start()
جربتها لكنه لم يتوقف
استاذ سمير بانتظار شرحك لللاوامر


zainab.hm
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
المشاركات: 67
نشاط [ zainab.hm ]
قوة السمعة:
قديم 11-04-2009, 07:45 PM المشاركة 30   
افتراضي


اعتذر لم انتبه على الملحوظة استاذ احمد ولا اعلم كيف اشكرك على مساعدتك


الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 632
نشاط [ ahmad_s_f ]
قوة السمعة:
قديم 11-04-2009, 08:16 PM المشاركة 31   
افتراضي


هل اوقف المحرك عن العمل بتعليمة
pwm_start()
جربتها لكنه لم يتوقف
لا هذا الأمر هو الذي يسمح له بالبدء وليس التوقف .

-----------------

لإيقاف إرسال النبضات ( إيقاف pwm ) نستخدم الأمر التالي


كود:
pwm_stop();
-----------------
هل نجحتي في تشغيل ملف المحاكاة وملاحظة تغير سرعة الموتور ؟؟


الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 632
نشاط [ ahmad_s_f ]
قوة السمعة:
قديم 11-04-2009, 08:48 PM المشاركة 32   
افتراضي يا كريم يا منان ارزقنا حبك يا رب و ارزقنا حسن التوكل عليك


والآن لنقوم بشرح 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

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

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


التعديل الأخير تم بواسطة : ahmad_s_f بتاريخ 07-05-2010 الساعة 02:19 PM السبب: لدمج المشاركتين


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