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

📄 衰减曲线.m

📁 4:1衰减法PID参数自整定
💻 M
字号:
%---------------------------4:1衰减法仿真程序------------------------
clc
%%比例系数调节部分
 am = [82^2 2*82 1];bm = 2.449;
 Gc = tf(bm,am);               %被控对象传递函数Gc=1/(82s+1)^2
 P = [2:3:8];          %比例系数
for i = 1:length(P)
    sys = feedback(P(i)*Gc,1); %系统加反馈  
    [y,t] = step(sys);
    whitebg('w')
    if P(i)==2
        plot(t,y,'m:')
        hold on
    elseif P(i)==5
        plot(t,y,'k-.')
        hold on
    else
        plot(t,y,'LineWidth',1.5)
        hold on
    end       
end
 %图形的文本标注 
 text(66,1.387,'\fontsize{8}\leftarrow\fontname{Times New Roman}Kp=8') 
 text(96,1.16,'\fontsize{8}\leftarrow\fontname{Times New Roman}Kp=5')
 text(192,0.83,'\fontsize{8}\leftarrow\fontname{Times New Roman}Kp=2')
 xlabel('时间t','FontSize',12)
 ylabel('响应y','FontSize',12)
%图形计算部分
 h = plot(t,y);
 x = get(h,'XData');
 y = get(h,'YData');
 %找第一个最大值
 t=length(y);
 tempy1 = y(5:t);
 tempx1 = x(5:t);
 imax1 = find(max(tempy1) == tempy1);      %曲线上的最高点
 xmax1 = tempx1(imax1); %xmax1 最大值的横坐标
 ymax1 = tempy1(imax1); %ymax1 最大值的纵坐标
 plot(xmax1,ymax1,'r.','MarkerSize',20) %标出最大点
 %经过第一个最大值向X轴做垂线
 x1 = [xmax1 xmax1];
 y1 = [ymax1 0];
 line(x1,y1,'Color','r','LineWidth',1,'LineStyle','--')
 %找第二个最大值
 t=length(tempy1);
 tempy2 = y(imax1+30:t);
 tempx2 = x(imax1+30:t);
 imax2 = find(max(tempy2) == tempy2);      %曲线上的第二个最高点
 xmax2 = tempx2(imax2);ymax2 = tempy2(imax2);
 plot(xmax2,ymax2,'r.','MarkerSize',20);
 %经过第二个最大值向X轴做垂线
 x2 = [xmax2 xmax2];
 y2 = [ymax2 0]; 
 line(x2,y2,'Color','r','LineWidth',1,'LineStyle','--')
 
 t1 = xmax1; 
 t2 = xmax2; 
 tk = t2-t1;    %临界周期Tk
 %在图上标出Tk
 text(xmax1+5,0.08,'\fontsize{9}\fontname{宋体}Tk=','Color','r')
 text(xmax1+30,0.08,'','String',tk,'Color','r')
 Kc = P(i);
 delta = 1/Kc;
 
 %PID参数
 Kp1 = 1/(0.8*delta)      %比例增益 
 Ti = 0.3*tk        %积分时间
 Td = 0.1*tk      %微分时间
%--PID控制部分--
 ts = 2;                   %采样周期
 dsys=c2d(Gc,ts,'zoh');      %将被控对象的s传递函数转变为z传递函数
 [num,den]=tfdata(dsys,'v'); %取分子、分母的系数
 uk_1 = 0;uk_2 = 0; %初始化
 yk_1 = 0;yk_2 = 0;
 ek_1 = 0;ei = 0; %ei是偏差积分
 Kp = Kp1          %PID控制器
 Ki = Kp/Ti
 Kd = Kp*Td
 
 for k = 1:1:200
    time(k) = k*ts;
    rin(k) = 1.0; %设定值
    yout(k) = -den(2)*yk_1 - den(3)*yk_2 + num(2)*uk_1 + num(3)*uk_2 ; 
    error(k) = rin(k) - yout(k); %偏差
    ei = ei + error(k)*ts;       %偏差积分
    u(k) = Kc*error(k) + Ki*ei + Kd*(error(k) - ek_1);
    uk_2 = uk_1;uk_1 = u(k);
    yk_2 = yk_1;yk_1 = yout(k);
    ek_1 = error(k);
end
 hold off 
 figure(1);
 plot(time,rin,'k-.');
 hold on
 plot(time,yout)
 xlabel('time(s)');ylabel('rin,rout');
 hold on
 %图像标注
  h = plot(time,yout);
  x = get(h,'XData');
  y = get(h,'YData');
 %标出超调量
 imax = find(max(y) == y);      %曲线上的最高点
 xmax = x(imax); 
 ymax = y(imax); 
 plot(xmax,ymax,'r.','MarkerSize',10) %标出最大点
 x11 = [xmax 0];
 y11 = [ymax ymax];
 line(x11,y11,'Color','r','LineStyle','--')
 t = length(y);
 tempx = x(50:t);
 tempy = y(50:t);
 imin = find(min(tempy) == tempy);
 xmin = tempx(imin);ymin = tempy(imin);
 plot(xmin,ymin,'r.','MarkerSize',10)
 x22 = [xmin 0];y22 = [ymin ymin];
 line(x22,y22,'Color','r','LineStyle','--')
 yout1 = ymax; yout2 = ymin;
 Mr = yout1 - yout2;
 text(-40,1.15,'\fontsize{11}\fontname{楷体}Mr=','Color','r')
 text(-40,1.05,'','String',Mr,'Color','r')
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -