PWM چیست
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 ولت باشد.
در حقیقت ولتاژ خروجی از رابطهی سادهی زیر به دست میاید:
پس طبق رابطهی بالا،برای ایجاد ولتاژ 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 ولت ایجاد کنیم، باید به شکل زیر عمل کنیم.
{
PORTB.4=1;
5 میکرو ثانیه تاخیر
PORTB.4=0;
5 میکرو ثانیه تاخیر
}
در بالا یک حلقهی بینهایت تعریف شده است که بر روی پایهیB.4، یک PWM برای 2.5 ولت ایجاد میکند.
مبحث کدویژن، وقفه و PWM :
ابتدا با توابعی که برای ایجاد وقفه در اجرای دستورات برنامه توسط CodeVision برای کاربران در نظر گرفته شده آشنا میشویم.
همانطور که در میحث پیش دیدیم، در قسمتهایی از برنامه ممکن است نیاز پیدا کنیم تا برای لحظاتی روند اجرای دستورات را متوقف کنیم. CodeVision برای این کار توابعی را از پیش تنظیم کرده است. (در مورد مبحث «توابع» در زبان C در آینده مفصل توضیح خواهیم داد.)
delay :
برای ایجاد تاخیر در روند اجرای دستورات، CodeVision دو تابع زیر را در اختیار ما قرار داده است.
delay_us( );
تابع ()delay_ms برای ایجاد تاخیرهایی در حد میلی ثانیه به کار میرود. در داخل پرانتز، یک عدد صحیح مثبت مینویسیم که نشان دهندهی اندازهی تاخیر مورد نیز ما بر حسب میلی ثانیه است. به بیان سادهتر، مثلاً اگر داخل پرانتز عدد 100 را بنویسیم، روند اجرای برنامه به اندازهی 100 میلی ثانیه در همان خط متوقف خواهد شد.
تابع ()delay_us برای ایجاد تاخیرهایی در حد میکروثانیه به کار میرود. نحوهی استفاده از آن دقیقاً مانند ()delay_ms است.
به عنوان یک مثال عملی،همان برنامهی ایجاد PWM 2.5 ولت را با استفاده از توابع delay بازنویسی میکنیم.
{
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» وجود دارد که هر مقداری در این رجیستر قرار داده شود، مقدار پایههای خروجی متناظر با آن رجیستر را مشخص میکند.
در این مبحث با 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 را توضیح خواهیم داد....
همانطور که در مباحث قبلی هم متذکر شدیم، در اینجا مجال نیست تا تمام مباحث مربوط به PWM و تایمرها را باز کنیم و مفصل به آنها بپردازیم، به همین خاطر در این بخش قسمتی از تنظیمات در CodeWizard را بدون توضیح آموزش میدهیم.
برای انجام تنظیمات به کمک CodeWizard،پس از انجام تنظیمات سایر لبهها (مانند Ports، Chip و .... ) در CodeWizard، لبهی Timers را باز کنید.
همانطور که میبینید میکروکنترلر ATmega16 دارای 3 تایمر مجزا است و ما برای تولید PWM باید از این تایمرها استفاده کنیم. تایمرها کاربردهای متعددی دارند، و یکی از مهمترین مباحث در میکروکنترلر هستند، ما هم در مورد تایمرها در جلسات آینده مفصل توضیح خواهیم داد. اما در این مبحث فقط استفاده از تایمرها را برای ایجاد PWM برای کنترل موتورهای ربات استفاده میکنیم.
Timer0
Timer0 مربوط به رجیستر OCR0 است و باید به شکل زیر تنظیم شود:
نکتهای که در مورد تنظیم هر 3 تایمر باید رعایت شود، این است که در بخش "Clock Value" باید پایینترین فرکانس را انتخاب کنید. در این مورد توضیح مختصری میدهم، ولی اگر عزیزان این بند را متوجه نشوند اهمیت زیادی ندارد: اندازهی فرکانسی که انتخاب میکنید در این بخش، در حکم اندازهی همان Delayهایی است که برای تولید PWM به صورت عادی (که در ابتدای مبحث قبل توضیح دادیم) استفاده میکنیم. یعنی در حقیقت طول موج را در نمودار ولتاژ بر زمان تعیین میکند. هر چه فرکانس بالاتری را انتخاب کنید، طول موج کمتر میشود. در عمل دیده شده که هر چه فرکانس پایینتر باشد و در نتیجه طول موج بیشتر باشد، موتورها بهتر هدایت میشوند. به همین خاطر در بالا گفته شد که دوستان پایینترین فرکانس را برای "Clock Value" انتخاب کنند.
Timer1
تایمر1 باید به شکل زیر تنظیم شود. دقت کنید که ممکن است در بخش Clock Value شما فرکانسی که در شکل زیر نمایش داده شده است را در گزینهها نداشته باشید، ولی همانطور که گفته شد فقط مهم این است که شما پایینترین فرکانس را انتخاب کنید.
همانطور که میبینید، تایمر1 دارای دو خروجی مجزا است که رجیسترهای مربوط به آنها OCR1AL و OCR1BL هستند.
Timer2
تایمر2 میز به شکل زیر تنظیم میشود و مانند تایمر0 فقط یک خروجی دارد.
Watchdog
یا سگ نگهبان (Watch Dog) نیز یکی از مباحث مربوط به تایمرهاست که در ادامه بحث به آن خواهیم پرداخت.
حال که همهی تنظیمات لازم را در CodeWizard انجام دادهاید، "Generate, Save and Exit" انتخاب کنید و وارد فضای برنامه نویسی شوید.
نکتهی بسیار مهم:
برای کنترل هر موتور، علاوه بر یک پایهی PWM، یک خروجی معمولی نیز لازم داریم تا بتوانیم به وسیلهی این دو پایه و به کمک درایور موتور، اختلاف پتانسیل مورد نظر را بر روی دو پایهی موتور برقرار کنیم. این 2 پایه را به دو پایهی ورودی L298 متصل میکنیم و دو پایهی موتور را نیز، به دو پایهی خروجی L298 متصل میکنیم. حال میتوانیم موتور را به وسیلهی میکروکنترلر با سرعت دلخواه کنترل کنیم. به عنوان مثال اگر بخواهیم موتور ما تقریباً با سرعت نصف بچرخد، و پایههای PD.6 و PD.7 (مربوط به رجیستر OCR2) را به L298 متصل کرده باشیم،برنامهی زیر را باید بنویسیم:
PORTD.6=0;
و اگر بخواهیم موتور ما با همین سرعت و در جهت معکوس بچرخد، مینویسیم:
PORTD.6=1;
برای درک این موضوع دقت کنید که در این حالت چه ولتاژی توسط L298 بر روی موتورها قرار داده میشود. همانطور که میدانید، سرعت و جهت چرخش موتور وابسته به اختلاف ولتاژی است که بر روی پایههای موتور قرار داده میشود.
تا به اینجا مباحث پایهای در میکروکنترلرهای AVR مطرح شده است و همین آموختههای دوستان، نیازهای اولیهی شما عزیزان را برای ساخت رباتهای نسبتاً حرفهای برطرف میسازد.
یکی از مهمترین فواید استفاده از میکروکنترلر در ساخت رباتهای مسیریاب، استفاده از قابلیت PWM برای هدایت موتورهای ربات است. اما به چه صورت از PWM استفاده میکنیم؟
به شکل بالا نگاه کنید، در همانطور که می دانید در این ربات ها 3 سنسور هر طرف را با همدیگر ANDمنطقی میکنیم و اگر هر یک از این 3 سنسور خط را تشخیص داد، موتور همان سمت را متوقف میکنیم تا به این ترتیب ربات خط را تعقیب کند.
اما در رباتهای مسیریاب میکروکنترلر دار، ما میتوانیم برای هر سنسور، به طور مجزا دستوری به موتور بدهیم. برای درک این موضوع مجدد به شکل بالا نگاه کنید، این نمای کلی یک ربات از زیر است. سنسورهای آن را به ترتیب از چپ به راست، از 7 تا 1 شماره گذاری میکنیم.
همانطور که به خاط دارید در رباتهای بدون میکروکنترلر، تفاوتی نداشت که سنسور 1 یا 2 یا 3 کدامیک خط را بیابند، هر کدام خط را تشخیص میداد، موتور سمت چپ خاموش میشد. اما در رباتهای میکروکنترلر دار، ما میتوانیم تعیین کنیم که مثلاً اگر سنسور شمارهی 3 خط را دید، موتور سمت چپ به طور کامل متوقف نشود، بلکه سرعت آن به نصف کاهش پیدا کند. این کار به نظر هم منطقی میرسد، زیرا سنسور شمارهی 3 و 5 تا خط فاصلهی کمی دارند و نیاز نیست وقتی خط را تشخیص میدهند به طور کامل موتور متوقف شود، بلکه فقط کافیست سرعت موتور کمی کاهش پیدا کند تا ربات به تدریج به روی خط باز گردد. این عمل باعث میشود حرکت ربات نرمتر و دقیقتر بشود و در مجموع سرعت ربات بالاتر برود.
حال اگر سنسور شمارهی 2 خط را ببیند، یعنی شرایط کمی خطرناکتر شده و ربات ممکن است از خط خارج شود، پس میتوانیم در اینجا به موتور دستور توقف کامل را بدهیم تا ربات با سرعت بیشتری به مسیر مسابقه بازگردد. و در نهایت اگر سنسور شمارهی 1 خط را ببیند، یعنی ربات در آستانهی خروج از مسیر مسابقه قرار گرفته است و باید با حداکثر توان ربات را به مسیر مسابقه بازگرداند. برای این کار به موتور سمت چپ دستور باز گشت به عقب را میدهیم. این کار بیشترین سرعت ممکن برای چرخش ربات را فراهم میسازد و ربات با سرعت زیادی به زمینه مسابقه باز میگردد.
در زیر بخشی از برنامهی یک ربات مسیریاب پیشرفته، که فقط برای سنسورهای سمت چپ و طبق توضیحات بالا نوشته شده است را میبینید. همانطور که میدانید ما نیاز به 3 پایه به عنوان ورودی برای دریافت وضعیت سنسورهای سمت چپ، و یک پایهی خروجی و یک PWM برای کنترل موتور سمت چپ داریم که به ترتیب زیر هستند:
PA.0 برای سنسور شمارهی 1
PA.1 برای سنسور شمارهی 2
PA.2 برای سنسور شمارهی 3
PD.6 و OCR2 برای کنترل موتور چپ
PD.3 و OCR1BL برای کنترل موتور راست
حالا به برنامه دقت کنید:
(if (PINA.0==0
{
PORTD.6=0;
OCR2=127;
PORTD.3=0;
OCR1BL=255;
}
(if (PINA.1==0
{
PORTD.6=0
OCR2=0
PORTD.3=0;
OCR1BL=255;
}
(if (PINA.2==0
{
PORTD.6=1;
OCR2=0;
PORTD.3=0;
OCR1BL=255 ; //end
{
به همین منوال باید برای سنسورهای سمت راست هم برنامه را ادامه دهید. دقت کنید که باید حتماً قبل از نوشتن برنامه، از داخل CodeWizard، تنظیمات اولیه را انجام دهید.
اگر این سنسور خط را تشخیص دهد، بیانگر این است که ربات در وضعیت مناسبی نسبت به خط قرار دارد و هر 2 موتور با تمام توان به سمت جلو حرکت میکنند. اگر پایهی PA.3 را نیز به سنسور وسط اختصاص دهیم، برای این سنسور نیز داریم:
(if (PINA.3==0
{
PORTD.6=0;
OCR2=255;
PORTD.3=0;
OCR1BL=255;
}
- ۹۶/۱۰/۰۳