در پست قبلی کنترلر 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 نقشه اصلی را داشته باشد .