کتابخانه PID
مقدمه
روش های مختلفی برای کنترل یک پروسه وجود دارد که ساده ترین روش، ON/OFF میباشد و یک نوع کنترل ناپیوسته (گسسته) است. اما در بیشتر پروژه ها روش ON/OFF پاسخگو نیست برای مثال یک سیستم کنترل دمای محیط را در نظر بگیرید زمانی که دمای محیط از مقدار تنظیم شده کمتر باشد خروجی مدار وصل شده و عملگر که در اینجا یک المنت است را روشن کرده تا دمای محیط افزایش پیدا کند و زمانی که دمای محیط به مقدار تنظیم شده برسد خروجی مدار المنت را خاموش میکند اما مسئله اینجا هست که المنت با خاموش شدن بلافاصله سرد نمیشود و در نتیجه دمای محیط از میزان تنظیم شده بیشتر میشود.
بنابراین نیاز به کنترلری داریم که بتواند خروجی را به صورت درصدی و متناسب با مقدار مورد نظر کنترل کند. این کنترلر باید بتواند میزان تفاوت بین عامل کنترل شونده و مقدار تنظیم شده (setpoint) را محاسبه و خروجی لازم برای کنترل پروسه را بدست آورد.
همچنین کنترلر باید بتواند میزان خطای حالت ماندگار را به صفر برساند و متناسب با سرعت تغییر خطا در زمان، واکنش نشان داده و خروجی لازم را تولید کند به این روش کنترل، کنترل کننده PID گفته میشود.
کنترل PID: رازِ پایداری در دنیایِ سیال
کنترل PID، که مخفف عبارت Proportional-Integral-Derivative است، یک الگوریتم کنترلی مبتنی بر فیدبک است که در طیف گستردهای از سیستمها برای تنظیم و حفظ یک متغیر در نقطه ایدهآل خود استفاده میشود. از رباتهای کوچک تا نیروگاههای بزرگ، ردپای این الگوریتم قدرتمند به وضوح قابل مشاهده است.
سه اصل اساسی PID
کنترل تناسبی (P): این بخش از الگوریتم، به خطای لحظه ای بین متغیر فعلی و متغیر مطلوب توجه میکند و بر اساس آن، سیگنال کنترلی لازم را تولید میکند.
کنترل انتگرالی (I): این بخش، خطاهای گذشته را نیز در نظر میگیرد و به دنبال جبران خطاهایِ انباشته شده است. به عبارت دیگر، حافظهای در الگوریتم ایجاد میکند تا از انحرافِ طولانی مدت از نقطه ایدهآل جلوگیری کند.
کنترل مشتقگیری (D): این بخش، به سرعت تغییرات خطا توجه میکند و تلاش میکند تا از نوسانات ناگهانی و غیرقابل کنترل در سیستم جلوگیری کند.
مزایای استفاده از کنترل PID
سادگیِ پیادهسازی: این الگوریتم به نسبت ساده است و میتوان آن را به راحتی در سیستمهای مختلف پیادهسازی کرد.
قابلیتِ تنظیم: با تنظیمِ پارامترهایِ PID، میتوان عملکردِ الگوریتم را بهینه کرد و به پایداریِ دلخواه در سیستم دست یافت.
قابلیتِ تعمیم: این الگوریتم انعطافپذیر است و میتوان از آن در طیف گستردهای از سیستمها استفاده کرد.
کاربردهای کنترل PID
کنترلِ دما: در سیستمهایِ گرمایشی و تهویه مطبوع، از PID برای تنظیمِ دقیقِ دما استفاده میشود.
کنترلِ سرعت: در موتورها و رباتها، از PID برای تنظیمِ سرعتِ دورانِ موتور استفاده میشود.
کنترلِ موقعیت: در رباتها و سیستمهایِ CNC، از PID برای کنترلِ دقیقِ موقعیتِ اجسام استفاده میشود.
کنترلِ سطح: در مخازنِ ذخیرهسازی، از PID برای کنترل سطح مایعات استفاده میشود.
تعاریف موجود در کنترل PID
1. متغیر فرآیند (PV):
متغیری که توسط کنترلر PID اندازه گیری و کنترل می شود. به عنوان مثال، می تواند دما، سرعت، فشار یا موقعیت باشد.
2. نقطه تنظیم (SP):
مقدار مطلوب برای متغیر فرآیند. این مقدار توسط کاربر تعیین می شود.
3. خطا (e):
تفاوت بین نقطه تنظیم (SP) و متغیر فرآیند (PV). خطا سیگنالی است که به کنترلر PID اعمال می شود تا PV را به سمت SP هدایت کند.
4. کنترلر تناسبی (P):
این بخش از کنترلر PID به خطای فعلی (e) پاسخ می دهد. سیگنال کنترلی (u) متناسب با خطا تولید می کند.
5. ضریب تناسبی (Kp):
پارامتری که به کنترلر تناسبی (P) می گوید چقدر به خطای فعلی (e) پاسخ دهد. Kp بزرگتر، پاسخ سریعتر و تهاجمی تر به خطا را به دنبال خواهد داشت.
6. کنترلر انتگرالی (I):
این بخش از کنترلر PID به خطاهای گذشته (مجموع خطاها) پاسخ می دهد. سیگنال کنترلی (u) متناسب با مجموع خطاها تولید می کند.
7. ضریب انتگرالی (Ki):
پارامتری که به کنترلر انتگرالی (I) می گوید چقدر به خطاهای گذشته (مجموع خطاها) پاسخ دهد. Ki بزرگتر، اثر خطاهای گذشته را در سیگنال کنترلی (u) افزایش می دهد.
8. کنترلر مشتقگیری (D):
این بخش از کنترلر PID به سرعت تغییر خطا (نرخ خطا) پاسخ می دهد. سیگنال کنترلی (u) متناسب با نرخ خطا تولید می کند.
9. ضریب مشتقگیری (Kd):
پارامتری که به کنترلر مشتقگیری (D) می گوید چقدر به سرعت تغییر خطا (نرخ خطا) پاسخ دهد. Kd بزرگتر، اثر نرخ خطا را در سیگنال کنترلی (u) افزایش می دهد.
10. سیگنال کنترلی (u):
سیگنالی که توسط کنترلر PID تولید می شود و به سیستم اعمال می شود تا متغیر فرآیند (PV) را به سمت نقطه تنظیم (SP) هدایت کند.
11. زمان سیکل (T):
فاصله زمانی بین نمونهگیری های متغیر فرآیند (PV) و محاسبه سیگنال کنترلی (u).
12. پایداری:
توانایی سیستم برای حفظ متغیر فرآیند (PV) در حدود نقطه تنظیم (SP) در برابر اغتشاشات.
13. نوسان:
تغییر ناخواسته و دورهای متغیر فرآیند (PV) در اطراف نقطه تنظیم (SP).
14. تنظیم:
فرایند یافتن مقادیر مناسب برای Kp، Ki و Kd به طوری که سیستم به طور پایدار و با حداقل نوسان در نقطه تنظیم (SP) عمل کند.
15. روشهای تنظیم:
روشهای مختلفی برای تنظیم کنترلر PID وجود دارد، مانند روش زیگلر-نیکولز، روش لین-آنتونیو و روش ریشه مکان.
کتابخانه PID
کتابخانه های مختلفی برای PID تو فضای نت وجود داره، اینجا کتابخانه ای برای کنترل PID قرار میدهم که خودم استفاده کردم و شما هم میتوانید در پروژه برای کنترل مولفه پروسه کنترلی استفاده کنید.
تنظیم ضرایب PID را میتوانید به صورت آزمون و خطا انجام دهید تا به مقدار مطلوب دست پیدا کنید و بدست آوردنشان تجربی هست. اما به طور کلی مقدار ضریب P دارای مقدار بیشتر سپس ضریب D و مقدار ضریب I بسیار کم هست. بهتر هست تا تعریف ضرایب را با دقت بخوانید تا متوجه عملکرد هر کدام از آنها بشوید.
در صورتی که ضریب P مقدار زیادی داشته باشی خروجی ناپایدار و تناوبی میشود.
در تصویر زیر تاثیر هر کدام از ضرایب را در خروجی کنترل PID میبینید
ضرایب PID را به صورت ماکرو در ابتدای برنامه باید مقدار دهی کنید.
1 2 3 | #define EPID_KP 30.0f #define EPID_KI 1.2f #define EPID_KD 5.0f |
مقدار حداقل و حداکثر که به خروجی اعمال میشود را هم با ماکرو های زیر تعریف کنید.
1 2 | #define PID_LIM_MIN 0.0f #define PID_LIM_MAX 255.0f |
سپس یک متغیر از نوع epid_t تعریف کنید.
سپس تابع epid_init را برای پیکربندی PID قبل از حلقه اصلی برنامه فراخوانی کنید و متغیر تعریف شده در بالا، مقدار PV، مقدار PID_LIM_MIN و ضرایب PID را به تابع معرفی کنید.
1 2 | /* Initialize PID controller */ epid_info_t epid_err = epid_init(&pid_ctx,Input, Input, PID_LIM_MIN,EPID_KP, EPID_KI, EPID_KD); |
در صورتی که خروجی تابع خطا داشت، علت خطا را بررسی کنید.
1 2 3 4 | if (epid_err != EPID_ERR_NONE) { Serial.print("\n\n** ERROR: epid_err != EPID_ERR_NONE **\n\n"); while (1) { ; } } |
سپس در حلقه اصلی برنامه مقدار PV را بخوانید.
1 | Input = analogRead(PIN_INPUT); |
در ادامه میتوانید به شکل زیر مقدار خروجی لازم برای اعمال به عملگر را بدست آورید.
1 2 3 4 5 6 7 8 | epid_pid_calc(&pid_ctx, SETPOINT, Input); /* Calc PID terms values */ /* Apply deadband filter to `delta[k]`. */ deadband_delta = pid_ctx.p_term + pid_ctx.i_term + pid_ctx.d_term; if ((deadband_delta != deadband_delta) || (fabsf(deadband_delta) >= DEADBAND)) { /* Compute new control signal output */ epid_pid_sum(&pid_ctx, PID_LIM_MIN, PID_LIM_MAX); Output = (int)lroundf(pid_ctx.y_out); /* float to int */ } |