Warning: Declaration of tie_mega_menu_walker::start_el(&$output, $item, $depth, $args, $id = 0) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /home3/afgsaane/public_html/wp-content/themes/jarida/functions/theme-functions.php on line 1904
PWM بخش دوم - سایت تخصصی مهندسی برق
خانه / رباتیک / PWM بخش دوم

PWM بخش دوم

در این بخش می خواهیم بدانیم چگونه مي‌توان برنامه‌اي نوشت تا بر روي پايه‌اي دلخواه از ميكروكنترلر PWM ي براي ولتاژ 4 ولت ايجاد كرد.
هر دستوري كه بر روي خروجي‌هاي ميكروكنترلر قرار مي‌گيرد، تا زماني كه دستور بعدي، خروجي را تغيير ندهد، آن خروجي تغييري نخواهد كرد. يعني مثلاً زماني كه پايه‌اي را 1 مي‌كنيم، تا زمانيكه با دستور ديگري آن پايه را 0 كنيم، مقدار خروجي آن پايه‌ 1 خواهد ماند. به اين عمل اصطلاحاً Latch كردن مي‌گويند. ميكروكنترلر همواره اطلاعاتي كه بر روي خروجي قرار مي‌دهد را Latch مي‌كند و تا زمانيكه اطلاعات جديد بر روي پايه قرار نگيرد، اطلاعات قبلي را تغيير نمي‌دهد.
در نتيجه، مثلاً اگر مي‌خواهيم پايه‌اي را 5 ميكروثانيه 1 وسپس 0 كنيم، كافيست پايه‌ي مورد نظر را 1 كنيم و 5ميلي ثانيه در برنامه تاخير ايجاد كنيم و سپس پايه‌ي مورد نظر را 0 كنيم.
پس وقتي مي خواهيم مثلاَ بر روي پايه‌ي B.4 ، يك PWM براي ولتاژ 2.5 ولت ايجاد كنيم، بايد به شكل زير عمل كنيم.

while(1)
{
PORTB.4=1;
5 ميكرو ثانيه تاخير
PORTB.4=0;
5 ميكرو ثانيه تاخير
}

در بالا يك حلقه‌ي بي‌نهايت تعريف شده است كه بر روي پايه‌يB.4، يك PWM براي 2.5 ولت ايجاد مي‌كند.

مبحث كدويژن، وقفه و PWM :

ابتدا با توابعي كه براي ايجاد وقفه در اجراي دستورات برنامه توسط 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 منحرف نشويم.) براي اين كار، جمله

#include <mega16.h>

كه اولين جمله‌ي برنامه‌ي شما است را پيدا كنيد. (اين جمله را 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 درصد

درباره محمد جواد صالحی

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نخواهد شدعلامتدارها لازمند *

*

theme
رفتن به بالا

Warning: Parameter 1 to W3_Plugin_TotalCache::ob_callback() expected to be a reference, value given in /home3/afgsaane/public_html/wp-includes/functions.php on line 3510