调PID心得

增量式PID

1增加P,直到出现轻微震荡,

2:先设置一个较大的i,然后逐渐减小,直到不出现或者出现轻微震荡

3:d和i一样

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

    ts=0.001;                 %采样时间  
    sys=tf(50,[0.125,7, 0]); %tf是传递函数  即被控对象函数G();  
    dsys=c2d(sys,ts,'z');    %把控制函数离散化取Z变换n阶定常离散系统差分方程
                                %在零初始条件下取Z变换:
                                %dsys即Y(z)/U(z)
    [num,den]=tfdata(dsys,'v');% 离散化后提取分子、分母    
    u_1=0.0;  
    u_2=0.0;  
    y_1=0.0;  
    y_2=0.0;  
    x=[0,0,0]';  
    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(time,rin,'b',time,yout,'r');                        %输入 和实际控制输出  
    xlabel('time(s)'),ylabel('rin,yout');   
   figure(2);  
    plot(time,error,'r')                                     %时间误差输出曲线  
    xlabel('time(s)');ylabel('error'); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值