zoukankan      html  css  js  c++  java
  • 增量式PID的matlab实现

    首先,增量式PID的实现公式:

    式中 Δe(k)=e(k)-e(k-1)

    进一步可以改写成

           

    式中       、

    为了便于理解,也可写成:

    式中e(k)为第k次采样时的设定值与实际值的差,e(k-1)为上一次采样时的设定值与实际值的差值,e(k-2)一样类推。

    所以增量式PID 输出的是控制量的增量,无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。

    而且,由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,

    因此对系统影响较大。

    下面是用Matlab 对增量式PID的仿真。

     1 %执行机构需要的是控制量的增量,例如驱动不仅电机的时候,采用增量式PID控制,
     2 %增量式PID控制算法中不需要累加,控制增量u(k)仅与最近k次的采样有关,所以误动作影响小。
     3 %设一被控对象G(s)=50/(0.125s^2+7s),  
     4 %用增量式PID控制算法编写仿真程序  
     5 %(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:[-5,5],  
     6 %  仿真曲线包括系统输出及误差曲线,并加上注释、图例)。  
     7   
     8 clc;
     9 clear ;     
    10 ts=0.001;                  %采样时间  
    11 %sys=tf(50,[0.125,7, 0]);  %tf是传递函数,用来实现G(s);  在自动控制领域经常用到,
    12 sys=tf(400,[1,50,0]);   
    13 dsys=c2d(sys,ts,'z');        %把控制函数离散化,转化为拆分方程
    14 [num,den]=tfdata(dsys,'v');  % 离散化后提取分子、分母 ,提取拆分方程系数   
    15 u_1=0.0;  
    16 u_2=0.0;  
    17 y_1=0.0;  
    18 y_2=0.0;  
    19 x=[0,0,0]';  
    20 error_1=0;  
    21 error_2=0;  
    22 for k=1:1:3000  
    23 time(k)=k*ts;    %采样次数  
    24 
    25 S=4;   %选择需要跟踪的函数
    26 if S==1  
    27    % kp=10;ki=0.1;kd=15;             %初始化PID
    28     kp=8;ki=0.1;kd=10;
    29     rin(k)=1;            %Step Signal ,阶跃信号  
    30 end
    31 if S==2  
    32     kp=10;ki=0.1;kd=15;               
    33     rin(k)=0.5*sin(2*pi*k*ts);       %Sine Signal   正弦信号  
    34 end    
    35 if S==3          %三角波信号 
    36      kp=10;ki=0.1;kd=15;
    37      if mod(time(k),2)<1
    38          rin(k)=mod(time(k),1);
    39      else
    40          rin(k)=1-mod(time(k),1);
    41      end
    42      rin(k)=rin(k)-0.5;
    43 end
    44 if S==4     %锯齿波信号
    45     kp=8;ki=0.05;kd=4; %测试得合适参数,如果输出过冲,可将kd调小。
    46     rin(k)=mod(time(k),1);
    47 end
    48  
    49 du(k)=kp*x(1)+kd*x(2)+ki*x(3);      %PID Controller   控制系数    
    50 u(k)=u_1+du(k); 
    51 
    52 if u(k)>=10         %Restricting the output of controller,输出限幅
    53    u(k)=10;  
    54 end  
    55 if u(k)<=-10  
    56    u(k)=-10;  
    57 end  
    58 
    59 %Linear model  
    60 yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;          %实际输出  
    61 error(k)=rin(k)-yout(k);                                       %Return of parameters 误差  
    62 u_2=u_1;                                                       %保存上上次输入   为下次计算  
    63 u_1=u(k);                                                      %保存上一次控制系数   为下次计算  
    64 y_2=y_1;                                                       %保存上上次次输出   为下次计算  
    65 y_1=yout(k);                                                   %保存上一次输出   为下次计算  
    66 
    67 x(1)=error(k)-error_1;            %Calculating P  
    68 x(2)=error(k)-2*error_1+error_2;  %Calculating D  
    69 x(3)=error(k);                    %Calculating I  
    70 
    71 error_2=error_1;                      
    72 error_1=error(k);                      
    73 end  
    74 
    75 figure(1);  
    76 plot(time,rin,'b',time,yout,'r');                        %输入 和实际控制输出  
    77 xlabel('time(s)'),ylabel('rin,yout');   
    78 % figure(2);  
    79 % plot(time,error,'r')                                     %输入与输出误差输出曲线  
    80 % xlabel('time(s)');ylabel('error');  

     对锯齿信号的追踪图形:

  • 相关阅读:
    .net Monitor产生SynchronizationLockException异常的原因
    .net 表达式返回值和等号赋值的区别
    .net core WebApi Interlocked配合ManualResetEventSlim实现并发同步
    .net core 使用log4net日志组件
    .net core Kestrel宿主服务器自定义监听端口配置
    .net core IIS/Kestrel上传大文件的解决方法
    .net 在同步方法中使用拉姆达表达式执行async/await异步操作
    ASP.NET MVC ValidationAttribute 服务器端自定义验证
    自定义TempData跨平台思路
    ValueProvider核心的值提供系统
  • 原文地址:https://www.cnblogs.com/qsyll0916/p/6890479.html
Copyright © 2011-2022 走看看