توضيح مقدماتي در مورد PWM، كاربرد و نحوهي توليد آن براي ولتاژهاي مختلف، latch كردن و ...
به نام خدا
با سلام خدمت دوستان خوبم
در اين جلسه به مبحث ميكروكنترلر برميگرديم و در مورد PWM و كاربردهاي آن در ساخت ربات توضيح خواهيم داد.
در بسياري از موارد، ما نياز به كنترل ولتاژ بر روي پايههاي خروجي ميكروكنترلر را داريم. مثلاً اگر بخواهيم سرعت موتور را كنترل كنيم، بايد ولتاژي كه بر روي موتور اعمال ميشود را كنترل كرد. در حقيقت سرعت موتور تقريباًً تابع مستقيمي از ولتاژي است كه بر روي آن اعمال ميشود. يعني اگر ولتاژ كاريِ موتوري (ولتاژ استاندارد براي فعال سازي موتور كه بر روي بدنهي آن نوشته ميشود) 12 ولت باشد، با اعمال ولتاژ 6 ولت روي آن، ميتوانيد سرعت چرخش آن(rpm) را حدوداً به نصف كاهش دهيد.
كنترل سرعت ربات، در همهي سطوح رباتيك اهميت بسيار زيادي دارد، از رباتهاي مسيرياب ساده گرفته تا رباتهاي فوتباليست. ما تا كنون ياد گرفتهايم كه چگونه ميتوان به موتور دستور حركت يا توقف داد، اما راهي براي كنترل سرعت موتور ياد نگرفتهايم.
يادآوري
همانطور كه ميدانيد سطح ولتاژ پايههاي خروجي ميكروكنترلر منطقي است، يعني يك پايهاي كه براي كنترل موتور ربات استفاده ميشود فقط ميتواند 0 يا 1 باشد. ما 2 پايه از ميكروكنترلر را به حركت ربات اختصاص ميدهيم، براي صدور دستور حركت، بايد يك پايه را 0 و پايهي ديگر را 1 كنيم، در اين حالت بين 2 پايهي موتور اختلاف پتانسيل برقرار ميشود و حركت ميكند. اگر هم بخواهيم موتور معكوس بچرخد، بايد پايهاي كه 1 بود 0 ، و پايهاي كه 0 بود را 1 كنيم؛ و براي توقف موتور، بايد هر دو پايه را 0 يا هر دو پايه را 1 كنيم (تا بين 2 پايهي موتور اختلاف پتانسيل 0 ولت باشد). در نتيجه در حالت عادي ما فقط 2 فرمان "حركت" و "توقف" را ميتوانيم به موتورها بدهيم، و ما هيچ كنترلي بر روي سرعت موتور نداريم. |
PWM تكنيكي است كه به كمك آن ميتوانيم ولتاژ پايههاي خروجي ميكروكنترلر، و در نتيجه سرعت موتور يا ساير قطعات جانبي كه به ميكروكنترلر متصل ميشود را كنترل كنيم.
PWM مخفف واژهي Pulse Width Modulation و به معناي "مدولاسيون پهناي پالس" است. همانطور كه گفتيم PWM تكنيكي براي كنترل ولتاژِ پايهي خروجي است. حال ببينيم چگونه با اين تكنيك ميتوان ولتاژ خروجي را كنترل كرد.
ميدانيم كه ولتاژ در پايههاي خروجي ميكروكنترلر يا 0 است يا 5 ولت، اما براي كنترل سرعت موتور، بايد بتوانيم حداقل ولتاژ يكي از پايهها را بين 0 تا 5 تغيير دهيم. PWM روشي است تا ما بتوانيم با استفاده از همين پايهي خروجي معمولي، به نوعي ولتاژ را بين 0 تا 5 ولت تغيير دهيم.
در اين روش، ما با سرعت بالايي سطح ولتاژ خروجي را 0 و بلافاصله 1 ميكنيم(مثلاً هزار بار در ثانيه)، نمودار ولتاژ خروجي بر حسب زمان به شكل زير ميشود.
نمودار بالا ولتاژ خروجي اين پايه بر حسب زمان است.
در شكل بالا جمع 2 بازهاي كه با فلشهاي 2طرفه نشان داده شده است، (به عنوان مثال) 10 ميكرو ثانيه است. كه 5ميكرو ثانيه خروجي 1 و سپس 5ميكرو ثانيه 0 ميشود. اما همانطور كه گفته شد، اين عمل هزاران بار در ثانيه تكرار ميشود، اما آيا موتور نيز به همين تعداد در ثانيه روشن و خاموش ميشود؟
جواب منفيست، اتفاقي كه روي ميدهد اين است كه موتور، اين موج را در درون خود به نوعي ميانگين گيري ميكند و در حقيقت آنرا به شكل زير مي بيند:
يعني در واقع موتور اين موج را به صورت يك ولتاژ 2.5 ولت معمولي دريافت ميكند.
به همين ترتيب ميتوان هر ولتاژي بين 0 تا 5 ولت را بر روي خروجي مورد نظر ايجاد كرد. اگر بخواهيم ولتاژي بالاتر از 2.5 ولت داشته باشيم، بايد طول بازههاي زمانياي كه خروجي 1 است را نسبت به بازههايي كه خروجي 0 است بيشتر كنيم. به عنوان مثال براي ايجاد ولتاژ 2.5 ولت، بايد 5 ميكرو ثانيه سطح ولتاژ خروجي 1 باشد، سپس 5 ميكرو ثانيه سطح ولتاژ 0 شود تا موجي به شكل بالا ايجاد شود.
يا به عنوان مثالي ديگر، اگر بخواهيم در خروجي ولتاژ 4 ولت داشته باشيم، بايد بايد 8 ميكرو ثانيه سطح ولتاژ خروجي 1 باشد، سپس 2 ميكرو ثانيه سطح ولتاژ 0 شود، تا ولتاژ پايهي خروجي مورد نظر 4 ولت باشد.
در حقيقت ولتاژ خروجي از رابطهي سادهي زير به دست ميايد:
(طول كل بازه) / ( طول بازهاي كه خروجي 1 است)
پس طبق رابطهي بالا،براي ايجاد ولتاژ 4 ولت، ميتوان به جاي استفاده از بازههاي 8 و 2 ميكرو ثانيهاي، از بازههاي 4 و 1 ميكرو ثانيهاي استفاده كرد. (يعني 4ميكرو ثانيه 5ولت، 1 ميكرو ثانيه 0 ولت) زيرا: 2÷ 8 = 1÷4
نمودار ولتاژهاي 4 ولت و 1 ولت در زير نشان داده شده است:
| |
نمودار نحوهي توليد ولتاژ 4 ولت با تكنيك PWM. | نمودار نحوهي توليد ولتاژ 1 ولت با تكنيك 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 ولت ايجاد ميكند.
در جلسهي آينده با توابعي كه براي ايجاد تاخير (delay) در برنامه استفاده ميشوند آشنا خواهيد شد. همچنين ميآموزيد كه چگونه ميتوان از PWM ميكروكنترلرهاي خانوادهي AVR استفاده كنيد.
اگر مطالب اين جلسه كمي پيچيده به نظر ميرسند جاي نگراني نيست، زيرا مبحث PWM مبحث گستردهايست و كاربردهاي زيادي در صنعت دارد و فقط محدود به ميكروكنترلر هم نميشود. پس طبيعيست كه سطح مطالب كمي بالا باشد و دوستان نيز گاهاً در درك مفاهيم دچار مشكل شوند. پس دوستان عزيز اگر سوال يا مطلب خاصي در اين رابطه دارند حتماً با ما در ميان بگذارند.
شاد و پيروز باشيد
دوست شما، فراز اميرغياثوند