مرجع رباتیک و الکترونیک

۳ مطلب با کلمه‌ی کلیدی «کنترلر PID» ثبت شده است

در پست قبلی کنترلر P توضیح داده شد و گفتیم که با قرار دادن سرعت مساوی خطا ضربدر Kp میتوانیم ربات فوتبالیست را رو به دروازه حریف نگاه داریم زیرا هرگاه ربات به هر دلیلی‌ از زاویه مورد نظر منحرف شد با چرخش ( با سرعت مناسب به دست آمده از کنترلر P ) دوباره به سمت هدف باز می‌‌گردد . ( اگر سرعت موتور‌ها را با PWM بین ۰ تا ۲۵۵ کنترل کنیم Kp مناسب برای ربات فوتبالیست عددی حدوداً بین ۱ تا ۱۰ میشود زیرا اگر Kp بزرگ باشد باعث میشود ربات بیشتر نوسان کند تا جایی‌ که اگر خیلی‌ بزرگ شود نوسانات ربات هیچگاه متوقف نمی‌شود )

حال فرض کنید ربات دقیقا رو به هدف ایستاده و خطا صفر است و سرعت ربات هم صفر است . در این شرایط همه چیز خوب پیش میرود و مشکلی‌ وجود ندارد تا این که ربات را بچرخانیم و شرایط را به هم بزنیم یا به ربات دستور دهیم رو به جهت دیگری بایستد .

در این حالت فرض کنید ربات را به اندازه ۱ درجه منحرف کنیم ، در این صورت PWM ربات برابر ۱ ضربدر Kp می‌‌شود که مقدار خیلی‌ کوچکی است ( مثلا ۵ )

مشکلی‌ که در اینجا وجود دارد این است که وقتی به PWM موتور‌ها عدد ۵ را بدهیم موتور‌ها اصلا حرکت نمی‌‌کنند و نمی‌‌توانند این خطای ۱ درجه را اصلاح کنند . زیرا PWM پنج کمتر از آن است که بتواند بر اصطکاک ایستایی غلبه کند و موتور‌ها را به حرکت در آورد . ( با توجه به موتور‌ها و ربات ممکن است ربات حتی با PWM ده یا پانزده هم نتواند حرکت کند و مثلا از ۱۷ به بالا بتواند حرکت کند ، در این صورت خطای ۲ و ۳ درجه را هم نمی‌‌تواند اصلاح کند ) 
 چون کنترلر P نمی تواند این خطا را اصلاح کند و این خطا در سیستم باقی می‌‌ماند و اصلاح نمی‌شود به آن خطای ماندگار می‌گویند

توجه کنید که اگر ربات در حال حرکت و اصلاح خطا باشد به خطای ۱ یا ۲ یا ۳ درجه خطای ماندگار نمی‌‌گوئیم بلکه زمانی‌ به آن خطای ماندگار می‌‌گوئیم که ربات از حرکت ایستاده ولی‌ هنوز مقدار کمی‌ خطا در آن وجود دارد .

خوب برای حل این مشکل ( خطای ماندگار ) چه کاری باید انجام داد ؟

یکی‌ از کار‌هایی‌ که می‌توان انجام داد این است که برنامه‌ای بنویسیم که اگر برای مدت طولانی ( مثلا ۱۰۰۰ بار اجرا شدن برنامه ) مقدار خطا صفر نبود و تغییری هم نکرد آنگاه متوجه خطای ماندگار شده و ربات شروع به چرخش کند تا خطای ماندگار را اصلاح کند . اما سوال اینجاست که ربات با چه پی‌ دبلیو امی بچرخد تا دوباره هدف را رد نکند ؟ خوب جواب این است که با توجه به این که مقدار خطا بسیار کوچک است با کوچک‌ترین چرخشی این خطا اصلاح میشود پس ربات باید با کمترین پی‌ دبلیو امی که می‌‌تواند حرکت کند ( پی‌ دبلیو ا‌م آستانه حرکت ) بچرخد تا امکان رد کردن آن بسیار کم شود .

اما پی‌ دبلیو ا‌م آستانه حرکت چقدر است ؟ پی‌ دبلیو ا‌م آستانه حرکت یک عدد ثابت نیست و هر چه ربات سنگین تر شود بیشتر می‌‌شود پس امکان محاسبه آن وجود ندارد . ( فرض کنید می‌خواهیم از ربات به عنوان جابجا کننده وسایل مختلف استفاده کنیم پس در این حالت وزن ربات و پی‌ دبلیو ا‌م آستانه حرکت مقدار ثابتی ندارد و با گذاشتن وسایل مختلف روی ربات تغییر می‌‌کند )

حال که مقدار پی‌ دبلیو ا‌م آستانه حرکت را نمی‌‌دانیم بهتر است در برنامه نویسی ابتدا به موتور‌ها پی‌ دبلیو ا‌م ۱ بدهیم اگر نچرخید مقدار پی‌ دبلیو ا‌م را کم کم زیاد کنیم تا جایی‌ که ربات بالاخره شروع به چرخش کند و خطا را اصلاح کند ، در این صورت ربات با کمترین سرعت ممکن حرکت می‌کند و امکان رد کردن هدف بسیار کم می‌‌شود .

حال فرض کنید ربات در موقعیتی بین ۲ درجه و ۳ درجه ایستاده باشه در این صورت عدد خطا مدام بین ۲ و ۳ تغییر می‌کند و دیگر نمی‌توان به روش بالا ( ۱۰۰۰ بار ثابت بودن خطا ) متوجه خطای ماندگار شد . خوب این مشکل را چگونه می‌‌توان حل کرد ؟

این مشکل را می‌‌توان به این صورت حل کرد که بگوییم اگر میانگین خطا برای مدت طولانی غیر صفر بود ربات شروع به چرخش کند . و چون میخواستیم سرعت چرخش هم کمترین مقدار باشد و کم کم بالا برود میتوانیم بگوییم : PWM = میانگین خطا ضربدر مدت زمانی‌ که این خطا وجود داشته . این ضرب کردن در زمان باعث می‌‌شود تا پی‌ دبلیو ا‌م کم کم بالا برود و به محض این که ربات به آستانه حرکت رسید با کمترین سرعت ممکن حرکت کند و احتمال رد کردن هدف بسیار کم شود . ضرب کردن میانگین خطا هم به این خاطر است که هر چه میانگین خطا بالاتر بود با سرعت بیشتری خطا را اصلاح کند .

خوب می‌دانیم که میانگین خطا = مجموع خطا‌ها تقسیم بر تعداد آنهاست پس رابطهٔ بالا به این صورت میشود : PWM = مجموع خطا‌ها ضرب در ( زمانی که این خطا وجود داشته تقسیم بر تعداد خطا‌ها ) .

خوب عبارت داخل پرانتز بالا یک عدد ثابت است چون مثلا هر ۱ ثانیه ۱۰۰ بار خطا اندازه‌گیری می‌‌شود و زمان تقسیم بر تعداد خطا‌ها = یک صدم می‌‌شود و تغییری نمی‌‌کند

حال چون سرعت چرخش و خطا از یک جنس نیستند برای برقراری رابطه بین آن‌ها باید یه ضریب در نظر بگیریم مثلا m . و رابطهٔ بالا به این صورت در می‌‌آید : PWM = مجموع خطا‌ها ضرب در ( m ضرب در زمان تقسیم بر تعداد خطا‌ها ).

چون عبارت داخل پرانتز بالا عدد ثابتی است برای سادگی‌ آن را Ki می‌‌نامیم و می‌‌نویسیم PWM = مجموع خطا * Ki 

چون در این رابطه PWM به مجموع خطا ارتباط دارد و مجموع خطا‌ ها در حالتی که تابع پیوسته خطا را داشته باشیم همان انتگرال تابع خطا می‌‌شود به این قسمت از کنترلر بخش انتگرالی می‌‌گویند . I نیز حرف اول کلمه integral به معنی‌ انتگرال است

همان طور که از ابتدا گفته شد بخش کنترل انتگرالی وظیفه از بین بردن خطای ماندگار را دارد و به تنهایی‌ استفاده نمی‌شود بلکه در کنار کنترلر P استفاده می‌‌شود . ترکیب P و I را کنترل PI می‌گویند و معادله آن به صورت زیر می‌‌شود :

پی دبلیو ام = ( Kp * خطا ) + ( Ki * مجموع خطا‌ها )

استفاده هر دو کنترلر در کنار هم به صورت جمع آن‌ها باعث می‌‌شود تا در حالتی که خطا زیاد است بخش P نقشه اصلی‌ را در اصلاح ایفا کند و در حالتی که خطا خیلی‌ کم است بخش I نقشه اصلی‌ را داشته باشد .

۴ نظر موافقین ۰ مخالفین ۰ ۰۴ فروردين ۹۳ ، ۱۲:۰۷
یوسف شه نهاد

همان طور که گفتیم هدف تمام سیستم‌های کنترلی به حداقل رساندن اندازه خطا در کمترین زمان ممکن است .

همچنین گفتیم اختلاف بین پارامتر سیستم و دستور ورودی را خطای سیستم میگوییم

پارامتر سیستم توسط سنسور اندازه گیری میشود و دستور ورودی هم از یک مدار دیگر به سیستم داده میشود

یاد آوری می‌کنیم که دستور ورودی و پارامتری که می‌خواهیم کنترل کنیم و خروجی سنسور باید از یک جنس باشند و فعال کنند هم باید توانایی تغییر دادن پارامتر را داشته باشد

برای مثال در ربات فوتبالیست وقتی می‌خواهیم ربات رو به دروازهٔ حریف بایستد : پارامتری که می‌خواهیم کنترل کنیم ( زاویه ) جلوی ربات است ، دستور ورودی به ما میگوید که ربات باید در چه جهتی‌ ( چه زاویه‌ای ) بایستد و سنسور هم جهتی‌ که ربات ایستاده ( زاویه ربات ) را اندازه گیری می‌کند . پس هر سه از جنس زاویه هستند و فعال کننده‌های ربات ( موتور‌ها ) میتوانند زاویه را تغییر دهند

همانطور که در شکل پست بالا دیده میشود : خطا در هر لحظه برابر است با مقدار مورد نظر ورودی ( reference ) منهای مقدار سنسور

توجه کنید که مقدار خطا در بعضی‌ از لحظات مثبت و در بعضی‌ از لحظات منفی‌ خواهد بود .

حالا ربات فوتبالیست را فرض کنید که قرار است رو به زاویه ی صفر درجه بایستد یعنی‌ مقدار مورد نظر ورودی ( Reference ) همیشه برابر صفر است . سنسور قطب نما هم در هر لحظه زاویه ی ربات رو اندازه گیری می‌کنه .

فرض کنید در یک لحظه قطب نما زاویه ۱۰ درجه را نشان دهد . ( تمام زوایا در دایره مثلثاتی هستند ) در این حالت خطا برابر صفر منهای ده مساوی ( منفی ده ) میشود . واضح است که در این حالت ربات باید در جهت خلاف مثلثاتی ( منفی‌ ) بچرخد تا این انحراف ( خطا ) تصحیح شود ( کمتر شود تا به صفر برسد )

در حالت بر عکس اگر قطب نما زاویه -۱۰ درجه را نشان دهد . در این حالت خطا برابر صفر منهای منفی‌ ده مساوی ( مثبت ده ) میشود . واضح است که در این حالت ربات باید در جهت مثلثاتی ( مثبت ) بچرخد تا این انحراف ( خطا ) تصحیح شود ( بیشتر شود تا به صفر برسد ) 

خوب پس اگر علامت خطا مثبت شد ربات باید در جهت مثبت بچرخد و اگر منفی‌ شد باید در جهت منفی‌ بچرخد ( واضح است که اگر خطا صفر باشد ربات باید بایستد )

سوال اینجاست که ربات با چه سرعتی بچرخد ؟

جواب واضح است : چون می‌خواهیم در کمترین زمان ممکن به خطای صفر برسیم پس ربات باید با حداکثر سرعت بچرخد

اما چرخیدن با حداکثر سرعت مشکلی‌ به وجود می‌‌آید . 

مشکل : فرض کنید خطا مثبت ده باشد . ربات شروع به چرخیدن می‌کند و خطا کم میشود تا به صفر برسد و وقتی به صفر رسید دستور میدهیم تا موتور‌ها خاموش شوند و ربات بایستد . اما ربات که نمی‌تواند درجا!!! بایستد . چیزی شبیه لختی یا اینرسی باعث میشود تا ربات نتواند درجا بایستد ، بلکه سرعت ربات به تدریج کم میشود تا بایستد . همین باعث میشود تا ربات به جای ایستادن در صفر ، صفر را رد کند و برود در مثلا منفی ۱۵ بایستد . حالا باید دوباره برگردیم و در برگشت نیز همین مشکل تکرار میشود یعنی‌ به جای ایستادن در صفر آن را رد می‌کند و مثلا در مثبت هیجده می‌‌ایستد و ...

راه حل این مشکل استفاده از کنترلر است که در اینجا با استفاده از کنترلر PID می‌خواهیم این مشکل را حل کنیم .

ساده‌ترین کاری که شاید به ذهن خیلی‌‌ها برسد این است که سرعت را کم کنیم اما این کار نه تنها مشکل را حل نمیکند بلکه باعث میشود ربات خیلی‌ کند خطا را تصحیح کند .

کار بهتری که می‌توان انجام داد این است که : وقتی اندازه خطا زیاد است ربات با سرعت زیاد بچرخد و وقتی اندازه خطا کم است ربات با سرعت کم بچرخد . یعنی‌ ربات با دو سرعت متفاوت بچرخد یا حتی وقتی اندازه خطا زیاد است ربات با سرعت زیاد و وقتی اندازه خطا متوسط است با سرعت متوسط و وقتی اندازه خطا کم است با سرعت کم بچرخد ( یعنی‌ با سه سرعت متفاوت ).

پیشنهاد بهتر این است که ربات با n سرعت متفاوت بچرخد یعنی‌ : سرعت ربات = خطا باشد و هر چه خطا کمتر شد سرعت ربات هم کمتر شود و هر چه خطا بیشتر شد سرعت ربات هم بیشتر شود .

در این حالت اگر دیدیم تصحیح خطا خیلی آرام انجام میشود میتوانیم خطا را در عددی ( بزرگتر از قبل ) ضرب کنیم یعنی‌ : سرعت ربات = خطا * K

همچنین ممکن است باز هم مشکله قبلی ( رد کردن صفر و دوباره برگشتن و دوباره رد کردن و ... ) را داشته باشیم که در آن صورت میتوانیم خطا را در عددی ( کوچک تر از قبل ) ضرب کنیم تا مشکل حل شود .

این قاعده کلی‌ را به یاد داشته باشید که در رابطه ( سرعت = خطا * K )  :  هر چه K کوچک تر شود ، سیستم کند تر حرکت می‌کند و هر چه K بزرگ تر شود سیستم بیشتر نوسان ( رد کردن هدف و برگشت دوباره ) می‌کند تا به تعادل برسد ( خطا صفر شود )

( نوسان کردن سیستم کاملا طبیعی است و همیشه وجود دارد ولی هر چه تعداد این نوسانات کمتر شود بهتر است )

چیزی که تا به اینجا توضیح داده شد کنترلر P است . P حرف اول Proportional به معنی‌ تناسب است . یعنی‌ سرعت چرخش ( تغییر زاویه ) ربات با خطا تناسب ( نسبت مستقیم ) دارد . ضریب تناسب ( K ) به کار برده شده در این کنترلر را از این به بعد  Kp می‌نامیم

دوستان اگر سوالی راجع به این پست و یا قبلی دارند بپرسند ولی خواهشا سوالات متفرقه راجع به PID رو بزارید بعد از اینکه توضیحات I و D هم تموم شد بپرسید

۰ نظر موافقین ۰ مخالفین ۰ ۰۴ فروردين ۹۳ ، ۱۲:۰۳
یوسف شه نهاد
به نام خدا

یکی از مهم ترین قسمت های هر ربات کنترل آن است که توسط پردازنده و بر اساس برنامه نویسی انجام می شود

اهمیت کنترل و همچنین گستردگی آن موجب شد تا رشته دانشگاهی به نام برق کنترل ایجاد شود تا دانشجویان این رشته به طور تخصصی به یادگیری علم کنترل و به کارگیری آن بپردازند

در اینجا با گذشتن از مقدمات و پیش نیازها یکسره به سراغ وسط بحث می پریم و کنترلر PID را توضیح می دهیم

کنترلر PID یکی از ساده ترین و پایه ای ترین کنترلر هاست که در عین سادگی در بسیاری موارد نیاز ما را رفع می کند .

قبل از پرداختن به بحث کنترلر PID نیاز است تا مفهوم کنترل به درستی‌ درک شود

اولین کلمه‌ای که در کنترل مطرح میشود سیستم است . سیستم همان چیزی است که قرار است کنترل شود

چند مثال از سیستم عبارتند از :

مقداری آب ( که قرار است دمای آن کنترل شود )

یک موتور dc ( که قرار است سرعت چرخش آن کنترل شود )

یک آسانسور ( که قرار است ارتفاع آن کنترل شود تا دقیقا هم سطح طبقات بایستد )

یک ربات فوتبالیست ( که قرار است دهانه جلوی آن همیشه به سمت شمال باشد )

و ...

نکته بعدی پارامتری است که قرار است کنترل شود . که در موارد بالا داخل پرانتز نوشته شده اند . در بعضی‌ از موارد تعیین درست پارامتری که قرار است کنترل شود سخت و بسیار مهم است .

بخش مهم بعدی سنسوری است که باید تغیرات پارامتر را اندازه گیری کند . زیرا بدون داشتن سنسور و اندازه پارامتر نمی‌توان سیستم را کنترل کرد . ( مثلا بدون داشتن دماسنج و بدون دانستن دمای آب ، نمی‌توان دمای آن را کنترل کرد )

پس توجه کنید که در انتخاب پارامتر باید به سنسور نیز توجه داشت .

بخش دیگر یک سیستم دستور ورودی آن است . ( برای مثال دستور ورودی مشخص می‌کند که سرعت چرخش موتور در هر لحظه چقدر باشد ) 

دستور ورودی هر سیستم نیز باید از جنس پارامتر و جنس خروجی سنسور باشد . ( برای مثال وقتی پارامتر ، سرعت چرخش موتور است و سنسور نیز سرعت چرخش موتور را اندازه گیری می‌کند دستور ورودی نمی‌تواند از جنس سرعت حرکت ربات به سمت جلو یا ... باشد بلکه باید از جنس سرعت چرخش موتور باشد )

بحث مهم دیگری که در هر سیستم کنترلی وجود دارد خطای ( Error ) سیستم است . اختلاف بین پارامتر سیستم و دستور ورودی را خطای سیستم میگوییم . هدف تمام سیستم‌های کنترلی به حداقل رساندن اندازه خطا در کمترین زمان ممکن است .

و اما بخش بعدی هر سیستم کنترلی فعال کننده‌های ( Actuators ) آن است .

فعال کننده همان قسمتی است که میتواند موجب تغییر پارامتر شود . مثلا در کنترل دمای آب المنتی که در داخل آب قرار داده شده و میتواند دمای آب را بالا ببرد فعال کننده محسوب میشود . و در آسانسور ، موتور آسانسور که میتواند ارتفاع آسانسور را تغییر دهد و در ربات فوتبالیست موتور‌های ربات که میتوانند آن را بچرخانند فعال کننده محسوب میشوند

۳ نظر موافقین ۰ مخالفین ۰ ۰۴ فروردين ۹۳ ، ۱۱:۵۸
یوسف شه نهاد