ادامهي مبحث PWM، توابع ايجاد وقفه (Delay)، رجيسترهاي OCRx و ...
به نام خدا
با عرض سلام خدمت دوستان عزيز
در اين جلسه نيز مبحث PWM را دنبال ميكنيم. عزيزان براي درك مطالب اين جلسه حتماً بايد جلسهي قبل را مطالعه كرده باشند. در اين جلسه به آيسي L298 نيز اشاراتي شده است كه دوستان ميتوانند جهت ياداوري، بخش مربوط به L298 در جلسهي 17 را نيز مرور كنند.
ابتدا با توابعي كه براي ايجاد وقفه در اجراي دستورات برنامه توسط CodeVision براي كاربران در نظر گرفته شده آشنا ميشويم.
همانطور كه در جلسهي پيش ديديم، در قسمتهايي از برنامه ممكن است نياز پيدا كنيم تا براي لحظاتي روند اجراي دستورات را متوقف كنيم. CodeVision براي اين كار توابعي را از پيش تنظيم كرده است. (در مورد مبحث «توابع» در زبان C در آينده مفصل توضيح خواهيم داد.)
براي ايجاد تاخير در روند اجراي دستورات، CodeVision دو تابع زير را در اختيار ما قرار داده است.
تابع ()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 هستند.
پس مثلاً اگر در بخشي از برنامهي خود بنويسيم :
در حقيقت بر روي پايهي 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 را توضيح خواهيم داد.
منتظر سوالات و نظرات دوستان خوبم هستم.
شاد و پيروز باشيد
دوست شما، فراز اميرغياثوند