توجه :
 
 چنانچه مفاهیم یا عبارت ها و اصطلاحات به کار رفته در این صفحه را متوجه نمی شوید، می توانید مطالعه خود را از اولین جلسه آموزشی رباتیک شروع نمایید. بدین منظور روی لینک زیر کلیک فرمایید:
 
 
همچنین چنانچه بخشی از مطالب را قبلا خوانده اید، برای مشاهده فهرست موضوعات جلسات آموزشی رباتیک، لطفا روی لینک زیر کلیک فرمایید:
 
 
در این بخش از سایت رشد، مطالب آموزشی در زمینه رباتیک با زبان بسیار ساده و بر مبنای مطالبی که در سنین راهنمایی آموخته اید ارائه شده و در هر جلسه مطالب جدیدی آموزش داده شده اند.
 آخرین مطالب
 جلسه‌ي سي و ششم
جلسه‌ي سي و ششم
ادامه‌ي مبحث PWM، توابع ايجاد وقفه (Delay)، رجيستر‌هاي OCRx و ...

به نام خدا
با عرض سلام خدمت دوستان عزيز
در اين جلسه نيز مبحث PWM را دنبال مي‌كنيم. عزيزان براي درك مطالب اين جلسه حتماً بايد جلسه‌ي قبل را مطالعه كرده باشند. در اين جلسه به  آي‌سي L298 نيز اشاراتي شده است كه دوستان مي‌توانند جهت ياد‌اوري، بخش مربوط به L298 در جلسه‌ي 17 را نيز مرور كنند.

ابتدا با توابعي كه براي ايجاد وقفه در اجراي دستورات برنامه توسط CodeVision براي كاربران در نظر گرفته شده آشنا مي‌شويم.
همان‌طور كه در جلسه‌ي پيش ديديم، در قسمت‌هايي از برنامه ممكن است نياز پيدا كنيم تا براي لحظاتي روند اجراي دستورات را متوقف كنيم. CodeVision براي اين كار توابعي را از پيش تنظيم كرده است. (در مورد مبحث «توابع» در زبان C در آينده مفصل توضيح خواهيم داد.)


delay



براي ايجاد تاخير در روند اجراي دستورات، CodeVision دو تابع زير را در اختيار ما قرار داده است.

delay_ms( );
delay_us( );





تابع ()delay_ms براي ايجاد تاخير‌هايي در حد ميلي ثانيه به كار مي‌رود. در داخل پرانتز، يك عدد صحيح مثبت مي‌نويسيم كه نشان دهنده‌ي اندازه‌ي تاخير مورد نيز ما بر حسب ميلي ثانيه است. به بيان ساده‌تر، مثلاً اگر داخل پرانتز عدد 100 را بنويسيم، روند اجراي برنامه به اندازه‌ي 100 ميلي ثانيه در همان خط متوقف خواهد شد.
تابع ()delay_us براي ايجاد تاخير‌هايي در حد ميكروثانيه به كار مي‌رود. نحوه‌ي استفاده از آن دقيقاً مانند ()delay_ms است.
به عنوان يك مثال عملي،همان برنامه‌ي ايجاد PWM 2.5 ولت را با استفاده از توابع delay بازنويسي مي‌كنيم.

while(1)
{
PORTB.4=1;
delay_ms(5);   // 5 milliseconds delay
PORTB.4=0; 
delay_ms(5);    //5 milliseconds delay
}











تنها نكته‌ي بسيار مهم در استفاده از توابع delay اضافه كردن هِدِرفايل Header file  باعنوان delay.h به برنامه است.( در مورد هدر فايل‌ها هم در آينده توضيح خواهيم داد، اما در اين جلسه هيچ توضيحي در مورد آن نمي‌دهيم تا از بحث اصلي يعني PWM منحرف نشويم.) براي اين كار، جمله

 ‌كه اولين جمله‌ي برنامه‌ي شما است را پيدا كنيد. (اين جمله را CodeWizard در برنامه‌ي شما نوشته است). حال كافيست اين جمله را درست زير ان تايپ كنيد:

دقت كنيد كه اين دستور نيازي به « ; » ندارد !!

با آموختن تابع delay، ديگر شما مي‌توانيد هر ولتاژي را كه مي‌خواهيد بر روي پايه‌هاي خروجي ايجاد كنيد. البته دوستان دقت داشته باشند كه ولتاژي كه با تكنيك PWM شبيه سازي مي‌شوند، در حقيقت ولتاژ خاصي نيستند و فقط شبيه سازي شده‌ي ولتاژهاي مختلف هستند. هرچند كه در راه‌اندازي موتورها اين تكنيك بسيار كارآمد است، اما بايد دقت نظر لازم را در استفاده از اين تكنيك در ساير موارد را داشته باشيد.

همانطور كه مي‌دانيد موتور‌هاي متعارفي كه براي ساخت ربات‌ها استفاده مي‌شود،ممكن است ولتاژ‌هاي كاري مختلفي داشته باشند (مثلاً 12ولت، 24 ولت، 6 ولت و ...) و براي راه‌اندازي آن‌ها بايد از درايور‌هاي موتور مثل L298 استفاده ‌كنيم.  سوالي كه ممكن است پيش آيد اين است كه وقتي ما ميكروكنترلر را به درايور‌هاي موتور(مثل L298) وصل مي‌كنيم و از تكنيك PWM براي كنترل سرعت موتور استفاده مي‌كنيم، چه وضعيتي پيش مي‌آيد؟ مثلاً وقتي ما PWM مربوط به ولتاژ 2.5 ولت را توليد مي‌كنيم، درايور ما چه عكس العملي نشان مي‌دهد؟ آيا ولتاژ 2.5 ولت بر روي پايه‌هاي موتور قرار مي‌گيرد؟

براي پاسخ دادن به اين سوال بايد به ساختار PWM دقت كنيم، ما وقتي PWM مربوط  به 2.5 ولت را توليد مي‌كنيم، در حقيقت سطح ولتاژ خروجي را با فواصل زماني برابر 0 و 1 مي‌كنيم، پس اگر اين خروجي را، به ورودي L298 وصل كنيم(مثلاً پايه‌ي 7)، L298 نيز موتور را با همين الگو ‌كنترل مي‌كند و ولتاژي كه به موتور مي‌دهد را 0 و 1  مي‌كند. و همانطور كه مي‌دانيد، L298 هر ولتاژي كه بر روي پايه‌‌ي شماره‌ي 4 آن قرار گرفته باشد را بر روي موتور قرار مي‌دهد(اگر ولتاژ كاري موتور 12 ولت باشد، بايد اين پايه به 12 ولت متصل شود) . پس جواب سوال بالا منفيست!!!  وقتي ما PWM مربوط به 2.5 ولت را توليد مي‌كنيم، در حقيقت سطح ولتاژ خروجي در 50 درصد زمان 1 و بقيه‌ي زمان 0 است. پس اگر همان طور كه در بالا اشاره شد، اين PWM به درايوري مثل L298 داده شود، و ولتاژ پايه‌ي 4 ِ آن 12ولت باشد، درايور، ولتاژ 6 ولت را به موتور مي‌دهد. در نتيجه اهميتي ندارد چه ولتاژي بر روي پايه‌ي 4 ِ L298 قرار گرفته باشد، وقتي كه ما PWM مربوط به 2.5 ولت را توليد مي‌كنيم، درايور ولتاژي كه به موتور مي‌دهد را 50 درصد مي‌كند. در نتيجه بهتر است از اين به بعد به جاي آن كه بگوييم PWM مربوط به 2.5 ولت، بگوييم PWMااا50 درصد. يا به جاي PWM ِمربوط به 1 ولت، بگوييم PWMااا20 درصد


PWM در ميكروكنترلر‌هاي AVR




انجام تنظيمات اوليه براي استفاده از PWM براي راه اندازي موتور درميكروكنترلر‌هاي AVR كمي پيچيده است، اما در اينجا هم CodeWizard به كمك ما آمده است و كار را كمي ساده‌تر كرده است. ما در جلسه‌ي آينده  بخشي از تنظيمات CodeWizard را بدون توضيح مطرح مي‌نماييم، زيرا توضيح هر بخش از آن نيازمند مقدمات مفصلي است و تاثير چنداني هم در روند كار ما ندارد، اما به دوستاني كه مي‌خواهند ميكروكنترلر را كاملاً حرفه‌اي دنبال كنند، پيشنهاد مي‌كنم از منابعي كه قبلاً معرفي شده است، مطالب را تكميل كنند.
به هر حال دوستان عزيز با انجام اين تنظيمات اوليه‌ي مختصر در CodeWizard، مي‌توانند از الگويي به مراتب ساده‌تر از آنچه تا به حال آموخته‌ايم، براي ايجاد PWM براي هدايت موتورهاي ربات استفاده نمايند.

در ميكروكنترلر‌هاي خانواده‌ي AVR، نيازي نيست در هربار استفاده از PWM ، چندين خط برنامه بنويسيم.  در ATmega16 چهارپايه‌ي مشخص از آي سي به اين موضوع اختصاص داده شده است. يعني اين چهارپايه علاوه بر كاربرد‌هاي معمولي خود، اين قابليت را دارند كه در مواقع لزوم براي توليد PWM استفاده شوند.
حال سوال اينجاست كه اين چهارپايه چه تفاوتي با بقيه‌ي پايه‌هاي خروجي آي‌سي دارند كه آن‌ها را از ساير پايه‌هاي خروجي ميكروكنترلر متمايز مي‌سازد؟
براي اين چهارپايه نيازي به اجراي الگويي كه تا به حال براي ايجاد PWM فراگرفته‌ايد نيست. در اين روش، فقط  شما بايد يك عدد صحيح بين 0 تا 255 انتخاب كنيد، و طبق الگوي زير آن را در برنامه‌ي خود بنويسيد.


يك عدد صحيح بين 0 تا 255 = نام رجيستر مربوطه‌  ;

اين عدد، بيانگر توان PWM شماست، و  شما توان PWM ِ مورد نياز خود را با اين عدد مشخص مي‌كنيد. كه 255 بالاترين توان و مربوط بهPWMااا100 درصداست، و  0 پايين‌ترين توان و مربوط به PWMااا0 درصد است.
به عنوان مثال اگر اين عدد را  128 قرار دهيد، همان PWMااا50 درصد را ايجاد كرده‌ايد. يا مثلا اگر اين عدد 51 باشد، PWMااا20 درصد بر روي پايه قرار داده‌ايد.


رجيستر‌هاي مربوط به اين 4 پايه




همانطور كه مي‌دانيد، براي پايه‌هايي كه در CodeWizard به صورت خروجي تعريف شده‌اند، رجيستري به نام «PORTx» وجود دارد كه هر مقداري در اين رجيستر قرار داده ‌شود، مقدار پايه‌هاي خروجي متناظر با آن رجيستر را مشخص مي‌كند.(رجوع به جلسه‌ي 24،تعريف رجيستر PORTx).
در اين جلسه با 4 رجيستر ديگر آشنا مي‌شويم، كه وقتي تنظيمات مربوط به PWM ِ موتور در CodeWizard را انجام  دهيم، هر مقداري كه در‌ آن‌ها ريخته شود، توان PWM پايه‌ي متناظر را مشخص مي‌كنند.
اين رجيستر‌ها OCR0، OCR1AL، OCR1BL و OCR2 نام دارند كه به ترتيب، متناظر پايه‌هاي PB.3، PD.5، PD.4  و PD.7‌ هستند.
پس مثلاً اگر در بخشي از برنامه‌ي خود بنويسيم :

OCR0=127; 



در حقيقت بر روي پايه‌ي PB.3 ميكروكنترلر، PWMااا50-درصد به وجود آورده‌ايم.

به مثال‌هاي ديگري توجه كنيد: (توضيح هر دستور در جلوي دستور و  بعد از // آورده شده است)

OCR1AL=51; // 20% Duty Cycle on PD.5
OCR1BL=255; //100% Duty Cycle on PD.4
OCR2=0;  //0% Duty Cycle on PD.7






در جلسه‌ي آينده، در مورد نحوه‌ي انجام تنظيمات اوليه‌ جهت توليد PWM در CodeWizard را توضيح خواهيم داد.

منتظر سوالات و نظرات دوستان خوبم هستم.
شاد و پيروز باشيد
دوست شما، فراز اميرغياثوند



1388/2/19 لينک مستقيم

فرستنده :
محمد رضا HyperLink HyperLink 1388/2/31
مـتـن : سلام.
خسته نباشید.
من یه ربات مسیر یاب درست کردم ،
دو تا سوال داشتم: یکی اینکه سنسور ها خطوط سیاهی رو که حس میکنن در غالب چه چیزی به میکروکنترلر (PIC16F84A) من می فرستن؟ شما تو یکی از جلسات خیلی کوتاه گفته بودید که همه ورودی های میکروکنترولر منطقی هستند و اگر سطح ولتاژ بین 0 تا 2.5 باشد ورودی ، صفر منطقی و اگر بین 2.5 تا 5 باشد ورودی یک منطقی محسوب می شود. می خواستم ببینم این یعنی اینکه سنسور ها اطلاعات رو در غالب ولتاژ به میکروکنترولر می فرستن؟ سوال دیگم این که تو چند خط از سرس میکروکنترلر PUASE 100 آورده شده ، این یعنی چی؟ مثل همون دستور DELAY کار می کنه ؟
خواهش میکنم جوابمو بدید، من باید شنبه پروژمو ارائه بدم.
از مطالب خوبتونم خیلی ممنونم. عالیه.
پاسـخ : سلام دوست عزيز.
بله، اطلاعات در غالب يك ولتاژ براي ميكروكنترلر ارسال مي‌شود.
من نمي‌دونم شما از چه كامپايلري براي ميكروكنترلتون استفاده كرديد. به هر حال مبحث ميكروكنترلر‌هاي PIC جزو مباحث آموزشي ما نيست و من نمي‌تونم اطلاعات زيادي در مورد اين پروژه در اختيار شما بذارم.
موفق باشيد.

فرستنده :
آرش HyperLink HyperLink 1388/2/31
مـتـن : سلام
آقا فراز حدودا تا کی جلسات ادامه داره؟
(کی کلا تموم میشه؟)
پاسـخ : سلام آرش جان
من نمي‌تونم جواب مشخصي به سوال شما بدم. چون رباتيك يك علم بسيار وسيع و گسترده است و هرچقدر مطلب در موردش مطرح بشه باز هم مطالب نا گفته‌ي زيادي باقي مي‌مونه. ما سعي مي‌كنيم تا جاي ممكن اين مطالب را ادامه بديم تا يك منبع نسبتاً كامل و جامع براي علاقه مندان رباتيك محيا كنيم. موفق باشي دوست عزيز

فرستنده :
مهدی HyperLink HyperLink 1388/2/31
مـتـن : سلام فراز جووووووووووووون خسته نباشی مرسی.......
میخواستم ببینم اگه مدار میکروکنترلر رو به ادابتور 5 ولت راهندازی کنیم میکروکنترلر آآآآآآتتتیشش نمیگیره.....
پاسـخ : سلام مهدي جان
ممنونم از لطفت.
نه، دليلي وجود نداره كه ميكروكنترلر آسيب ببينه، مگر اينكه ولتاژ ميكروكنترلر شما از تنظيم خارج شده باشد و ولتاژ خروجي بيش از 5 ولت باشد. موفق باشي

فرستنده :
احسان HyperLink HyperLink 1388/2/31
مـتـن : سلام فراز جان من تازه چند روزه که این سایت رو پیدا کردم و از مطالب خوبتون واقعا متشکرم. من تمام جلسات شما رو بطور کامل از اول مطالعه کردم ولی کمی در برخی از مطالب دچار ابهام شدم. آیا میتوانید چند تا از نقشه های مدارها (منبع تغذیه و درایور های موتور و...) رو برام بفرستید بطوری که بتونم از آنها بعنوان مدارهای اصلی استفاده کنم؟
با سپاس فراوان
پاسـخ : سلام
خيلي ممنونم دوست عزيزم
نقشه‌ي كامل مدار اصلي يك ربات مسيرياب مقدماتي بدون ميكروكنترلر در سايت گذاشته شده است. موفق باشيد

فرستنده :
محمد رضا HyperLink HyperLink 1388/2/31
مـتـن : دوباره سلام.
شما تو جلسه 22 گفتید که برای پروگرام کردن آی سی های AVR از نرم افزار Code Vision استفاده می شه، آی سی PIC16F84A جزء خانواده AVR هست ؟ اگه نیست برای پروگرام کردنش چه نرم افزاری لازمه ؟
پاسـخ : سلام دوست عزيز
خير، اين آي‌سي جزو خانواده ميكروكنترلر‌هاي PIC است . براي پروگرام كردن اين خانواده متود‌هاي متفاوتي وجود داره كه ما در مورد اونها توضيح نداده‌ايم.

فرستنده :
پسر آریایی HyperLink HyperLink 1388/2/31
مـتـن : سلام دوست عزیز.
از سایت بی همتاتون واقعا متشکرم.
می خواست ببینم آیا میتوان از موتور ضبط صوت به عنوان موتور روبات استفاده کرد؟؟؟؟؟
پاسـخ : سلام . خيلي ممنونم
خير، چون موتور ضبط صوت معمولاً قدرت زيادي ندارد. موفق باشيد دوست عزيز

فرستنده :
azarakhsh HyperLink HyperLink 1388/2/31
مـتـن : ba arze salam va khaste nabashid
az matalebe mofidetoon rajebeh robatic tashakor mikonam... kheyli az moshkelatam ro dar in zamine hal kardam
پاسـخ : سلام دوست عزيز
خواهش مي‌كنم، برات آرزوي موفقيت مي‌كنم دوست عزيز

نظر شما پس از تاييد در سايت قرار داده خواهد شد
نام :
پست الکترونيکي :
صفحه شخصي :
نظر:
تایید انصراف
 

 

 فعاليت هاي علمي
 تماس با ما