基于状态空间模型的PID控制器用M语言实现
Posted 牛郎
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于状态空间模型的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 循环时要保证每个状态都能被循环到;
以上是关于基于状态空间模型的PID控制器用M语言实现的主要内容,如果未能解决你的问题,请参考以下文章
基于arx模型的MPC预测控制器simulink建模与仿真实现