• 大小: 15KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-09
  • 语言: Matlab
  • 标签: Matlab  增量式PID  

资源简介

Matlab增量式PID算法仿真 ,包含m文件和simulink仿真文件,希望对大家有帮助

资源截图

代码片段和文件信息

    %设一被控对象G(s)=50/(0.125s^2+7s)  
    %用增量式PID控制算法编写仿真程序  
    %(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:[-33]  
    %  仿真曲线包括系统输出及误差曲线)。  
     
    ts=0.001;                 %采样时间  
    sys=tf(50[0.1257 0]); %tf是传递函数  即被控对象函数G();  
    dsys=c2d(systs‘z‘);    %把控制函数离散化取Z变换n阶定常离散系统差分方程
                                %在零初始条件下取Z变换:
                                %dsys即Y(z)/U(z)
    [numden]=tfdata(dsys‘v‘);% 离散化后提取分子、分母    
    u_1=0.0;  
    u_2=0.0;  
    y_1=0.0;  
    y_2=0.0;  
    x=[000]‘;  
    error_1=0;  
    error_2=0;  
    %核心代码
    
    for k=1:1:1000  
    time(k)=k*ts;                        %采样次数  
    S=1;  
    if S==1                         %阶跃输入
        kp=6.5;ki=0.1;kd=1;             %初始化PID    
        rin(k)=1;                    %Step Signal   
    elseif S==2                     %正弦输入
        kp=10;ki=0.1;kd=15;             
        rin(k)=0.5*sin(2*pi*k*ts);    %Sine Signal     即实际输入      
    end 
    
    du(k)=kp*x(1)+kd*x(2)+ki*x(3);      %PID Controller   控制系数    
    u(k)=u_1+du(k);                     %真正的PID输出应该为du+前一时刻的输出
    if u(k)>=3         
       u(k)=3;  
    end  
    if u(k)<=-3  
       u(k)=-3;  
    end  
     
    %Linear model 难点就是把传递函数转化为差分方程,以实现PID控制。 
    yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;          %实际输出 num为dsys分子多项式系数,den为dsys分母多项式系数,从n阶定常离散系统差分方程变化来的。
    error(k)=rin(k)-yout(k);                                       % 误差 输入-输出 
    u_2=u_1;                                                       %保存上上次输入   为下次计算  
    u_1=u(k);                                                      %保存上一次控制系数   为下次计算  
    y_2=y_1;                                                       %保存上上次次输出   为下次计算  
    y_1=yout(k);                                                   %保存上一次输出   为下次计算  
    
    x(1)=error(k)-error_1;                                         %KP的系数  
    x(2)=error(k)-2*error_1+error_2;                               %KD的系数  
    x(3)=error(k);                                                 %KI的系数
    error_2=error_1;                                                %上次的变上上次误差
    error_1=error(k);                                               %这次的变上次的误差
    end 
    
           
    figure(1);  
    plot(timerin‘b‘timeyout‘r‘);                        %输入 和实际控制输出  
    xlabel(‘time(s)‘)ylabel(‘rinyout‘);   
   figure(2);  
    plot(timeerror‘r‘)                                     %时间误差输出曲线  
    xlabel(‘time(s)‘);ylabel(‘error‘);  

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件       15284  2018-04-06 10:53  PIDsimulikn.slx
     文件        2859  2018-04-05 21:29  Incremental PID.m

评论

共有 条评论