Introduction
介绍PID控制器的原理和计算过程,给出MATLAB仿真代码。
PID Controller
PID控制器是工业过程中常用的控制器,结构简单,易于实现。全称为proportional–integral–derivative controller,也就是比例-积分-微分控制器。从某种意义上来讲,PID控制器是基于整个控制过程的历史-现在-未来的信息做出控制决策。在一般的闭环控制回路中,PID控制器在回路中的位置如下图所示:
首先来看P,作用是直接根据当前的误差做出调整。举个例子:有一个四轴飞行器停在地面,目标是50米高空的设定位置,此时先不考虑飞行器自身的重量。当t=1, 此时sp=50m, pv=0m, e=sp-pv=50m。 假如此时只有P在起作用并设定Kp=0.1。可以求出控制器的输出op=kp*e=0.1*50=5。这个5代表什么呢?在这个系统中,控制对象是飞行器,飞行器的执行器一般为电机,通过控制电机的转速可以控制四轴飞行器的上升和下降的速度,而这个op值就对应了电机的转速,控制飞行器上升和下降的速度。假设此时op和飞行器电机转速成线性正比,那么设定系数为1,那么转速为5,上升的速度也为5。那么在经过了1s后,飞行器的位置变成了5m的高度,此时sp=50m, pv=5m, e=sp-pv=45m。到下一时刻, 再计算op=kp*e=0.1*45=4.5, 说明下一时刻飞行器的上升速度变为4.5m/s,那么再经过1s后,飞行器的实际位置变成了9.5m。此时距离期望位置50m更近一步。经过多次,飞行器最终将到达设定的位置50m。这就是P的作用。
再来考虑I,作用是根据历史累计的误差做出调整。举个例子,还是以飞行器的为例,但此时飞行器有自重,并假设当飞行器转速为1的时候,刚好可以抵消自重,也就是说,当转速为1,飞行器处于悬停状态。通过op=kp*e可知,当e = 10的时候, op=1, 此时飞行器处于悬停状态, 且高度为40m, 并且会一直保持在40m的高度,无法达到50m的高度。 因此这时候光用P是不行的,需要引入积分作用。积分作用是对历史误差的累计做出调整。此时op=Ki*e + Kp*sum(e), sum()表示对e求和,也就是e的积分。下面通过计算来说明。当t=1, 此时 sp=50m, pv=0m, =sp-pv=50m, 设置ki = 0.1, 则op = kp*
+ ki*
= 0.1*50 + 0.1*50 = 10。t=2时,sp=50m, pv=10m,
=sp-pv=40m, 则op = kp*
+ ki*
= 0.1*40 + 0.1*(50+40) = 13。可以看出由于历史中存在误差,且误差一直存在,因此积分项永远不会为0,也就是控制器永远有输出,积分器补偿了由于重力存在而一直不能消除的误差。这也是为什么积分可以消除误差的原因。
最后再简单说一下D。D是根据误差的变化率来做出调整。D是根据前两次误差的之间的变化率来计算输出值的。当变化率大的时候,说明误差在急剧变化,也就是被控量变化很快,也就认为被控量未来会向某一个方向急剧变化。
MATLAB code
位置式PID代码:
%% PID Controller
error(k) = sp(k)-pv(k-1); %计算当前误差, error(k)对应e(t)
e_pro = error(k); %Kp误差
e_sum = e_sum + error(k); %Ki误差
e_dev = error(k) - error(k-1); %Kd误差
op(k) = kp*e_pro + ki*e_sum + kd * e_dev; % controller output, 对应u(t)
增量式PID代码:
%% PID Controller
error(k) = sp(k)-pv(k-1); %计算当前误差, 对应e(t)
e_pro = error(k) - error(k-1); %当前误差
e_sum = error(k); %计算累计误差
e_dev = error(k) - 2*error(k-1) + error(k-2); %计算误差变化率
op(k) = op(k-1)+ kp*e_pro + ki*e_sum+ kd * e_dev ;%计算controller output, 对应u(t)
References
[1] en.wikipedia.org/wiki/PID_co…
[2] ww2.mathworks.cn/videos/seri…