基于状态空间模型的PID控制器用M语言实现

前面讲到如何将状态空间量建模,现在用PID控制方法并通过m语言来实现:

搞清楚这两个问题,加深对PID控制器的理解:

u = Kp * (x_last - x(i)) +

  Ki * (x_last - 2 * x(i - 1) + x(i - 2)) +

  Kd * x_last

u为控制量,x_last为目标值。x(i)为当前值(公式具体怎么写忘记了,但形式应该是对的)

1 比例调节无法令实际值调整到目标值!

  原因:我们只看比例部分,u = Kp * (x_last - x(i)),当实际值趋近于目标值,等号右边趋近0,u也就趋近于0,如果再考虑实际系统中的摩擦,空气阻力等,这类现象就更加明显;

2 为什么积分环节可以控制实际值到目标值!

  原因:Ki * (x_last - 2 * x(i - 1) + x(i - 2)),当实际值趋近目标值时,积分内容趋近于0,而一个常数的导数为0,因此积分部分最后算出来就是一个定值,恰好弥补了比例调节的不足;

3 系统可能由于受到物理极限的限制而无法达到想要的目标值,如令汽车速度稳定在500m/s,实际生活中目前是的汽车是不可能达到;

举个例子讨论阶数的问题:

已知:A= [-2 -1;1 0] , B = [1 ; 0],现用P控制器来控制这个系统(搞清楚P控制,积分微分内容也是如法炮制)

matlab脚本如下:

A = [-2 -1;1 0];

B = [1;0];

C = [0 0];%C的值应该是与AB的阶数有关

D = 0;

sys = ss(A,B,C,D);%组成空间量

sys1 = c2d(sys,0.1);%转为离散,采样时间0.1s

x = [1;0];%系统初始状态

x_last = [0;0];%我们期望的最终目标

Kp = [0.001 0.001];%系数不能太大,下面会说明为什么是2*1的

%Ki

%Kd

%下面开始进行P调节

for i = 1:100

  u = Kp * (x_last - x(:,i));%u控制器算出的控制量

  x(:,i+1) = sys1(1,1).A * x(:,i) + sys1(1,1).B * u;%为了保证矩阵维度一致,u必须是1*1的,所以Kp需要是1*2的

end

到此程序结束,在这要注意几点:

1 一定要注意矩阵维度问题,维度很容易出错;

2 循环时要保证每个状态都能被循环到;

猜你喜欢

转载自www.cnblogs.com/niulang/p/9049265.html
今日推荐