Email : info@brosk.ir

Tel : 08736233889 - 09016741124

کنترل کننده PID ، به زبانی ساده و به صورت عملی

کنترل کننده PID ، به زبانی ساده و به صورت عملی
  • مقدمه
  • کنترل هیسترزیس
  • مثال عملی کنترل هیسترزیس
  • کنترل PID
  • مثال عملی کنترل کننده PID
  • ساده سازی در PID

مقدمه :

در کائناتی که ما زندگی می کنیم ، هر چیزی مقدار تعداد یا شدتی دارد که ما در اینجا به اختصال از لفظ مقدار استفاده می کنیم . مقادیر را بر خلاف دیگر صفات مانند رنگ و غیره ، با استفاده از اسامی مختلف دسته بندی نمی کنند چرا که مقادیر می توانند بی نهایت حالت مختلف داشته باشد ( مثبت ، منفی اعشاری موهومی یا گنگ و … باشند ) لذا از دیر باز بشر از سیستم عدد برای توصیف مقادیر استفاده می کند . موضوع مهم این است که ارتباط بین مقادیر پارامتر های مختلف معادل ارتباط عددی آن ها است . به طور مثال جریان مقاومت و ولتاژ دارای رابطه ای با یک دیگر هستند ، این رابطه در واقع رابطه بین مقادیر و در نتیجه اعداد هر کدام از پارامتر ها هست . حال ما در شرایطی که چند پارامتر دارای ارتباطی با همدیگر هستند می توانیم با تغییر مقدار یکی از پارامتر ها مقدار دیگر پارامتر ها را تغییر بدهیم . در همان مثال قبلی ما می توانیم با تغییر ولتاژ اعمالی به یک مقاوت ، مقدار جریان عبوری از آن را تغییر دهیم . این اساس کنترل و سیستم های کنترلی هست . در واقع سیستمی که می تواند مقادیر یک یا چند پارامتر را در جهت تغییر و کنترل پارامتر های دیگر کنترل و تغییر دهد یک سیستم کنترلی نامیده می شود . مثلا یک سیستم با تغییر خروجی های متصل به یک هیتر می تواند مقدار دما را تغییر دهد . در واقع با تعریف اعداد و مقادیر در ابتدای این متن هدف آن بود که بگوییم سیستم ها یا ابزار ها با کنترل اعداد یا اجرای توابع و مدل های ریاضی بر روی مقادیر ، می توانند پارامتر ها را در دنیای واقعی تغییر دهند به همین دلیل در طراحی سیستم های کنترلی تمرکز بر روی مقادیر و مدل های ریاضی است و به اینکه این سیستم مربوط به یک مدار الکترونیکی ، یک موضوع زیست شناسی یا اقتصادی باشد زیاد کاری نداریم . سیستم های کنترلی و در نهایت کنترل خود یک علم و دارای رشته دانشگاهی هست که می توانید برای جزئیات بیشتر به کتاب های مربوط به آن مراجعه کنید پس ما در اینجا تنها به تعریفات فوق بسنده می کنیم . همین را بدانید که در یک سیستم کنترلی هدف تغییر ( در نهایت کنترل ) پارامتر های مختلف با تغییر پارامتر های مرتبط به آن است .

سیستم های کنترلی در نهایت دو نوع از مجموعه پارامتر های مرتبط (گاها این مجموعه پارامتر ها را نیز سیستم می نامند که نباید به سیستم کنترلی اشتباه گرفته شود مثلا در مثال قبلی مقاومت جریان و ولتاژ را یک سیستم می نامند ) را کنترل می کنند که شامل سیستم های خطی (پارامتر ها دارای رابطه خطی ) و سیستم های غیر خطی می باشد . در سیستم های خطی مقادیر هیچ وابستگی به حالت قبلی سیستم ندارند و با داشتن مقدار پارامتر ها در یک نقطه می توان حالت های بعدی و یا قبلی سیستم را محاسبه کرد . به طور مثال با داشتن مقدار مقاومت در سیستم قبل ، با افزایش یا کاهش ولتاژ ما می توانیم مقادیر جریان را در هرلحظه به دست بیاوریم . اما نقطه مقابل سیستم های خطی ، سیستم های غیر خطی هستن . در سیستم های غیر خطی مقادیر وابسته به حالت های قبلی و یا بعدی هستند لذا ما نمی توانیم با داشتن یک مدل ریاضی ساده (فرمول) خطی مقادیر سیستم غیر خطی را در هر شرایطی حساب کنیم . در این حالت اگر مقادیر پارامتر های سیستم را در یک نقطه داشته باشیم تنها می توانیم مقدار سیستم در نقطه بعدی و یا نقطه قبلی را حساب کنیم  . به طور مثال اگر مقادیر سیستم را در نقطه ” n0 ” داشته باشم تنها می توانیم مقدار ” n1 ” سیستم را حساب کنیم و مثلا برای به دست آوردن مقادیر در نقطه ” n5 ” باید تک تک مقادیر را به صورت مرحله به مرحله حساب کنیم تا به نقطه ” n5 ” برسیم . این موضوع در محاسبات دستی بسیار سخت خواهد شد و به همین سبب معمولا در تحلیل سیستم های غیر خطی از کامپیوتر استفاده می شود . اما موضوع بسیار مهم این است که ما در عمل هیچ سیستم خطی نداریم و تنها تلاش می کنیم با تعمیم مدل های خطی به سیستم های غیر خطی بتوانیم تقریب دقیقی از آن ها داشته باشیم . در همان مثال سیستم جریان ولتاژ و جریان در عمل با گذر کردن جریان از مقامت ، دمای مقاومت تغییر کرده و در نتیجه آن مقدار اهم مقاومت تغییر خواهد کرد پس مقدار ولتاژ و جریان در هر لحظه وابستگی به حالت قبل خواهند داشت . در برخی از سیستم ها می توان از حالت غیر خطی بودن آن ها صرف نظر کرد و با استفاده از مدل های ساده ریاضی آن ها را مدل سازی و در نهایت تقریب های دقیق از خروجی به دست آورد . اما برای کنترل سیستم هایی که از اهمیت بالایی برخوردار هستند مثل دمای یک کوره ذوب آهن ، مسیر حرکت یک هواپیما در آسمان و… استفاده از یک مدل ریاضی خطی و تقریب خروجی ها می تواند نتایج خطرناکی را به بار آورد . پس در چنین سیستم هایی باید اثر حالت های گذشته ، آینده و فعلی را در تابع تبدیل سیستم اثر داد . تابع تبدیل منظور همان مدل ریاضی هست که سیستم با اجرای آن می تواند مقدار پارامتر خروجی را تغییر و کنترل کنید .

کنترل کننده PID ( که مخفف تناسبی- مشتقی-انتگرالی) می باشد یک روش برای کنترل دقیق سیستم های با رفتار غیر خطی به صورت پیوسته می باشد که با در نظر گرفتن حالت قبلی ، فعلی و آینده خروجی سیستم را کنترل می کند .

برای درک بهتر کنترل کننده PID بهتر است آن را با روش های دیگری از کنترل مقایسه کنیم . ما این مقایسه را برای ساده ترین حالت از سیستم های کنترلی یعنی کنترل هیسترزیس انجام می دهیم .

کنترل کننده هیسترزیس

فرض کنید می خواهیم دمای یک لیوان آب را که در داخل آن یک المنت حرارتی گذاشته ایم بر روی 60 درجه سانتی گراد کنترل کنیم . ساده ترین کار ممکن این است که سیستم ما اگر دمای آب زیر 60 درجه بود هیتر را روشن و اگر بزرگتر (یا مساوی ) 60 درجه بود هیتر را خاموش کند . با شروع به کار سیستم به دلیل پایین بودن دمای آب هیتر روشن می شود . در لحظه ای که دما به 60 درجه می رسد سیستم فرمان خاموش شدن هیتر را صادر می کند . در این حالت دمای آب سریعا پایین می آید و دوباره سیستم فرمان روشن شدن المنت را صادر می کند . در نتیجه المنت به صورت سریع در نقطه 60 درجه شروع به نوسان (خاموش و روشن شدن سریع ) می کند . برای اینکه چنین حالتی در سیستم های با پاسخ سریع به وجود نیاید از روش هیسترزیس استفاده می شود . در این حالت به طور مثال سیستم اگر دمایی پایین تر از 55 درجه داشته باشد هیتر را روشن می کند و اگر دما بالاتر از 60 درجه بود هیتر را خاموش می کند . این کار از نوسانات سریع سیستم جلوگیری می کند .
چون هدف ما در نهایت شرح PID است لذا از جزئیات کنترل هیسترزیس صرف نظر می کنیم و تنها به یک مثال بسنده می کنیم .

در تصویر زیر سیستم کنترلی فوق نشان داده شده است :

کنترل کننده PID ، به زبانی ساده و به صورت عملی
شکل 1-1 دیاگرام کنترل هیسترزیس

همچنین بردار سیگنال ارسالی به المنت بر حسب دما در این مثال به صورت زیر است :

مثال عملی کنترل هیسترزیس

برای مشاهده رفتار سیستم کنترل هیسترزیس ما آن را به صورت عملی تست می کنیم . محیطی که می خواهیم کنترل کنیم یک لیوان آب است همچنین ما پارامتر دمای آب این لیوان را کنترل می کنیم . برد کنترلی ما یک آردوینو UNO هست . همچنین دما را با استفاده از یک سنسور LM35 اندازه گیری می کنیم . هیتر مورد استفاده برای گرم کردن آب لیوان یک المنت انگشتی 24 ولت است که در تصویر زیر مشاهده می کنید :

المنت استفاده شده در پروژه
شکل 2-1 المنت مورد استفاده برای گرم کردن آب

همان طور که در بالا توضیح داده شد ، المنت ما 24 ولتی است و نمی توان آن را مستقیما با آردوینو خاموش و روشن کرد پس از یک مدار بافر استفاده می کنیم . در این مدار یک ماسفت IRF840 وظیفه سوئیچ کردن المنت را بر عهده دارد که به راحتی 24 ولت و 2 امپر جریان مورد نیاز المنت را تحمل می کند :

شماتیک مدار کنترل المنت
شکل 3-1 مدار کنترل المنت

به دلیل استفاده از تغذیه 24 ولت ، جهت جلوگیری از هر خطر احتمالی مثل اتصال 24 ولت به USB و آسیب دیدن لپ تاپ ، لذا از یک ماژول HC06 برای ارسال دیتا به کامپیوتر استفاده می کنیم . ولتاژ 24 ولت را علاوه بر مدار المنت به یک رگولاترو 12 ولت (برای کاهش ولتاژ ورودی به رگولاتور بعدی و تغذیه فن خنک کننده ) و 5 ولت برای تغذیه آردوینو متصل می کنیم . در تصویر زیر مدار کاملی که در نهایت بسته شده را نشان می دهد :

شکل 4-1 شماتیک کامل مدار مورد استفاده
شکل 4-1 شماتیک کامل مدار مورد استفاده

در تصویر بالا ، شماتیک نهایی مدار مورد استفاده به صورت ساده ای رسم شده است .

هدف نهایی ما کنترل دمای لیوان اب روی دمای 60 درجه به صورت هیسترزیس است . هیتر و سنسور دما را داخل یک لیوان آب قرار می دهیم تا در نهایت دمای لیوان آب را کنترل کنیم . برای شبیه سازی حالت های واقعی تر لیوان آب را در یک ظرف آب یخ قرار می دهیم تا با خاموش شدن هیتر دمای آب سریعا پایین بیاید اجباری به استافده از ظرف آب یخ نیست . این کار زمان کاهش دما را سریع تر خواهد کرد . برای کاهش دمای ماسفت ها از یک فن کوچک و هیتسینک استفاده شده است .

نمای کامل پروژه
شکل 5-1 نمای کلی مدار و محیط کنترلی

 

نمایی از لیوان مورد استفاده
شکل 6-1 تصویر سنسور و المنت قرار داده شده در لیوان آب
نمایی از لیوان مورد استفاده
شکل 7-1 نمای از بغل لیوان و ظرف آب یخ

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

پس برنامه ای که برای آردوین خواهیم نوشت به این صورت است که دما را از LM35 دریافت و آن را به پورت سریال ارسال کند تا درنهایت HC05 آن را برای کامپیوتر ارسال کند . در قدم بعدی اجرای تابع کنترل دما هست . در این تابع اگر دما کمتر از 55 درجه باشد المنت را روشن ( پین 10 یک می شود ) و اگر دما از 60 درجه بیشتر باشد المنت را خاموش می کند ( پین 10 را صفر می کند ) :

// Define the analog pin, the LM35's Vout pin is connected to
#define sensorPin A0

/************************************************************************************/
void temp_control(float temp)
{
  if(temp < 55)
    //Heater ON
    digitalWrite(10,HIGH);
  else if(temp > 60 )
    //Heater OFF
    digitalWrite(10,LOW);
}

/************************************************************************************/

void setup() {
  // Begin serial communication at 9600 baud rate
  pinMode(10,OUTPUT);
  Serial.begin(115200);
}

void loop() {
  // Get the voltage reading from the LM35
  int reading = analogRead(sensorPin);

  // Convert that reading into voltage
  float voltage = reading * (5.0 / 1024.0);

  // Convert the voltage into the temperature in Celsius
  float temperatureC = voltage * 100;

  
  temp_control(temperatureC); //Heate control function

  Serial.println(temperatureC);
  delay(1000); // wait a second between readings
}

در کد های فوق در تابع اصلی مقدار دما از ADC خوانده شده و پس از تغییرات لازم آن را به پورت سریال ارسال می کنیم . تابع اصلی که وظیفه کنترل دما را بر عهده دارد تابع ()temp_control است که مقدار دما را به این تابع ارسال می کنیم . در این تابع در صورت پایین بودن دما از 55 درجه بود هیتر را روشن می کند و تا زمانی که دما به 60 درجه نرسیده باشد هیتر را خاموش نخواهد کرد .

برای مشاهد دما های ارسالی و مانیتور کردن ان از برنامه QtSerialMonitor استفاده می کنیم . این برنامه قابلیت ذخیره داده ها در قالب یک فایل .CSV را دارد که می توان آن را در اکسل باز کرد . در تصویر زیر نمایی از این برنامه نشان داده شد است :

شکل 8-1 برنامه QtSerialMonitor

در برنامه QtSerialMonitor پس از تنظیم بادریت و پورت با فعال کردن گزینه Log برنامه داده های دریافتی را ذخیره می کند که در نهایت می توانید از قسمت File->Export از ان خروجی CSV بگیرید .

پس از تقریبا 20 دقیقه روشن بودن مدار ، 1400 دیتایی به کامپیوتر ارسال شده بود که از آن خروجی CSV گرفته و در نهایت در برنامه اکسل نمودار آن رسم گردید . در تصویر زیر فایل دیتای دریافت شده (دما های ارسالی از مدار ) در اکسل را مشاهد می کنید

دیتای به دست آمده در اکسل
شکل 9-1 دیتای به دست آمده در اکسل

و اما در نهایت اصل کاری ، همان چیزی که به دنبالش بودیم یعنی گراف دما بر حسب زمان . تصویر زیر عملکرد سیستم را به ما نشان می دهد :

گراف نهایی دما
شکل 10-1 گراف نهایی دما

همان طور که در گراف فوق مشاهده می کنید بعد از اینکه دما به محدوده 60 درجه رسید ، به طور مداوم دما بین تقریبا 52 درجه تا 62 درجه نوسان می کند . هیچوقت دما در این سیستم در مدت زمانی طولانی بر روی 60 درجه قرار نخواهد گرفت . دلیل این موضوع اینرسی حرارتی و عوامل خارجی موثر در دمای لیوان آب هستند . به طور مثال دما اگر زیر 60 درجه باشد و هیتر روشن باشد ، با رسیدن دما به 60 درجه هیتر خاموش می شود ولی همچنان دمای هیتر بالاست و باعث رد شدن دما از 60 درجه می شود . شاید این موضوع به ذهنتان بیاد که با کم کردن بازه کنترلی یعنی همان 55 در تا 60 درجه بتوان این نوسانات را بر طرف کرد . درست است با کم کردن بازه هیسترزیس می توان نوسانات دما را کم کرد اما هیچگاه به مقدار های بسیار پایین در حد یک یا دو درجه نخواهید رسید . در بسیاری از سیستم ها ما به دمای بسیار دقیقی نیاز خواهیم داشت (دما یا هر پارامتر دیگری ) مثلا در یک دستگاه جوجه کشی حتما باید دما در 37.7 درجه قرار بگیرد پس در این شرایط استفاده از روش کنترل هیسترزیس یا روش های مشابه به درد نخواهند خورد . در اینجاست که ما از PID استفاده خواهیم کرد .

کنترل کننده PID :

و اما موضوع اصلی این مقاله ، یعنی PID . PID مخفف تناسبی-انتگرالی-مشتقی است . در کنترل کننده های PID ما علاوه بر استفاده از مقدار فیدبک ، از مقدار انتگرال و مشتق فیدبک هم استفاده می کنیم . در بسیاری از توضیحات موجود در اینترنت درک درستی از رفتار PID ها نمی دهند و کاربر مجبور به حفظ مفاهیم به جای درک آن ها است . می توان این گونه PID را تفسیر کرد ، ما در کنترل یک سیستم غیر خطی (تمامی سیستم های موجود در طبیعت غیر خطی هستند ) ما علاوه بر حالت فعلی سیستم ، باید خروجی را بر اساس حالت های گذشته و پیش بینی حالت آینده تنظیم کنیم . در واقع فیدبکی که شما از خروجی سیستم دریافت می کنید (همان دمای گرفته شده توسط سنسور در مثال قبل ) وضعیت فعلی سیستم را به شما می دهد . همان طور که می دانید انتگرال در واقع مساحت نمودار یا مساحت یک معادله است و ما با گرفتن انتگرال از خروجی های قبلی می توانیم مقدار رفتار گذشته سیستم را داشته باشیم . همچنین مشتق که همان شیب نمودار است که با مشتق گرفتن از دو فیدبک قبلی شیب تغییرات نمودار را به دست می آوریم که این می تواند نماینگر رفتار سیستم در آینده باشد . به طور مثال اگر دما در نقطه اول 1 درجه باشد و در نقطه دوم 2 درجه باشد شیب نمودار برابر با 1 خواهد بود . حال سیستم دیگری در نقطه اول 1 درجه و در نقطه دوم 4 درجه است در این سیستم شیب تغییرات برابر 3 خواهد شد . پس در نقطه سومی که هنوز نیامده است سیستم اول دمای کمتری را خواهد داشت اما در سیستم دوم چون شیب به دست آمده تند تر است پس در نقطه سوم دمای بالاتری خواهیم داشت ، این تنها یک پیش بینی از آینده سیستم می باشد .

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

نکته مهمتر اینکه ما باید از مقدار خطا در PID استفاده کنیم . مقدار خطا همان مقدار تعیین شده برای خروجی منهای مقدار فیدبک یا مقدار اندازه گیری شده است .

این توضیحات صرفا جهت درک کلی PID است . بلوک دیاگرام یک سیستم کنترلی به صورت زیر می باشد :

بلوک دیاگرام PID
بلوک دیاگرام PID

ما در کنترل کننده PID به سه ضریب احتیاج داریم که این ضرایب را معمولا با آزمون و خطا به دست می آورند . اما خیلی خلاصه و مفید بخواهیم دیاگرام بالا را توضیح بدیم به این صورت است از مقدار خطای سیستم در هر لحظه یک بار مشتق و یک بار انتگرال می گیریم و در نهایت آن ها را با مقدار تناسبی جمع می کنیم و در خروجی سیستم قرار می دهیم . در واقع رابطه زیر اساس کاری هست که ما بر روی مقدار فیدبک انجام می دهیم و در خروجی قرار می دهیم :

رابطه PID
رابطه PID

در رابطه فوق درایم :

u(t) مقدار خروجی (مقداری که پس از محاسبه فرومول فوق باید به خروجی ارسال کنیم )

e(t) مقدار خطا که برابر با مقدار تعیین شده نهایی منهای فیدبک می باشد .

Kp ضریبی هست که در مقدار خطا ضرب می کنیم .

Ki ضریبی که در مقدار انتگرال فیدبک ضرب می کنیم .

Kd ضریبی که در مقدار مشتق فیدبک ضرب خواهیم کرد .

در نهایت با ضرب ضریب ها و جمع جملات مقدار به دست آمده که همان u(t) است را به خروجی سیستم ارسال می کنیم .

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

شرح کاری که ما باید انجام بدهیم این صورت است :

1- مقدار فیدبک (مقدار اندازه گیری شده توسط سنسور ) را از مقدار نقطه مطلوب ( مقداری که کاربر برای خروجی نهایی تنظیم کرده ماننده دمای 60 درجه در مثال قبل ) کم می کنیم تا مقدار خطا به دست آید .

پس ERROR = Set_Point – Feadback

ERROR مقدار خطا

Set_Point مقدار مطلوبی که در نهایت می خواهیم به آن برسیم .

2- یک عدد به عنوان Kp انتخاب می کنیم ( در ابتدا یک عدد رندوم را انتخاب می کنیم اما در نهایت با آزمون و خطا مقدار مناسب را انتخاب میکنیم ) مقدار Kp را در مقدار خطای به دست آمده از مرحل 1 (مرحله قبلی ) ضرب می کنیم تا در نهایت جمله اول (جمله تناسبی ) رابطه PID به دست آید .

خروجی سیستم u(t) =( Kp x ERROR )+ ….

3- حال نوبت به جمله انتگرالی است . در کتاب معادلات دیفرانسیل دبیرستان در ابتدای درس انتگرال در حد یک صفحه در مورد انتگرال عددی توضیح داده می شود و پس از آن وارد انتگرال معادلات می شود . نکته جالب این است که ما در عمل (یا حداقل در سیستم های الکترونیکی ) با معادلات و ضابطه ها سر و کار نداریم و این مقادیر واقعی هستند که ما اندازه گیری می کنیم . خروجی سنسور ها یک مقدار واقعی (عددی )هستند و به ما معادله ای برحسب x و y  نمی دهند که بخواهیم انتگرال آن را راحت به دست آوریم . پس ما به انتگرال عددی احتیاج داریم . یعنی انتگرل یک دنباله عددی مثل انتگرال سیگنال های خواانده شده از یک سنسور توسط ADC . من در این آموزش وارد مبحث انتگرال عددی نمی شوم و تنها رابطه آن را توضیح می دهم ( ما از تقریب ذوزنقه استفاده می کنیم که نتایج تا حد زیادی دقیق باشد ) . فرض کنید در زمان t0 مقدار y0 را از سنسور دریافت می کنیم و در زمان t1 مقدار y1 ، در زمان t2 مقدار y2 و به همین ترتیب در لحظه tn مقدار yn را از سنسور ( توسط واحد ADC ) دریافت می کنیم . حال فرض کنید می خواهیم مقدار انتگرال را در نقطه t0 تا t1 ( یا طور خلاصه می توان گفت انتگرال در نقطه t1 ) به دست آوریم پس :

انتگرال مقدار خطا Integral(t0 – t1) = ( ( y1 + y0) x ( t1– t0) )/2   +  Integral(t0)

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

توضیح رابطه فوق به این صورت است که مقدار خطای به دست امده از مرحله اول را با مقدار خطایی قبلی که به دست آوردیم جمع می کنیم ( y1 + y0) ، سپس این مقدار را در مدت زمان سپری شده بین دو اندازه گیری ( t1– t0 ) ضرب می کنیم . در نهایت حاصل این ضرب را بر عدد 2 تقسیم می کنیم . تا به اینجا انتگرال نقطه t1 را به دست آوردیم حال برای اینکه انتگرال کامل را از نقطه t0 تا t1 به دست آوریم باید حاصل را با انتگرال نقطه قبلی یعنی t0 جمع کنیم . 

انتگرال اولین نقطه را صفر در نظر می گیریم . یعنی integral(t0) = 0  اما از نقطه t0 به بعد مقدرا انتگرال قبلی غیر صفر خواهد بود .

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

پس جمله انتگرالی و تناسبی مراحل قبل را بخواهیم واضح تر بنویسیم به صورت زیر خواهد بود به صورت زیر خواهد شد :

خروجی سیستم u(1) =( Kp x ERROR1 )+ ( Ki x ( ( (ERROR1 + ERROR0 ) x (t1– t0) )/2   +  Integral(t0)) + …

معادله فوق برای نقطه t1 می باشد .

(t1– t0) یا به طور کلی (tn– t(n-1)) برابر با مدت زمان اندازه گیری مقادیر از سنسور می باشد . در مثال قبل ما هر یک ثانیه یک بار مقدار سنسور را اندازه گیری می کردیم . استفاده از زمان یک ثانیه ای می تواند رابطه فوق را ساده تر کند :

خروجی سیستم u(1) =( Kp x ERROR1 )+ ( Ki x ( ( (ERROR1 + ERROR0 ) x (t1– t0) )/2   +  Integral(t0)) + …

منظور از ERROR2 ، ERROR1 و ERRORn مقدار سیگنال خطا در لحظه اول ، دوم و n ام است .

4- پس از محاسبه مقدار تناسبی و مقدار انتگرالی نوبت به محاسبه مقدار مشتق سیگنال خطا می رسد . برای انداز گیری مشتق از رابطه زیر استفاده می کنیم :

 مشتق سیگنال خطا Derivative(ERROR1 ) = (ERROR1 – ERROR0 ) /(t1– t0)

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

پس در نهایت کاری که ما انجام خواهیم داد برای کنترل PID به صورت زیر است :

مقدار مطلوب (مقداری که می خواهیم به آن برسیم مثل دمای 60 درجه ) را منهای مقدار انازه گیری شده از سنسور می کنیم که این می شود مقدار خطای ما .

مقدار خطا را در Kp ضرب می کنیم . از سیگنال خطا انتگرال می گیریم و آن را در Ki ضرب می کنیم . از سیگنال خطا مشتق می گیریم و آن را در Kd ضرب می کنیم . در نهایت سه مقدار به دست آمده را جمع و حاصل را در خروجی قرار می دهیم ( مثلا دیوتی سایکل سیگنال PWM را برابر با آن قرار می دهیم ). 

پس رابطه نهایی PID  به صورت زیر است :

خروجی در نقطه اول u(1) =( Kp x ERROR1 )+ ( Ki x ( ( (ERROR1 + ERROR0 ) x (t1– t0) )/2   +  Integral(t0)) + (Kd (ERROR1 – ERROR0 ) /(t1– t0))

خروجی در نقطه دوم u(2) =( Kp x ERROR2 )+ ( Ki x ( ( (ERROR2 + ERROR1 ) x (t2– t1) )/2   +  Integral(t1)) + (Kd (ERROR2 – ERROR1 ) /(t2– t1))

ام n خروجی در نقطه u(n) =( Kp x ERRORn )+ ( Ki x ( ( (ERRORn + ERROR(n-1) ) x (tn– t(n-1)) )/2   +  Integral( t(n-1)))) + (Kd (ERRORn – ERROR(n-1) ) /(tn– t(n-1)))

ساده سازی PID :

گفتیم که ضرایب Kp و Ki و Kd اعداد ثابتی هستند که ما باید آن ها را با آزمون و خطا انتخاب کنیم . همچنین مقدار (tn– t(n-1)) در رابطه PID همان زمان اندازه گیری مقادیر است یعنی مدتد زمان سپری شده بین هر بار خواند سنسور ها . اگر پروسه خواندن از سنسور ها تغییری نکند و هر مثلا 2 ثانیه یک بار مقادیر را از سنسور ها بخوانیم پس مقدار (tn– t(n-1)) یک عدد ثابت خواهد بود و می توان آن را در ضرایب ادغام کرد و آن را در رابطه PID حذف کرد. همچنین ضریب 1/2 در جمله انتگرالی نیز یک عدد ثابت هست و می توان آن را با ضریب جمله انتگرالی ادغام کرد . ادغام اعداد ثابت در هم و استفاده از یک ضریب می تواند حجم محاسبات و منابع مصرفی میکروکنترلر یا سیستم کنترلی را به شدت کاهش دهد پس می توان از فرم ساده شده رابطه بالا در برنامه خود استفاده کنیم :

رابطه ساده شده u(n) =( Kp x ERRORn )+ ( Ki x ( ( (ERRORn + ERROR(n-1) ) +  Integral( t(n-1)))) + (Kd (ERRORn – ERROR(n-1) ) )

اجرای عملی PID :

خب نوبت به اجرای عملی الگوریتم PID می رسد . کاری که می خواهیم انجام دهیم تغییر برنامه مثال قبلی هست و در ساختار مدار هیچ تغییری ایجاد نخواهیم کرد . پس سیستم ما همان شکل 5-1 خواهد بود فقط تابع کنترل دما را پاک می کنیم و در آن الگوریتم PID یا همان رابطه ساده شده را می نویسیم . پس تابع temp_control به صورت زیر باز نویسی خواهد شد :

// Define the analog pin, the LM35's Vout pin is connected to
#define sensorPin A0


#define PID_MAX  200
#define PID_MIN  1

volatile float KP = 1;
volatile float KI = 1;
volatile float KD = 1;
volatile float set_point = 60;
volatile float ERROR_0 = 0;
volatile float ERROR_1 = 0;
volatile float Proportional = 0;
volatile float Integral_0 = 0;
volatile float Integral_1 = 0;
volatile float Derivative_0 = 0;
volatile float Derivative_1 = 0;
volatile float U = 0;
unsigned char pwm =0;

void temp_control(float temp)
{
  ERROR_1 = set_point - temp ;
  Proportional = KP * ERROR_1;
  Integral_1 =( KI * ((ERROR_1 + ERROR_0))) + Integral_0;
  Derivative_1 = KD * (ERROR_1 - ERROR_0);

  ERROR_0 = ERROR_1;
  Integral_0 = Integral_1;
  Integral_1 =0;
  ERROR_1=0;
  Derivative_1=0;
  U = Proportional + Integral_1 + Derivative_1;

    if(U < PID_MIN)
    U=0;
    if(U > PID_MAX)
    U=PID_MAX;
      
    pwm = map(U , 0,PID_MAX,0,255);
    analogWrite(10,pwm);  
}
void setup() {

  pinMode(10,OUTPUT);
  Serial.begin(115200);
}

void loop() {
  // Get the voltage reading from the LM35
  int reading = analogRead(sensorPin);

  // Convert that reading into voltage
  float voltage = reading * (5.0 / 1024.0);

  // Convert the voltage into the temperature in Celsius
  float temperatureC = voltage * 100;
  temp_control(temperatureC);

  Serial.println(temperatureC);

 /* if(Serial.available()>0)
  {
    char i=Serial.read();
    if(i=='7')
    KP+=0.1;
    if(i=='9')
    KP-=0.1;
    if(i=='4')
    KI+=0.1;
    if(i=='6')
    KI-=0.1;
    if(i=='1')
    KD+=0.1;
    if(i=='3')
    KD-=0.1;
    if(i=='u')
    {
      Serial.println("");
      Serial.print("U->");
      Serial.println(U);
    }
   if(i>48)
    {
      
    
    Serial.println("");
      Serial.print("Kp->");
      Serial.print(KP);

      Serial.print("  Ki->");
      Serial.print(KI);

      Serial.print("    Kd->");
      Serial.println(KD);

      }
   
  }*/
  
  delay(1000); // wait a second between readings
}

شرح برنامه فوق :

در خطوط 8 ، 9 و 10 ضرایب Ki ، Kp و Kd تعریف شده اند . شما در ابتدای اجرای برنامه می توانید مقدار آن ها را 1 در نظر بگیرید . پس از اجرای برنامه و مشاهده خروجی می توانید آن ها را تغییر بدهید که بعدا نحوه این تغییرات را شرح خواهیم داد .

در خطوط 11 تا 20 متغییر های لازم تعریف شده اند . چون مقادیر را در داخل یک تابع تغییر می دهیم بهتر است از Volatile استفاده شود اما در این جا الزامی هم نیست .

متغییر های تعریف شده به این صورت می باشند :

set_point مقدار دمای مطلوبی که در نهایت می خواهیم به آن برسیم که در این مثال مقدار آن را 60 درجه در نظر گرفته ایم .

در نامگذاری متغییر ها مقادیر قبلی با 0 و مقدار جدید را با 1 نام گذاری شده اند . مثلا ERROR_1 مقدار خطای فعلی است و ERROR_0 مقدار خطا در اجرای قبلی تابع می باشد .

به همین ترتیب IntegralIntegral ، Proportional و Derivative برای نگهداری جملات تناسبی ، انتگرالی و مشتقی هستند .

متغییر U جهت نگداری مقدار تابع PID هست .

متغییر pwm هم برای نگهداری مقدار pwm اعمال شده به خروجی است .

نکته : در خطوط 5 و 6 دو مقدار مینیمم و ماکسیمم تعریف شده اند . مقدار تابع PID ممکن است هر عددی باشد اما در نهایت باید این مقدار را به مقداری بین 0 تا 255 تبدیل کنیم تا بتوانیم با استفاده از دستور analogWrite() آن را به خروجی بدهیم . پس این دو مقدار تعریف شده اند تا مقدار به دست آمده از تابع از یک مقدار مشخص بزرگتر نشود و همچنین اگر مقدار آن از PID_MIN کوچک تر شد مقدار pwm را صفر می کنیم .

شرح تابع temp_control :

در خط 24 مقدار دمای اندازه گیری از سنسور یعنی همان متغییر temp را از دمای تعیین شده یعنی set_poin کم می کنیم تا در نهایت مقدار خطای فعلی به دست آید و این مقدار را در ERROR_1 ذخیره می کنیم .

در خط بعدی ضریب انتگرالی ( Ki ) را در مجموع خطای فعلی (ERROR_1) و خطای به دست آمده در مرحله قبلی (اجرای قبلی تابع temp_control) ضرب می کنیم و پس از آن مقدار به دست آمده را با انتگرال مرحله قبلی یعنی Integral_0 جمع می کنیم .

در مرحله اولی که تابع temp_control اجرا می شود مقدار ERROR_0 و Integral_0 صفر هستند .

در خط بعدی یعنی خط 27 ضریب مشتقی( Kd ) را در تفریق فعلی با خطای گذشته ضرب می کنیم و مقدار را در متغییر Derivative_1 ذخیره می کنیم .

بعد از محاسبه جملات تناسبی انتگرالی و مشتقی مقادیر را در متغییر های با شماره صفر ذخیره می کنیم تا در مرحله بعدی از اجرای تابع temp_control آن ها را داشته باشیم . همچنین مقدار ERROR_1 ، Integral_1 و Derivative_1 را برای دفعات بعدی صفر می کنیم (این کار محض اطمینان می باشد ) .

ERROR_1 را در ERROR_0 میریزم تا در مرحله بعدی ERROR_0 به عنوان خطای قبلی در دسترس باشد .

این کار را برای مقدار انتگرالی نیز انجام می دهیم .

در نهایت مقادیر تناسبی انتگرالی و مشتقی را با همدیگر جمع و در متغییر U ذخیره می کنیم .

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

در پایان با استفاده از تابع map مقدار U که بین 0 تا PID_MAXاست را به بازه 0 تا 255 برده و در نهات با استفاده از تابع analogWrite آن را به پین 10 که متصل به المنت است ارسال می کنیم .

این تمام آن چیزی است که یک کنترل کننده PID انجام می دهد .

در مثال هیتستر زیس به دلیل نا آشنا بودن با QtSerialMonitor دیتا ها را در نهایت در اکسل رسم کردم . اما این بار از خود QtSerialMonitor برای رسم نمودار نهایی استفاده شده است که تفاوتی در کار ایجاد نمی کند ( با تغییر تعداد دیتا های نمایشی می توانید به نمودار مطلوب برسید ) .

در نهایت با روشن کردن مدار و قرار دادن سنسور و المنت همانند مثال قبل در لیوان آب ، دیتا دریافتی را ذخیره و پلات می کنیم . نمودار زیر دیتای خروجی به دست آمده می باشد :

شگفت آور است ! خروجی سیستم در نهایت بر روی 60 درجه ثابت شد با تغییرات بسیار ناچیزی در حد 0.3 درجه !

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

تنظیم ضرایب :

شاید ابتدا عجیب به نظر برسد که چگونه ضرایب را تا این حد دقیق انتخاب کردیم که در نهایت خروجی پایداری به ما داد . اگر به کد های برنامه دقت کنید از خط 63 تا 100 به صورت کامنت در آمده اند . شما با راه اندازی اولیه مدار می توانید آن را از حالت کامت خارج کنید . کاری که این قطعه کد می کند به این صورت است که شما در هنگام روشن بودن مدار با فشردن عدد1 کیبورد مقدار Kp به صورت 0.1 افزایش می یابد برای کاهش نیز از کلید 9 کیبورد استفاده می شود . به این ترتیب از کلید های 4 ، 6 ، 1 ، 3 کیبورد برای افزایش و یا کاهش 0.1 دیگر ضرایب استفاه می شود . بعد از فشردن هر کدام از کلید ها علاوه بر تغییر مقدار ضرایب ، مقدار آن ها در محیط تریمنال سریال نمایش داده می شود .

مورد بعدی نحوه انتخاب PID_MAX مناسب هست . در حین اجرای برنامه با فشردن کلید u مقدار PID حساب شده در تابع temp_control در محیط سریال چاپ می شود که از این طریق می توانید بازه تغییرات PID را داشته باشد و در نهایت ثابت های PID_MAX و PID_MIN را می توانید بر اساس آن تنظیم کنید . من از یک کپسول گاز فندک جهت سرد کردن سنسور و به دست آوردن PID_MIN و همچنین از شعله فندک برای داغ کردن سنسور و در نتیجه به دست آوردن PID_MAX استفاده کردم .

در هنگام اجرای برنامه با آزمون و خطا و تغییر ضرایب در نهایت ضرایب را به صورت زیر به دست آوردم که در این حالت خروجی سیستم بهترین حالت خود را داشت ( نمودار تصویر قبلی با ضرایب پایین به دست آمده اند ) :

Kp=11.70

Ki= 3.3

Kd= 0

نکته : در سیستم هایی که به کندی تغییر می کنند و سیستم به ناگهان تغییر وضعیت نمی دهد اثر جمله مشتقی کمتر می شود و در نتیجه Kd نیز باید کوچک شود و گاها می توان Kd را صفر در نظر گرفت که در این حالت سیستم بصورت PI خواهد بود . به همین دلیل ضریب Kd مناسب برای مثال فوق 0 می باشد .

من ( نویسنده ) تلاش زیادی برای درک واقعیت PID و در نهایت استفاده از آن در میکروکنترلر های ساده کردم اما بجز مطالب کلیشه ای و به دور از جزئیات پیدا نکردم . ایده حفظ مطالب و استفاده طوطی وار علاوه بر اینکه توانایی مانور و هک کردن شما را پایین می آورد گاها م یتواند خطر ناک باشد پس همیشه باید به جزئیات و در نهایت درک کامل و درست مطالب پرداخت . به همین سبب تلاش کردم در حین یادگیری PID آموزش کامل و عملی آن را منتشر کنم تا کمک هر چند کوچکی به مهندسان و علاقه مندان دیگری که مثل من هستند کرده باشم . من مشتاق نظر و بازخورد شما عزیزان خواهم بود . با تشکر از شما بابت مطالعه این آموزش .

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Set your categories menu in Header builder -> Mobile -> Mobile menu element -> Show/Hide -> Choose menu
سبد خرید فروشگاه
شروع به تایپ کنید برای نوشته‌های که به‌دنبال آن هستید.
0
    0
    سبد خرید شما
    سبد خرید شما خالی می باشدبرگشت به فروشگاه
    صفحه اصلی
    حساب کاربری من
    وبلاگ