发 帖  
原厂入驻New
发烧友10周年庆典,全网超值优惠来袭!千元现金券,下单抽奖赶紧参与》》

[经验] 离散型PID算法的Matlab仿真

2019-5-30 09:10:39  464 PID matlab
分享
0
matlab仿真
分析过程
1、对G(s)进行离散化即进行Z变换得到Z传递函数G(Z);
2、分子分母除以z的最高次数即除以z的最高次得到;
3、由z的位移定理Z[e(t-kt)]=z^k*E(z)逆变换得到差分方程; 4、PID编程实现



具体代码实现
  1.     %设一被控对象G(s)=50/(0.125s^2+7s),  
  2.     %用增量式PID控制算法编写仿真程序  
  3.     %(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:[-3,3],  
  4.     %  仿真曲线包括系统输出及误差曲线)。  

  5.     ts=0.001;                 %采样时间  
  6.     sys=tf(50,[0.125,7, 0]); %tf是传递函数  即被控对象函数G();  
  7.     dsys=c2d(sys,ts,'z');    %把控制函数离散化取Z变换n阶定常离散系统差分方程
  8.                                 %在零初始条件下取Z变换:
  9.                                 %dsys即Y(z)/U(z)
  10.     [num,den]=tfdata(dsys,'v');% 离散化后提取分子、分母   
  11.     u_1=0.0;  
  12.     u_2=0.0;  
  13.     y_1=0.0;  
  14.     y_2=0.0;  
  15.     x=[0,0,0]';  
  16.     error_1=0;  
  17.     error_2=0;  
  18.     %核心代码

  19.     for k=1:1:1000  
  20.     time(k)=k*ts;                        %采样次数  
  21.     S=1;  
  22.     IF S==1                         %阶跃输入
  23.         kp=6.5;ki=0.1;kd=1;             %初始化PID   
  24.         rin(k)=1;                    %Step Signal   
  25.     elseif S==2                     %正弦输入
  26.         kp=10;ki=0.1;kd=15;            
  27.         rin(k)=0.5*sin(2*pi*k*ts);    %Sine Signal     即实际输入      
  28.     end

  29.     du(k)=kp*x(1)+kd*x(2)+ki*x(3);      %PID Controller   控制系数   
  30.     u(k)=u_1+du(k);                     %真正的PID输出应该为du+前一时刻的输出
  31.     if u(k)>=3         
  32.        u(k)=3;  
  33.     end  
  34.     if u(k)<=-3  
  35.        u(k)=-3;  
  36.     end  

  37.     %Linear model 难点就是把传递函数转化为差分方程,以实现PID控制。
  38.     yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;          %实际输出 num为dsys分子多项式系数,den为dsys分母多项式系数,从n阶定常离散系统差分方程变化来的。
  39.     error(k)=rin(k)-yout(k);                                       % 误差 输入-输出
  40.     u_2=u_1;                                                       %保存上上次输入   为下次计算  
  41.     u_1=u(k);                                                      %保存上一次控制系数   为下次计算  
  42.     y_2=y_1;                                                       %保存上上次次输出   为下次计算  
  43.     y_1=yout(k);                                                   %保存上一次输出   为下次计算  

  44.     x(1)=error(k)-error_1;                                         %KP的系数  
  45.     x(2)=error(k)-2*error_1+error_2;                               %KD的系数  
  46.     x(3)=error(k);                                                 %KI的系数
  47.     error_2=error_1;                                                %上次的变上上次误差
  48.     error_1=error(k);                                               %这次的变上次的误差
  49.     end


  50.     figure(1);  
  51.     plot(time,rin,'b',time,yout,'r');                        %输入 和实际控制输出  
  52.     xlabel('time(s)'),ylabel('rin,yout');   
  53.    figure(2);  
  54.     plot(time,error,'r')                                     %时间误差输出曲线  
  55.     xlabel('time(s)');ylabel('error');
复制代码


本帖被以下淘专辑推荐:

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

发经验
课程
    关闭

    站长推荐 上一条 /10 下一条

    快速回复 返回顶部 返回列表