上文介绍了ADRC的理论,并试着按照自己的理解用Matab编程实现韩老师论文中的算法,但是对调节参数和一些地方还不太懂,因此我打算从头开始理解,从PID的好坏开始学习理解,看Kp,Ki,Kd参数对系统的影响。
此文中参照了这个文件,SUNPLUS的PID调节控制做点击速度控制,其中封面图片如下:
还有,一个blibli上的视频课程,名字叫做:用Matlab调节PID;
还有看了一个博主写的基于matlab程序对PID控制算法的理解,链接为:https://blog.csdn.net/sinat_23338865/article/details/53837634
传统PID采用的是误差调控的方式,其中采用的是比例,积分,微分加权和的方式,这样控制可以反应过去的误差,现在的误差,未来的‘误差对影响,通过调节Kp,Ki,Kd三个参数,就可以调节加权和,满足当前系统的控制,从而满足期望控制要求。
其中在连续的一般用于计算机仿真中进行测试或者帮助学习理解,在生活中常用的有两种形式,一种是增量式PID,一种是位置式PID。下面进行介绍,
a.位置式PID
’
在位置式的PID中,比较容易理解,比例部分就是当前的误差部分,积分部分相当于把以前的误差全部累加,然后微分环节在T足够小的时候,两个相邻的误差除以采样时间T可以近似看作微分环节。这样通过调节Kp,Ki,Kd,就可以实现加权和控制。
但是存在一个缺点,积分控制是之前的一直在累加,因此计算量过大,在日常中并不常用,因此采用增量式PID。
b.增量式PID
通过2-2式子和2-4式子相减做差得到,PID增量式算法:
这样我们只用调节A,B,C就可以满足控制的要求,而PID输出U = deltaU + U(k - 1),这样就可以完成PID控制器了。
**
a.通过simulink搭建理解
其中输入的信号有可以调节的规则信号和噪声,通过滤波器,之后通过PID控制,控制对象假设为:
G(s) = 1/(s^2 + 3s + 1)
通过调节PID参数来看控制效果,结果如下:
Kp = 24;Ki = 10.4; Kd = 12,图像为:
当Kp = 40; Ki = 2; Kd = 15的时候,图像为:
可以通过调节参数,来看看控制情况,不过一般不清楚最优效果是什么,一般多试,然后记录以后选择相对最优的参数作为控制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时候的图像:
其中曲线是这样的,随着Kp的增大,曲线越贴近y轴,但是超调会不断的增大,而且始终存在稳态误差,稳定的值一直到不了期望值 y = 1 处。
结论:随着Kp的增大,上升时间ts明显减少,可以很快的达到期望值,但是超调量delta%在过了期望值以后会逐渐增大,从而导致调节时间ts也增加,波动变化较大,会存在稳态误差。
调节Kd后的图像:
随着Kd的增大,曲线越来越靠近y轴,并且超调量逐渐减小,但是稳定值也不能到期望值,但是非常的接近了,而且可以减小超调。
结论:在Kp保持不变的条件下,随着Kd的增大,超调量逐渐减小,调节时间也逐渐变短,斜率在上升阶段特别陡,可以很快的接近期望值附近,但是有一个大的弊端:上升时间大大增长,而且在不超调情况下,难以达到期望值(精度不够)。因此在基本控制中基本PD控制就可以满足要求,如果高精度控制需要加上I控制,那样可以满足精度。
调节Ki以后得到的图像:
随着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时候为阶跃信号:
S = 2,为正弦信号
S = 3,为阶跃信号 + 扰动
剩下的斜坡信号和加速度信号,系统追不上,处于发散状态,因此需要自动控制原理上进行分析,选择可以收敛的进行分析,这个需要按照项目需要来满足要求。
接下来开始学习LADRC的相关知识。