فرآیند کنترل شامل مراحلی است که برای کنترل کردن یک یا چندین پارامتر (مثلا دما، فشار، سرعت، مو قعیت و غیره) مورد استفاده قرار بگیرد. یکی از مهمترین و معروفترین کنترلکنندهها، کنترلر PID است که از نوع کنترلرهای پیوسته میباشند. زیرا در مقایسه با کنترلرها خاموش/روش به طور پیوسته خروجی را تغییر میدهند. یک مثال از کنترلر در شکل ۱ نشان داده شده است.
همانطور که در شکل ۱ پیداست کنترلر، موقعیت موتور را کنترل میکند. در این سیستم کنترلی ابتدا انکودر، موقعیت کنونی موتور را اندازه میگیرد. این اندازهگیری یک سیگنال اندازهگیری تولید میکند. سیگنال اندازهگیری با مقدار مطلوب (در این شکل موقعیت مطلوب موتور) مقایسه میگردد. اختلاف بین این دو مقدار میزان خطا را تعیین میکند. بر اساس این خطا کنترل کننده یک سیگنال به موتور میفرستد. این نوع کنترل کردن فرآیند، کنترل بر اساس خطا نامیده میشود، زیرا سیگنال فعال کننده از روی مقدار خطای بین مقدار واقعی و مقدار مطلوب تعیین میشود. کنترلهای مختلفی بر اساس خطا کار میکنند، که معمولیترین آنها کنترلهای PID هستند.
در بسیاری از فرآیندهای صنعتی از کنترل کننده PID (تناسبی-اننگرالی-مشتقی) به عنوان ساختار اصلی کنترلکننده استفاده میشود. هدف اصلی از فیدبک در این کنترل کننده عبارت است از:
ابتدا نحوهی کارکرد کنترل PID را بررسی میکنیم. شکل ۲ را در نظر بگیرید. متغییر e که نشان دهنده خطای ردیابی است، تفاوت میان مقدار خواسته شده (r) و مقدار واقعی خروجی (y) میباشد. سیگنال خطا وارد کنترل کننده میشود و مقدار مشتق و انتگرال آن محاسبه میشود و سپس سیگنال کنترلی u با ضریبی از سیگنال خطا (kp)، ضریبی از انتگرال خطا (ki) و ضریبی از مشتق خطا (kd) محاسبه میشود. بنابراین خروجی کنترل PID از فرمول زیر بدست میآید.
u=Kpe+Ki∫edt+Kd(de)/dt
سیگنال u به دستگاه فرستاده میشود. و سیگنال (y(t از دستگاه دریافت خواهد شد. خروجی جدید y دوباره به سنسور برای تعیین خطای سیگنال (e) فرستاده میشود. کنترلر این سیگنال خطای را دریافت کرده و مشتق و انتگرال آن را محاسبه میکند و این روند ادامه دارد.
کنترلر تناسبی (Kp) بر روی کاهش زمان نشست تاثیر بسزایی دارد. اما نمیتواند خطای حالت ماندگار رو صفر کند. کنترل انتگرال (Ki) بر روی خطای حالت ماندگار تاثیر دارد، اما ممکن است که بر روی پاسخ گذرای تاثیر منفی داشته باشد. کنترل مشتق (Kd) باعث افزایش پایداری سیستم، کاهش بالازدگی و بهبود پاسخ گذرا میشود. جدول ۱ تاثیر هر یک از این پارامترها را بر روی وضعیت سیستم نشان میدهد.
تاثیر این پارامترها در شکل ۳ به صورت تصویری نشان داده شده است. ضریب Kp سرعت سیستم را افزایش میدهد و خطای حالت دائم را تا حدودی کاهش میدهد (اما صفر نمیکند). افزودن جمله انتگرالی (ضریب Ki) خطای حالت دائم را صفر میکند، اما مقدار زیادی بالازدگی (overshoot) به پاسخ گذرا اضافه مینماید. جمله مشتقی (Kd) نوسانات پاسخ گذرا را تضعیف کرده و پاسخ پله را به شکل پله ایدهآل نزدیک مینماید.
در اینجا میخواهیم موتور DC را با استفاده از کنترلر PID نوشته شده در نرم افزار متلب کنترل کنیم. فرض کنید میخواهیم موتور را در پالس 5000 کنترل نماییم. شکل ۴ شماتیک نحوهی فراخوانی کنترلر PID را نشان میدهد.
برنامه نوشته شده شامل یک برنامه اصلی و یک تابع میباشد که به صورت گام به گام با مراحل این برنامه آشنا خواهیم شد:
تابع goForward نوشته شده داری دو ورودی است:
w=مقدار سرعت تعیین شده برای موتور DC توسط کنترلر PID
s= فراخوانی port بازشده
توجه کنید که سرعت هر یک از موتورها در درایور MDC20 یک سرعت نسبی است که میتواند یک عدد از 0 تا 255باشد (0X00 تا 0XFF). عدد 0 متناظر با سرعت 0 و عدد 255 متناظر با ماکزیمم سرعت موتور در جهت مورد نظر میباشد. بنابراین اگر در این برنامه دقت شود خواهید دید که اگر w>255 یا w<-255 باشد، مقدار سرعت به 255 تغییر کرده است.
در اینجا موتور شماره یک کنترل خواهد شد. بنابراین برای تعیین جهت موتور شماره یک به ترتیب در جهت ساعتگرد و پادساعتگرد مقادیر 64 و 66 بایستی ارسال گردند. بعلاوه مقدار ’00’ در این برنامه بیانگر شماره درایور است. برای آشنایی بیشتر با این مقادیر لطفا به سایت شرکت ربات سازان به نشانی (https://robotmakers.ir) مراجعه نمایید.
function goForward(w,s) if w>0 if w>255 w=255; end w=fix(w); gotoConfig = hex2dec({'00','64',num2str(w)}); fwrite(s,gotoConfig); else if w<-255 w=-255; end w=fix(w); gotoConfig = hex2dec({'00','66',num2str(abs(w))}); fwrite(s,gotoConfig); end end
در ابتدا بایستی port مورد نظر برای داریور را فراخوانی کرده و باز کنیم. بایستی توجه داشته باشید که در این جا از com13 استفاده شده است. اما ممکن است که برای شما این com با شماره متفاوت باشد.
clear delete(instrfind) s=serial('COM13'); set(s,'BaudRate',9600); fopen(s);
قبل از شروع کنترل بایستی مقداردهی اولیه به برخی از پارمترهای موجود در کنترلر نسبت داده شود. در این برنامه نامگذاری به صورت ذیل انجام شده است:
r= مقدار مطلوب پالس
yp= خروجی انکودر
kP= ضریب کنترلر تناسبی
Ki= ضریب کنترلر انتگرالی
Kd= ضریب کنترل مشتق پزیری
previous_error= پارامتر استفاده شده برای محاسبه مشتق خطا
integral= پارامتر استفاده شده برای محاسبه انتگرال خطا
dt= بازه زمانی
r = 5000; % reference of 5000 yp = 0; % init response Kp = 1; % proportional constant Ki = 0.45; % proportional constant Kd = 0; % derivative term is not necessary in this problem previous_error = 0; integral = 0; dt = 0.001;
برای نوشتن PID ابتدا حلقهای تشکیل شده است تا زمان کلی که میخواهیم این کنترلر عمل نماید را تعیین کنیم. همانطور که در بالا هم گفته شده پس از آنکه خطا (error= r-yp) تعیین گردید، بایستی انتگرال خطا و مشتق خطا نیز تعیین گردد. میدانید که مفهوم گسسته انتگرال همان سیگما یا جمع زیر نمودار استفاده شده است (شکل ۵). بنابراین برای محاسبه انتگرال (integral= integral + error*dt) استفاده میشود.
بعلاوه مشتق خطا نیز بیانگر تغییرات خطا به واحد زمان (dt) است. لذا میتوان مشتق خطا را هم براحتی محاسبه کرد. بعد از آنکه انتگرال و مشتق خطا محاسبه گردید، بایستی خروجی کنترلر (u) را محاسبه نمود. که قبلا اشاره شد، خروجی کنترلر در اینجا سرعت چرخش موتور است. با تعیین شدن سرعت، حال با دستور (goForward(u,s موتور را کنترل خواهیم کرد. همانطور که گفته شد بایستی در هر لحظه مکان فعلی موتور نیز برای تعیین خطا محاسبه گردد. بدین منظور بایستی از انکودر مقدار پالس را دریافت کنیم. برای تعیین پالس از دستور ‘6D’ استفاده شده است. زیرا این دستور برای دریافت میزان پالسهای انکودر موتور یک در مد Quadrature میباشند. برای آشنایی بیشتر با این دستورات به سایت رسمی ربات سازان (https://robotmakers.ir) مراجعه کنید.
for i=1:1500 error = r-yp; % update error integral = integral + error*dt; % integral term derivative = (error-previous_error)/dt; % derivative term u = fix(Kp*error+Ki*integral+Kd*derivative); % action of control goForward(u,s); gotoConfig = hex2dec({'00','6D'}); fwrite(s,gotoConfig); yp = abs(fscanf(s,'%e',14));% solve ode for velocity previous_error=error yptoplot(i)=yp; end
برای ایستادن موتور دستور ’00’ به موتور فرستاده میشود. و سپس با استفاده از دستور plot خروجی مطلوب و خروجی انکودر را رسم میکنیم. شکل ۶ مقایسه بین مقدار مطلوب و خروجی انکودر را نشان میدهد.
goForward('00',s); % End the program plot(yptoplot,'--') hold on plot(r)
اکنون به جای مقدار زاویه مطلوب، به کمک درایور MDC20 مسیر سینوسی داده شده (Reference=3*sin(20*t)) را دنبال میکنیم. برنامه متلب به صورت زیر بازنویسی شده است. شکل زیر مسیر مطلوب و مسیر پیموده شده توسط موتور دیسی را نشان میدهد.
clc; close all; clear; delete(instrfind) s=serial('COM13'); set(s,'BaudRate',9600); fopen(s); yp = 0; % init response Kp = 100; % proportional constant Ki =20; % proportional constant Kd = 0; % derivative term is not necessary in this problem previous_error = 0; integral1 = 0; dt = 0.001; % CONTROL LOOP i=0; w=20; for t=0:0.001:2 r = 3*(sin(w*t)); % reference of 5000 % i=i+1; error = r-yp; % update error integral1 = integral1 + error*dt; % integral term derivative = (error-previous_error)/dt; % derivative term u = fix(Kp*error+Ki*integral1+Kd*derivative); % action of control goForward(u,s); gotoConfig = hex2dec({'00','6D'}); fwrite(s,gotoConfig); yp = (fscanf(s,'%e',14))*2*pi/12000;% solve ode for velocity i=i+1; yptoplot(i)=yp; previous_error=error; yyy(i)=u; Reference(i)=r; end plot(yptoplot,'--'); hold on plot(Reference);
برای دانلود برنامه متلب بر روی لینک زیر کلیک نمایید:
دانلود برنامه متلب، پیاده سازی کنترل PID در مسیر سینوسی
مشاهده فیلم کنترل PID با درایور MDC20 در نرم افزار MATLAB
10 Comments
سلام
کد حالت سینوسی رو اجرا کردم
هیچکونه عکس و اعملی روی موتورها نداشت.
صرفا همان نمودار مجاز آورد
سلام
لطفا ابتدا موارد زیر رو بررسی کنین:
۱- در گام اول دیتاشیت رو به دقت مطالعه کنین.
۲- با استفاده از نرم افزار هرکولس درایور رو راه اندازی کنین تا با نحوه ی عملکرد درایور به خوبی آشنا بشین.
۳- برای استفاده از درایور به منظور پیاده سازی الگوریتم های کنترلی حتما بایستی مد انکودر رو در حالت quadrature تنظیم کنین.
۴- در نرم افزار متلب تنظیمات درگاه سریال رو به درستی انجام بدین.
۵- سعی کنین کدهای آموزشی قرار داده شده در مقالات رو خط به خط با استفاده از help خود متلب متوجه بشین.
اگر باز هم مشکل حل نشد مشکل رو دقیق تر مطرح کنین تا بتونیم بهتر کمکتون کنیم.
ممنون
تیم فنی ربات سازان
[…] مقاله پیشین «پیاده سازی کنترلر PID در نرم افزار MATLAB به کمک درایور MDC20» با نحوه نوشتن و ارتباط نرمافزار متلب با درایور MDC20 […]
[…] شده است. برای اطلاعات بیشتر به مقاله PID با عنوان «پیاده سازی کنترلر PID در نرم افزار MATLAB به کمک درایور MDC20» مراجعه […]
[…] پیادهسازی کنترلر PID در نرم افزار MATLAB به کمک درایور MDC20 … […]
[…] هر چه بهتر با کنترل به PID به مقالات «الگوریتم PID» و «پیاده سازی کنترل PID در نرم افزار MATLAB به کمک درایور MDC20» مراجعه نمایید. برای مشاهده و نحوه پیادهسازی به فیلم […]
[…] مقدمهای در مورد کنترل PID بیان شود. برای این منظور به این لینک مراجعه […]
[…] پیادهسازی کنترلر PID در نرم افزار MATLAB به کمک درایور MDC20 … […]
[…] مقاله پیشین «پیاده سازی کنترلر PID در نرم افزار MATLAB به کمک درایور MDC20» با نحوهی نوشتن و ارتباط نرمافزار متلب با درایور […]
سلام من یک سوال داشتم، اگر من به جای موتور یک المنت داشته باشم دیتاهای ورودیم که مربوط به سنسور دمایی یا ترموکوپل من میشه رو چی باید بدم؟ یعنی همون yp که مربوط به خطای تناسبی هست.
مورد دیگه اینکه اعدادی که به کدهای مربوطه دادین رو بر چه اساسی گذاشتین؟ مثلا ۹۶۰۰ یا ۰ تا ۵۰۰۰ و یه مورد دیگه اون ’۰۰’ هست.
اگر یک توضیحی بشه بهم بدین عالی میشه