📄 pid_controller.m
字号:
% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in TAFR_pushb.
function TAFR_pushb_Callback(hObject, eventdata, handles)
% hObject handle to TAFR_pushb (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% =============== Values from Pop Up menus (Controller and Responses)======
value_response = get(handles.TAFR_popupmenu,'Value');
value = get(handles.PID_popupmenu,'Value');
% =========================================================================
% ========================Proportional Controller =========================
if value ==1
% ==================== Time Response ==================================
if value_response == 1
set(handles.MOlabel_text,'String','Maximum Overshoot >');
set(handles.PTlabel_text,'String','Peak Time >');
set(handles.STlabel_text,'String','Settling Time >');
global sys_fd_P
order_sys = order(sys_fd_P);
order_sys_str = num2str(order_sys);
set(handles.Order_text,'String',order_sys_str);
[num,den] = tfdata(sys_fd_P);
[r c] = size(den{1,1});
if c ~= 3
set(handles.MO_text,'String','Approximation Not Valid');
set(handles.PT_text,'String','Approximation Not Valid');
set(handles.ST_text,'String','Approximation Not Valid');
end
roots_sys = roots(den{1,1});
roots_sys_str = num2str(roots_sys);
set(handles.roots_text,'String',roots_sys_str);
den_sp = den{1,1}(1,3);
wn = sqrt(den_sp);
den_sp2 = den{1,1}(1,2);
b = den_sp2/(2*wn);
if b<=1 && num{1,1}(1,end-1) == 0 && c==3
MO = exp(-(b*pi)/(sqrt(1-b^2)))*100;
MO_str = num2str(MO);
MO_real = strcat(MO_str,' %');
set(handles.MO_text,'String',MO_real);
PT = pi/(wn*(sqrt(1-b^2)));
PT_str = num2str(PT);
PT_real = strcat(PT_str,' Sec');
set(handles.PT_text,'String',PT_real);
ST = 4/(b*wn);
ST_str = num2str(ST);
ST_real = strcat(ST_str,' Sec');
set(handles.ST_text,'String',ST_real);
else
set(handles.MO_text,'String','Approximation Not Valid');
set(handles.PT_text,'String','Approximation Not Valid');
set(handles.ST_text,'String','Approximation Not Valid');
end
end
% ====================== Frequncy Response ============================
if value_response ==2
set(handles.MOlabel_text,'String','Gain Margin >');
set(handles.PTlabel_text,'String','Phase Margin >');
set(handles.STlabel_text,'String','Bandwidth >');
global sys_fd_P
order_sys = order(sys_fd_P);
order_sys_str = num2str(order_sys);
set(handles.Order_text,'String',order_sys_str);
band = bandwidth(sys_fd_P);
band_str = num2str(band);
set(handles.ST_text,'String',band_str);
[gm pm wcg wcp]=margin (sys_fd_P);
gm_str = num2str(gm);
set(handles.MO_text,'String',gm_str);
pm_str = num2str(pm);
set(handles.PT_text,'String',pm_str);
end
end
% ================Proportional Integral Controller ========================
if value ==2
% ==================== Time Response ==================================
if value_response == 1
set(handles.MOlabel_text,'String','Maximum Overshoot >');
set(handles.PTlabel_text,'String','Peak Time >');
set(handles.STlabel_text,'String','Settling Time >');
global sys_fd_PI
order_sys = order(sys_fd_PI);
order_sys_str = num2str(order_sys);
set(handles.Order_text,'String',order_sys_str);
[num,den] = tfdata(sys_fd_PI);
[r c] = size(den{1,1});
if c ~= 3
set(handles.MO_text,'String','Approximation Not Valid');
set(handles.PT_text,'String','Approximation Not Valid');
set(handles.ST_text,'String','Approximation Not Valid');
end
roots_sys = roots(den{1,1});
roots_sys_str = num2str(roots_sys);
set(handles.roots_text,'String',roots_sys_str);
den_sp = den{1,1}(1,3);
wn = sqrt(den_sp);
den_sp2 = den{1,1}(1,2);
b = den_sp2/(2*wn);
if b<=1 && num{1,1}(1,end-1) == 0 && c==3
MO = exp(-(b*pi)/(sqrt(1-b^2)))*100;
MO_str = num2str(MO);
MO_real = strcat(MO_str,' %');
set(handles.MO_text,'String',MO_real);
PT = pi/(wn*(sqrt(1-b^2)));
PT_str = num2str(PT);
PT_real = strcat(PT_str,' Sec');
set(handles.PT_text,'String',PT_real);
ST = 4/(b*wn);
ST_str = num2str(ST);
ST_real = strcat(ST_str,' Sec');
set(handles.ST_text,'String',ST_real);
else
set(handles.MO_text,'String','Approximation Not Valid');
set(handles.PT_text,'String','Approximation Not Valid');
set(handles.ST_text,'String','Approximation Not Valid');
end
end
% ==================== Frequency Response =============================
if value_response ==2
set(handles.MOlabel_text,'String','Gain Margin >');
set(handles.PTlabel_text,'String','Phase Margin >');
set(handles.STlabel_text,'String','Bandwidth >');
global sys_fd_PI
order_sys = order(sys_fd_PI);
order_sys_str = num2str(order_sys);
set(handles.Order_text,'String',order_sys_str);
band = bandwidth(sys_fd_PI);
band_str = num2str(band);
set(handles.ST_text,'String',band_str);
[gm pm wcg wcp]=margin (sys_fd_PI);
gm_str = num2str(gm);
set(handles.MO_text,'String',gm_str);
pm_str = num2str(pm);
set(handles.PT_text,'String',pm_str);
end
end
% ================Proportional Integral Controller =========================
if value ==3
% ==================== Time Response ==================================
if value_response == 1
set(handles.MOlabel_text,'String','Maximum Overshoot >');
set(handles.PTlabel_text,'String','Peak Time >');
set(handles.STlabel_text,'String','Settling Time >');
global sys_fd_PD
order_sys = order(sys_fd_PD);
order_sys_str = num2str(order_sys);
set(handles.Order_text,'String',order_sys_str);
[num,den] = tfdata(sys_fd_PD);
[r c] = size(den{1,1});
if c ~= 3
set(handles.MO_text,'String','Approximation Not Valid');
set(handles.PT_text,'String','Approximation Not Valid');
set(handles.ST_text,'String','Approximation Not Valid');
end
roots_sys = roots(den{1,1});
roots_sys_str = num2str(roots_sys);
set(handles.roots_text,'String',roots_sys_str);
den_sp = den{1,1}(1,3);
wn = sqrt(den_sp);
den_sp2 = den{1,1}(1,2);
b = den_sp2/(2*wn);
if b<=1 && num{1,1}(1,end-1) == 0 && c==3
MO = exp(-(b*pi)/(sqrt(1-b^2)))*100;
MO_str = num2str(MO);
MO_real = strcat(MO_str,' %');
set(handles.MO_text,'String',MO_real);
PT = pi/(wn*(sqrt(1-b^2)));
PT_str = num2str(PT);
PT_real = strcat(PT_str,' Sec');
set(handles.PT_text,'String',PT_real);
ST = 4/(b*wn);
ST_str = num2str(ST);
ST_real = strcat(ST_str,' Sec');
set(handles.ST_text,'String',ST_real);
else
set(handles.MO_text,'String','Approximation Not Valid');
set(handles.PT_text,'String','Approximation Not Valid');
set(handles.ST_text,'String','Approximation Not Valid');
end
end
% ==================== Frequency Response ============================
if value_response ==2
set(handles.MOlabel_text,'String','Gain Margin >');
set(handles.PTlabel_text,'String','Phase Margin >');
set(handles.STlabel_text,'String','Bandwidth >');
global sys_fd_PD
order_sys = order(sys_fd_PD);
order_sys_str = num2str(order_sys);
set(handles.Order_text,'String',order_sys_str);
band = bandwidth(sys_fd_PD);
band_str = num2str(band);
set(handles.ST_text,'String',band_str);
[gm pm wcg wcp]=margin (sys_fd_PD);
gm_str = num2str(gm);
set(handles.MO_text,'String',gm_str);
pm_str = num2str(pm);
set(handles.PT_text,'String',pm_str);
end
end
% ================Proportional Integral Derivative Controller =============
if value ==4
% ==================== Time Response =================================
if value_response == 1
set(handles.MOlabel_text,'String','Maximum Overshoot >');
set(handles.PTlabel_text,'String','Peak Time >');
set(handles.STlabel_text,'String','Settling Time >');
global sys_fd_PID
order_sys = order(sys_fd_PID);
order_sys_str = num2str(order_sys);
set(handles.Order_text,'String',order_sys_str);
[num,den] = tfdata(sys_fd_PID);
[r c] = size(den{1,1});
if c ~= 3
set(handles.MO_text,'String','Approximation Not Valid');
set(handles.PT_text,'String','Approximation Not Valid');
set(handles.ST_text,'String','Approximation Not Valid');
end
roots_sys = roots(den{1,1});
roots_sys_str = num2str(roots_sys);
set(handles.roots_text,'String',roots_sys_str);
den_sp = den{1,1}(1,3);
wn = sqrt(den_sp);
den_sp2 = den{1,1}(1,2);
b = den_sp2/(2*wn);
if b<=1 && num{1,1}(1,end-1) == 0 && c==3
MO = exp(-(b*pi)/(sqrt(1-b^2)))*100;
MO_str = num2str(MO);
MO_real = strcat(MO_str,' %');
set(handles.MO_text,'String',MO_real);
PT = pi/(wn*(sqrt(1-b^2)));
PT_str = num2str(PT);
PT_real = strcat(PT_str,' Sec');
set(handles.PT_text,'String',PT_real);
ST = 4/(b*wn);
ST_str = num2str(ST);
ST_real = strcat(ST_str,' Sec');
set(handles.ST_text,'String',ST_real);
else
set(handles.MO_text,'String','Approximation Not Valid');
set(handles.PT_text,'String','Approximation Not Valid');
set(handles.ST_text,'String','Approximation Not Valid');
end
end
% ==================== Frequency Response ============================
if value_response == 2
set(handles.MOlabel_text,'String','Gain Margin >');
set(handles.PTlabel_text,'String','Phase Margin >');
set(handles.STlabel_text,'String','Bandwidth >');
global sys_fd_PID
order_sys = order(sys_fd_PID);
order_sys_str = num2str(order_sys);
set(handles.Order_text,'String',order_sys_str);
band = bandwidth(sys_fd_PID);
band_str = num2str(band);
set(handles.ST_text,'String',band_str);
[gm pm wcg wcp]=margin (sys_fd_PID);
gm_str = num2str(gm);
set(handles.MO_text,'String',gm_str);
pm_str = num2str(pm);
set(handles.PT_text,'String',pm_str);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -