الگوریتم کنترل PID در حال حاضر یکی از پرکاربردترین الگوریتم های کنترلی است. کنترل PID مزایایی مانند پارامترهای قابل تنظیم، طیف گسترده ای از کاربردها و دقت کنترل بالا را ارائه می دهد. در مهندسی عملی، الگوریتم PID را می توان در زمینه های مختلفی از جمله کنترل الکترومکانیکی، اتوماسیون صنعتی، روباتیک و کنترل ریزپردازنده اعمال کرد.
سه پارامتر الگوریتم PID عبارتند از: بهره متناسب Kp، ثابت زمانی انتگرال Ti، و ثابت زمانی مشتق Td. سیستم های مختلف به پارامترهای PID متفاوتی نیاز دارند و پارامترهای بهینه معمولاً از طریق آزمایش و اشکال زدایی به دست می آیند. ثابت تناسبی Kp بهره متناسب را تنظیم می کند و نسبت خروجی سیستم به خطای بازخورد را در حین کار کنترل می کند. ثابت زمان انتگرال Ti، بهره انتگرال را تنظیم می کند و انباشت خطاها را در طول عملیات سیستم کنترل می کند. و ثابت زمانی مشتق Td بهره مشتق را تنظیم می کند و نرخ تغییر خطاها را در سیستم کنترل کنترل می کند.
روش پیاده سازی الگوریتم PID بر روی میکروکنترلر چیست؟
برای پیاده سازی یک الگوریتم کنترل PID بر روی یک میکروکنترلر، رویکرد کلی به شرح زیر است:
1. **تعیین پارامترهای PID**:
- بهره متناسب مناسب (Kp)، زمان انتگرال (Ti) و زمان مشتق (Td) را بر اساس ویژگیها و الزامات شی کنترلشده واقعی انتخاب کنید.
2. **اکتساب داده های حسگر**:
- از حسگرهای مناسب (مانند سنسورهای دما، حسگرهای موقعیت و غیره) برای به دست آوردن-دادههای بازخورد واقعی از شیء کنترلشده استفاده کنید.
3. **مقایسه نقطه تنظیم و مقادیر بازخورد **:
- برای محاسبه خطا (خطا) نقطه تنظیم (مقدار دلخواه) را با مقدار بازخورد مقایسه کنید.
4. **محاسبه PID**:
- متغیر کنترل (خروجی) را با استفاده از فرمول الگوریتم PID محاسبه کنید: PID=Kp * Error + Ki * ∫ Error dt + Kd * d(Error)/dt.
- Kp، Ki، و Kd پارامترهای PID هستند. خطا مقدار خطا است. ∫ خطای dt بیانگر عبارت انتگرال است. و d(Error)/dt عبارت مشتق را نشان می دهد.
5. **محدود کردن** (اختیاری):
- برای برنامههای خاص، ممکن است لازم باشد محدوده مقدار خروجی را محدود کنید تا از فراتر رفتن آن از محدوده قابل قبول شی کنترلشده جلوگیری شود.
6. **سیگنال کنترل خروجی**:
- متغیر کنترل محاسبه شده به عنوان سیگنال کنترل استفاده می شود و برای تنظیم و کنترل شی کنترل شده به محرک (مانند یک موتور یا شیر) ارسال می شود.
7. **فرکانس کنترل را تنظیم کنید**:
- یک فرکانس کنترل مناسب-چرخه اجرای الگوریتم کنترل-بر اساس الزامات برنامه خاص تنظیم کنید.
8. **تکرار الگوریتم PID**:
- در یک حلقه زمان واقعی-مراحل فوق را به طور مکرر اجرا کنید تا به طور مداوم مقدار بازخورد را نظارت کنید، متغیر کنترل را محاسبه کنید، و سیگنال کنترل را برای دستیابی به کنترل پایدار سیستم، خروجی بگیرید.
در برنامه نویسی میکروکنترلر واقعی، می توانید ابزارهای توسعه و زبان های برنامه نویسی مناسب (مانند زبان C یا اسمبلی) را بر اساس مدل میکروکنترلر خاص و پلت فرم توسعه انتخاب کنید. لازم به ذکر است که در کاربردهای عملی، تکنیک های زیادی برای بهینه سازی و بهبود الگوریتم PID مانند جداسازی انتگرال و PID تطبیقی وجود دارد که با توجه به نیازهای خاص قابل تحقیق و پیاده سازی است.
اصول و عملکرد کنترلرهای PID
یک کنترل کننده PID از سه جزء تشکیل شده است: متناسب (P)، انتگرال (I) و مشتق (D). با پردازش خطا، انحراف و نرخ تغییر سیستم یک خروجی کنترل تولید می کند. عملیات آن شامل مراحل زیر است:
- مقادیر تنظیم و بازخورد را بدست آورید
- خطا را محاسبه کنید
- خروجی کنترل را بر اساس سود متناسب، جمله انتگرال و عبارت مشتق محاسبه کنید
- پارامترهای کنترلر را به روز کنید
- سیگنال کنترل را خروجی کنید
پیاده سازی کد STM32
کد زیر نمونه ای برای طراحی و پیاده سازی یک کنترلر PID با استفاده از میکروکنترلر STM32 است:
```c
#include "stm32f4xx.h"
// پارامترهای کنترل کننده PID را تعریف کنید
شناور Kp=0.5; // سود متناسب
شناور کی=0.2; // سود انتگرال
float Kd=0.1; // سود مشتق
// متغیرهای ذخیره سازی را تعریف کنید
نقطه تنظیم شناور=50.0; // نقطه تنظیم
بازخورد شناور=0.0؛ // مقدار بازخورد
خطای شناور=0.0؛ // خطا
float last_error=0.0; // خطای قبلی
انتگرال شناور=0.0; // اصطلاح انتگرال
// تابع محاسبه خروجی کنترلر PID
float pidController (float dt)
{
// محاسبه خطا
خطا=نقطه تنظیم - بازخورد.
// محاسبه انتگرال
خطای انتگرال += * dt;
// محاسبه مشتق
مشتق شناور=(خطا - last_error) / dt;
// محاسبه خروجی کنترل
خروجی شناور=Kp * خطا + Ki * انتگرال + Kd * مشتق.
// خطای قبلی را به روز کنید
last_error=خطا;
خروجی بازگشتی؛
}
int main (void)
{
در حالی که (1)
{
// مقدار بازخورد را بازیابی کنید
// بازه زمانی را تنظیم کنید
// محاسبه خروجی PID
float dt=0.01; // در این مثال، فاصله زمانی 0.01 ثانیه است
float control_output=pidController(dt);
// خروجی سیگنال کنترل
// تاخیر برای یک دوره زمانی
برای (int i=0; i < 10000; i++);
}
بازگشت 0;
}




