位置PID与增量PID控制原理(附带matlab源码)

一、位置式PID

  按照模拟PID控制算法,以一系列采样时刻点KT代替连续时间t,用矩形法数值积分代替积分,以一阶向后差分代替微分。

1、一系列采样时刻点KT代替连续时间t

t=KT,(k=1、2、3.... 

2、用矩形法数值积分代替积分

\int_{0}^{t}error(t)d(t)\approx T\sum_{j=0}^{k}error(jT)=T\sum_{j=0}^{k}error(j)   

3、以一阶向后差分代替微分

d(error)/d(t)=[error(k)-error(k-1)]/T

最后可得离散化的PID表达式

u(k)=kp*error(k)+ki\sum_{j=0}^{k}error(j)T+kd\frac{error(k)-error(k-1)}{T}

式中T为采样时间(采样周期)

%设一被控对象G(s)=523500/(s^3+87.35s^2+10470S)
    %采样时间为1ms,采用z变换进行离散化
    clc
    clear
    ts=0.001;                 %采样时间  
    sys=tf(523500,[1 87.35 10470 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; u_3=0.0;   %z变换之后的系数
    y_1=0.0; y_2=0.0; y_3=0.0;  
    x=[0,0,0]';  %分别误差e,误差e的差分,误差e的积分
    error_1=0;   %上一时刻误差
 
    time=zeros(1,1000); %预分配内存
    yd=zeros(1,1000);
    u=zeros(1,1000);
    y=zeros(1,1000);
    error=zeros(1,1000);
    
    for k=1:1:1000  
    time(k)=k*ts;%离散化的时间代表连续时间
    yd(k)=1.0;%目标量
    kp=0.5;  
    ki=0.001;
    kd=0.001;
    
    u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID输出

    if u(k)>=10
        u(k)=10;
    end
     if u(k)<=-10
        u(k)=-10;
     end

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

    x(1)=error(k);                  %KP的系数  
    x(2)=(error(k)-error_1)/ts;     %KD的系数  
    x(3)=x(3)+error(k)*ts;          %KI的系数
    error_1=error(k);                 
    end 

    figure(1);  
    plot(time,yd,'b',time,y,'r');               %输入和实际控制输出  
    xlabel('time(s)'),ylabel('y,yd');   
    title('输入/输出图像对比')
    figure(2);  
    plot(time,error,'r')                            %时间误差输出曲线  
    xlabel('time(s)');ylabel('error'); 
    title('误差变化')

二、增量式P

\bigtriangleup u(k)=u(k)-u(k-1)=

error(k)-error(k-1))+ki*error(k)+kd(error(k)-error(k-1)+error(k-2))

u(k+1)=u(k)+u(k)

%设一被控对象G(s)=400/(s^2+50s)
%采样时间为1ms,采用z变换进行离散化

clc
clear

ts=0.001;%采样时间
sys=tf(400,[1 50 0]);
dsys=c2d(sys,ts,'z');%采用z变换进行离散化
 %把控制函数离散化取Z变换n阶定常离散系统差分方程
 %在零初始条件下取Z变换:
 %dsys即Y(z)/U(z)
[num,den]=tfdata(dsys,'v');%强制tfdata直接将分子和分母作为行向量而不是单元格数组返回

u1=0;u2=0;u3=0;%z变换之后的系数
y1=0;y2=0;y3=0;
x=[0 0 0]';%分别误差e,误差e的差分,误差e的积分
error1=0;
error2=0;

time=zeros(3000,1);%与分配内存
yd=zeros(3000,1);
u=zeros(3000,1);
y=zeros(3000,1);

for k=1:1:3000
    time(k)=k*ts;%离散化的时间代表连续时间
    yd(k)=1.0;%目标量
    kp=8;  
    ki=0.10;
    kd=10;
    
    u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID输出
    u(k)=u1+u(k);
    
    if u(k)>=10
        u(k)=10;
    end
     if u(k)<=-10
        u(k)=-10;
     end
    %难点就是把传递函数转化为差分方程,以实现PID控制
    y(k)=-den(2)*y1-den(3)*y2+num(2)*u1+num(3)*u2; %离散表达式输出
    %如果传感器发生故障,u(k)发生大幅度变化,引起输出的变化
    error=yd(k)-y(k);%误差=输入-输出
    u1=u(k);u2=u1;u3=u2;
    y1=y(k);y2=y1;y3=y2;
    
    x(1)=error-error1;
    x(2)=error-2*error1+error2;
    x(3)=error;
    
    error2=error1;
    error1=error;
end
figure(1);
plot(time,yd,'r',time,y,'k','linewidth',2);
xlabel('time(s)');
ylabel('yd,y');
legend('Ideal Position value','tracking position value');

 

你可能感兴趣的:(matlab,算法)