⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pid_controller.m

📁 This software is developed to provide ease with controller design. For PID control, options are give
💻 M
📖 第 1 页 / 共 5 页
字号:

% 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 + -