位置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');

 

  • 10
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PID算法是一种常用的控制算法,常用于工业控制领域。它是基于反馈原理的,通过对设定值和实际值之间的误差进行不断调整,达到控制的目的。 PID算法分为位置控制和增量控制两种方。 1. PID位置控制原理与实现 PID位置控制的主要思想是将当前的误差与历史误差进行加权平均,以此来计算控制的输出量。常见的位置控制算法如下: ```matlab % PID位置控制算法 clear all; close all; clc; % 设定值 setpoint = 50; % PID参数 kp = 0.5; ki = 0.2; kd = 0.1; % 初始化 e = 0; ei = 0; ed = 0; u = 0; last_e = 0; % 模拟过程 for i = 1:100 % 获取实际值 y = randi(100); % 计算误差 e = setpoint - y; % 计算积分项 ei = ei + e; % 计算微分项 ed = e - last_e; % 计算控制的输出量 u = kp * e + ki * ei + kd * ed; % 更新历史误差 last_e = e; % 显示当前的控制量 disp(u); end ``` 这里我们模拟了一个简单的过程,设定值为50,然后通过随机数生成实际值,计算误差并进行PID控制。其中kp、ki、kd分别表示比例、积分、微分参数,通过调整这些参数可以得到更好的控制效果。 2. PID增量控制原理与实现 PID增量控制的主要思想是将当前的误差与历史误差的差值进行加权平均,以此来计算控制的输出量。常见的增量控制算法如下: ```matlab % PID增量控制算法 clear all; close all; clc; % 设定值 setpoint = 50; % PID参数 kp = 0.5; ki = 0.2; kd = 0.1; % 初始化 e = 0; ei = 0; ed = 0; u = 0; last_e = 0; last_u = 0; % 模拟过程 for i = 1:100 % 获取实际值 y = randi(100); % 计算误差 e = setpoint - y; % 计算积分项 ei = ei + e; % 计算微分项 ed = e - last_e; % 计算控制的输出量 u = kp * (e - last_e) + ki * ei + kd * (e - 2 * last_e + last_u); % 更新历史误差和控制量 last_e = e; last_u = u; % 显示当前的控制量 disp(u); end ``` 这里我们同样模拟了一个简单的过程,设定值为50,然后通过随机数生成实际值,计算误差并进行PID控制。其中kp、ki、kd分别表示比例、积分、微分参数,通过调整这些参数可以得到更好的控制效果。与位置控制不同的是,增量控制需要记录上一次的控制量和误差,以此来计算微分项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值