آموزش GUI متلب: ساخت اتوران رابط گرافیکی (قسمت ۴)
۱۴ شهریور ۱۳۹۸پیادهسازی کنترل PID بر روی درایور MDC20 به صورت بلادرنگ (Real-Time) در محیط سیمولینک
۱۴ شهریور ۱۳۹۸GUI در نرم افزار متلب
برای فهمیدن نام پورت، به Device Manager ویندوز مراجعه کنید. سپس در قسمت Port نام پورت های متصل شده را نوشته است (در صورت اشکال با ما تماس بگیرید). کد نوشته شده زیر نحوهی استفاده از Pop up menu را نشان میدهد:
delete(instrfind) a1 = get( handles.PORT,'value'); if (a1==2); p = 'COM1'; elseif (a1==3); p = 'COM2'; elseif (a1==4); p = 'COM3'; elseif (a1==5); p = 'COM4'; elseif (a1==6); p = 'COM5'; elseif (a1==7); p = 'COM6'; elseif (a1==8); p = 'COM7'; elseif (a1==9); p = 'COM8'; elseif (a1==10); p = 'COM9'; elseif (a1==11); p = 'COM10'; elseif (a1==12); p = 'COM11'; elseif (a1==13); p = 'COM12'; elseif (a1==14); p = 'COM13'; elseif (a1==15); p = 'COM14'; elseif (a1==16); p = 'COM15'; end s=serial(p); set(s,'BaudRate',9600); fopen(s);
سپس با استفاده از Edit Text نسبت چرخ دنده موتور را (در صورت وجود گیربکس) میگیریم که کدهای آن به صورت زیر است:
ratio1=str2num(get(handles.ratio,'string'));
همچنین تعداد پالس های Encoder متصل به موتور را مانند این کد وارد میکنیم:
pulse1=str2num(get(handles.pul,'string'));
مورد استفاده تعداد پالس و نسبت چرخدنده برای محاسبه دقیق میزان چرخش موتور است، به صورتی که در ابتدا تعداد پالسی که موتور میچرخد را از Encoder میگیرد سپس برای تبدیل این تعداد پالس به درجه آن را در [360/(encoder puls*Gear rate)] ضرب میکند. همپنین به دلیل وجود موتور گیربکس دار این نسبت را در 1/24 ضرب میکند. که کد نهایی آن به صورت زیر در میآید:
Ab=pulse1*ratio1; yp = (fscanf(s,'%e',14))*360/Ab;
در انتها میزان Refrence یعنی میزان مطلوب که برای چرخش موتور در نظر گرفته شده است، به این صورت:
r = str2num(get(handles.ref,'string'));
که از Refrence برای محاسبه خطا استفاده میشود.
error = r-yp;
برای قرار دادن توضیحات برای راهنمایی بیشتر در GUI تعدادی push button جلوی بعضی از آیکونها قرار گرفته است که با استفاده از آنها توضیحاتی در static text به نام more information چاپ میشود.
function encod_Callback(hObject, eventdata, handles) % hObject handle to encod (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) h= {'Enter the number of encoders pulse.'}; set(handles.show,'string',h);
function slider1_Callback(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) b1 = get(handles.slider1,'value'); k1 = str2num(get(handles.intkp,'string')); Kp = k1*b1; set(handles.Kp,'string',num2str(Kp));
و برای استفاده از این ضرایب در محاسبه خطا، کد زیر را بعد از call back دکمه ران مینویسیم:
b1 = get(handles.slider1,'value'); k1 = str2num(get(handles.intkp,'string')); Kp = k1*b1;
در صفحه سوم از این GUI (شکل ۳) میخواهیم موتور را به صورت دستی کنترل کنیم. در ابتدا به دلیل توانایی کنترل دو موتور، دو عدد Check box برای فعال کردن موتور یک و موتور دو قرار گرفته است. که برای فعالشدن هر یک، از دستور if استفاده شده است. سپس اسلایدری قرار گرفته تا بتوان با استفاده از آن سرعت موتور را کنترل کرد. همچنین توسط یک عدد Edit Text بازهی سرعت موتور، تعیین میشود. بعد از آن دو عدد radio button قرار داده شده است که توسط آن چرخش ساعتگرد و یا پاد ساعتگرد موتور مشخص میشود. در آن میان هم یک عدد اسلایدر برای تعیین میزان شتاب شروع، استفاده شده است.
o1= get(handles.checkbox3,'value'); o2= get(handles.checkbox4,'value'); o3= get(handles.checkbox5,'value'); o4= get(handles.checkbox6,'value'); if (o1==1 || o2==1) & (o3==1 || o4==1) a3= get(handles.slider4,'value'); a4= round(a3*255); d1= dec2hex(a4); a5= get(handles.radiobutton3,'value'); if a5==1 c1='64' else c1='66' end M1CW = hex2dec({'00' , c1 , d1}); fwrite (s , M1CW); a7= get(handles.slider5,'value'); a9= round(a7*255); d2= dec2hex(a9); a10= get(handles.radiobutton5,'value'); if a10==1 c2='65'; else c2='67'; end M2CCW = hex2dec ({'00' , c2 , d2}); fwrite(s,M2CCW); end if o1==1 || o2==1 a3= get(handles.slider4,'value'); a2= str2num(get(handles.edit15,'string')); a4= round(a3*a2); d1= dec2hex(a4); a5= get(handles.radiobutton3,'value'); if a5==1 c1='64' else c1='66' end M1CW = hex2dec({'00' , c1 , d1}); fwrite (s , M1CW); elseif o3==1 || o4==1 a7= get(handles.slider5,'value'); a8= str2num(get(handles.edit17,'string')); a9= round(a7*a8); d2= dec2hex(a9); a10= get(handles.radiobutton5,'value'); if a10==1 c2='65'; else c2='67'; end M2CCW = hex2dec ({'00' , c2 , d2}); fwrite(s,M2CCW); end a6= get(handles.slider6,'value'); d3= dec2hex(round(a6*255)); Acceleration = hex2dec({'00' , '68' , d3 }); fwrite(s,Acceleration); end
function pushbutton17_Callback(hObject, eventdata, handles) % hObject handle to pushbutton17 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) a1 = get( handles.PORT,'value'); if (a1==2); p = 'COM1'; elseif (a1==3); p = 'COM2'; elseif (a1==4); p = 'COM3'; elseif (a1==5); p = 'COM4'; elseif (a1==6); p = 'COM5'; elseif (a1==7); p = 'COM6'; elseif (a1==8); p = 'COM7'; elseif (a1==9); p = 'COM8'; elseif (a1==10); p = 'COM9'; elseif (a1==11); p = 'COM10'; elseif (a1==12); p = 'COM11'; elseif (a1==13); p = 'COM12'; elseif (a1==14); p = 'COM13'; elseif (a1==15); p = 'COM14'; elseif (a1==16); p = 'COM15'; end delete(instrfind); s = serial (p); set(s,'Baudrate',9600); fopen(s); s1=str2num(get(handles.som,'string')); c1= get(handles.radiobutton7,'value'); c2= get(handles.radiobutton8,'value'); c3= get(handles.radiobutton9,'value'); c4= get(handles.radiobutton10,'value'); if c1==1 d='01' elseif c2==1 d='02' elseif c3==1 d='03' elseif c4==1 d='04' end Mode_of_Drvie =hex2dec({'00','CB','01'}); fwrite(s,Mode_of_Drvie); spd=(str2num(get(handles.v,'string'))); if spd >252 spd=252 end spd=dec2hex(spd); Stepper_Speed = hex2dec({'00','CC',spd}); fwrite(s,Stepper_Speed); a5= get(handles.radiobutton11,'value'); if a5==1 F1='C9' else F1='CA' end x1=str2num(get(handles.fuc2,'string')); x1=dec2hex(x1); Stepper_Step = hex2dec({'00',F1,x1}); fwrite(s,Stepper_Step);
با تشکر از: آقای مهندس امیررضا اشرفی و آقای مهندس سینا اصفهانی
2 Comments
ممنون
[…] GUI درایور MDC20 در نرمافزار متلب […]