LADRC的学习——PID的学习

PID部分的学习

上文介绍了ADRC的理论,并试着按照自己的理解用Matab编程实现韩老师论文中的算法,但是对调节参数和一些地方还不太懂,因此我打算从头开始理解,从PID的好坏开始学习理解,看Kp,Ki,Kd参数对系统的影响。
此文中参照了这个文件,SUNPLUS的PID调节控制做点击速度控制,其中封面图片如下:
LADRC的学习——PID的学习_第1张图片
还有,一个blibli上的视频课程,名字叫做:用Matlab调节PID;
还有看了一个博主写的基于matlab程序对PID控制算法的理解,链接为:https://blog.csdn.net/sinat_23338865/article/details/53837634

一、PID的介绍及其表示式

LADRC的学习——PID的学习_第2张图片
传统PID采用的是误差调控的方式,其中采用的是比例,积分,微分加权和的方式,这样控制可以反应过去的误差,现在的误差,未来的‘误差对影响,通过调节Kp,Ki,Kd三个参数,就可以调节加权和,满足当前系统的控制,从而满足期望控制要求。

其中在连续的一般用于计算机仿真中进行测试或者帮助学习理解,在生活中常用的有两种形式,一种是增量式PID,一种是位置式PID。下面进行介绍,

a.位置式PID

LADRC的学习——PID的学习_第3张图片
在位置式的PID中,比较容易理解,比例部分就是当前的误差部分,积分部分相当于把以前的误差全部累加,然后微分环节在T足够小的时候,两个相邻的误差除以采样时间T可以近似看作微分环节。这样通过调节Kp,Ki,Kd,就可以实现加权和控制。
但是存在一个缺点,积分控制是之前的一直在累加,因此计算量过大,在日常中并不常用,因此采用增量式PID。

b.增量式PID
在这里插入图片描述
在这里插入图片描述
通过2-2式子和2-4式子相减做差得到,PID增量式算法:
LADRC的学习——PID的学习_第4张图片
这样我们只用调节A,B,C就可以满足控制的要求,而PID输出U = deltaU + U(k - 1),这样就可以完成PID控制器了。

**

二、实践理解

a.通过simulink搭建理解
LADRC的学习——PID的学习_第5张图片
其中输入的信号有可以调节的规则信号和噪声,通过滤波器,之后通过PID控制,控制对象假设为:
G(s) = 1/(s^2 + 3s + 1)
通过调节PID参数来看控制效果,结果如下:
Kp = 24;Ki = 10.4; Kd = 12,图像为:

LADRC的学习——PID的学习_第6张图片
当Kp = 40; Ki = 2; Kd = 15的时候,图像为:

LADRC的学习——PID的学习_第7张图片
可以通过调节参数,来看看控制情况,不过一般不清楚最优效果是什么,一般多试,然后记录以后选择相对最优的参数作为控制PID参数。

b.通过Matlab编程——连续型

这里是看了b站的一个视频,看最上面提到的引用。然后通过先调节Kp,再调节Kd,最后调节Kd,最后得出三个参数调节以后的影响。
这里选择的被控制对象还是上面提到的那个,下面是代码部分:

clear
clc

num = 1;
den = [1 3 1];
Gp = tf(num,den);
H = 1;

M = feedback(Gp,H);
step(M);
hold on

Kp = 24;
Ki = 10.4;
Kd = 10;

Gc = pid(Kp,Ki,Kd);
N = feedback(Gp*Gc,H);
step(N);
grid on;

参数调节按照这样的方式,先让Kd,Ki都为0,调节Kp。然后选择超调量在20%左右以后的Kp值保持不变了,接下来调节Kd,让超调消失,但是接下来又出现了问题,达不到期望值,因此调节Ki,让目标达到期望值,且不产生太大超调,这是实现图像和结论。
调节Kp时候的图像:

LADRC的学习——PID的学习_第8张图片
其中曲线是这样的,随着Kp的增大,曲线越贴近y轴,但是超调会不断的增大,而且始终存在稳态误差,稳定的值一直到不了期望值 y = 1 处。
结论:随着Kp的增大,上升时间ts明显减少,可以很快的达到期望值,但是超调量delta%在过了期望值以后会逐渐增大,从而导致调节时间ts也增加,波动变化较大,会存在稳态误差。

调节Kd后的图像:
LADRC的学习——PID的学习_第9张图片
随着Kd的增大,曲线越来越靠近y轴,并且超调量逐渐减小,但是稳定值也不能到期望值,但是非常的接近了,而且可以减小超调。
结论:在Kp保持不变的条件下,随着Kd的增大,超调量逐渐减小,调节时间也逐渐变短,斜率在上升阶段特别陡,可以很快的接近期望值附近,但是有一个大的弊端:上升时间大大增长,而且在不超调情况下,难以达到期望值(精度不够)。因此在基本控制中基本PD控制就可以满足要求,如果高精度控制需要加上I控制,那样可以满足精度。

调节Ki以后得到的图像:
LADRC的学习——PID的学习_第10张图片
随着Ki的增大,可以增大达到期望值的速度,满足精度的要求,但是随着Ki的增大,会出现超调,调节时间也会增大,但是稳态误差消除了。
结论:通过保持Kp,Kd参数不变的条件下,调节Ki参数。随着Ki的增加,会发现当前值离期望值越来越近,上升时间会减少,但是当Ki过大以后,会出现超调现象,且调节时间会增加。很大的好处是可以满足精度要求。

分析后结论:
总结:
1.Kp最大好处是可以很快接近期望值附近,会有超调和稳态误差。
2.Kd最大好处是可以以较快时间接近期望值附近,可以消除超调,但是无法准确达到期望值。(快)
3.Ki最大好处是可以接近期望值,提高精度,但是会发生超调。(准)
整体实现稳定效果。

c.通过Matlab编程——离散型(增量式)
这里是通过一篇博客的学习,看最上面的引用,然后自己改了一些输入和理解,写的离散PID增量式PID,其中控制对象需要进行Z变换,然后Z变换以后要写成递推式,然后通过时序关系得出系统输出。
代码如下:

% Someone write discrete PID code
% This is increment_ways algorithm program
% Signal:step, sinusoidal, sample time is 1ms,interger limit is [-5,5];

clear
close all;
Sample_Time = 0.001;                  %Sample time
sys = tf(50,[0.125,7,0]);             %sys is transter function
disc_sys = c2d(sys,Sample_Time,'z');  %discrete system
[num,den] = tfdata(disc_sys,'v');     %Get numerator array and denonimator array

u_1 = 0.0;                            %u last
u_2 = 0.0;                            %u previous
y_1 = 0.0;                            %y last
y_2 = 0.0;                            %y previous
Three_Component = [0.0,0.0,0.0]';                   %X vector
delta_u = 0.0;                        %u increment

Error_1 = 0;                          %Error last
Error_2 = 0;                          %Error previous

for k = 1:1000
    time(k) = k*Sample_Time;          %Time sequence,dt more little,acurency will be better.
    S = 2;                            %Choose input signal.
    switch S
        case 1
           Kp = 5;Ki = 0.035;Kd = 1.6;
           if k <= 300
              Input(k) = 0;
           else
              Input(k) = 1;
           end
        case 2
           Kp = 10;Ki = 0.1;Kd = 15;
           Input(k) = 0.5*sin(2*pi*k*Sample_Time);  
        case 3
           % Step signal + noise.
           Kp = 10;Ki = 0.2;Kd = 14;
           if k <= 300
              Input(k) = 0 + 0.05*rand;
           else
              Input(k) = 1 + 0.05*rand;
           end
        case 4 
           % Slope signal add noise
           Kp = 1;Ki = 0;Kd = 0;
           Input(k) = 1.1*(k) + 100*rand;
        case 5
           Kp = 188;Ki = 2.5;Kd = 1.9;
           Input(k) = 0.9*k.^2;
        case 6
           Kp = 100;Ki = 0.7;Kd = 5.6;
           Input(k) = 0.5*cos(2*pi*k*Sample_Time) + 2*sin(9*pi*k*Sample_Time) + 1.5*cos(7*pi*k*Sample_Time);  
    end
    
    delta_u(k) = Kp*Three_Component(1) + Kd*Three_Component(2) + Ki*Three_Component(3);  %This is the increment error's three sub_vector.
    u(k) = u_1 + delta_u(k);                   %This is PID's output.U1 is last PID out.
    
    if u(k) >= 5                               %This is PID output limit.
        u(k) = 5;
    end
    if u(k) <= -5
        u(k) = -5;
    end
    
    %Linear model
    %Note: z*u(z)  <------>  u(k + T)
    Out(k) = -den(2)*y_1 - den(3)*y_2 + num(2)*u_1 + num(3)*u_2;   %This is contoller output.
    Error(k) = Input(k) - Out(k);                                  %This is Error_Now.
    u_2 = u_1;                %Update PID_Out.It likes sliding windows.                                     
    u_1 = u(k);               
    y_2 = y_1;                %Update TF_Out
    y_1 = Out(k);
    
    Three_Component(1) = Error(k) - Error_1;                %Kp part
    Three_Component(2) = Error(k) - 2*Error_1 + Error_2;    %Kd part
    Three_Component(3) = Error(k);                          %Ki part 
    
    Error_2 = Error_1;                        %Previous Error Update
    Error_1 = Error(k);                       %Last Error Update.
    end
    
    subplot(2,1,1);
    plot(time,Input,'b',time,Out,'r');
    ylabel('Input,Out');
    subplot(2,1,2);
    plot(time,Error,'r');
    xlabel('time(s)');ylabel('error');

结果如下:
S = 1时候为阶跃信号:
LADRC的学习——PID的学习_第11张图片
S = 2,为正弦信号
LADRC的学习——PID的学习_第12张图片
S = 3,为阶跃信号 + 扰动
LADRC的学习——PID的学习_第13张图片
剩下的斜坡信号和加速度信号,系统追不上,处于发散状态,因此需要自动控制原理上进行分析,选择可以收敛的进行分析,这个需要按照项目需要来满足要求。

接下来开始学习LADRC的相关知识。

你可能感兴趣的:(ADRC学习)