小白学习日记-----arduino如何使用PID控制算法

ardiuino如何使用PID控制算法

引言

PID:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。顾名思义,PID控制算法是结合比例、积分和微分三种环节于一体的控制算法,PID控制的实质就是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出。

连续控制系统理想pid控制规律

在这里插入图片描述
u(t):是输出值;
kp:是比例增益;
e(t):是设定值与测量值之间的差值;
Tt:积分时间常数;
Td:微分时间常数;

两边同时进行拉氏变换

     U(s) = Kp(1 + 1/(Tt*s) + Td*s) * E(s);

传递函数

      C(s)  =  Kp(1 + 1/(Tt*s) + Td*s)

对pid三个参数的理解

kp: 能提高系统的动态响应速度,迅速反映误差,从而减少误差,但是不能消除误差,简单来说就是越大越快越小越慢但是可能会超调或者过慢有很多弊端,并且太大了会不稳定。
Ki:一般就是消除稳态误差,只要系统存在误差积分作用就会不断积累,输出控制量来消除误差,如果偏差为零这时积分才停止,但是积分作用太强会使得超调量加大,甚至使系统出现震荡
Kd:微分显然与变化率有关,你可以把它理解为导数,它可以减小超调量来克服震荡,使系统稳定性提高,同时加快响应速度,使系统更快有更好的动态性能。

PID控制器的使用

在计算机控制系统中,由于控制是使用采样控制,它只能根据采样时刻的偏差计算控制量,而不能像模拟控制那样连续输出控制量量,进行连续控制。所以数字PID控制也属于离散型控制系统。(注重点:实际使用pid控制器是离散控制系统)

数字型PID控制算法可分为位置式PID和增量式PID控制算法。

位置式PID:位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;
增量式PID:而增量式PID的输出只与当前拍和前两拍的误差有关,

(1) 位置式PID
由于是离散型控制系统,积分项和微分项不能直接使用,必须进行离散化处理。离散化处理的方法为:以 T 作为采样周期,k 作为采样序号,则离散采样时间 kT 对应着连续时间t,用矩形法数值积分近似代替积分,用一阶后向差分近似代替微分,可作如下近似变换:
小白学习日记-----arduino如何使用PID控制算法_第1张图片
根据以上公式的转换,便可得到离散的PID表达式
小白学习日记-----arduino如何使用PID控制算法_第2张图片
位置式PID算法的特点:
由于全量输出,所以每次输出均与过去状态有关,计算时要对ek进行累加,工作量大,耗内存;并且,因为计算机输出的uk 对应的是执行机构的实际位置,如果计算机出现故障,输出的 uk将大幅度变化,会引起执行机构的大幅度变化,有可能因此造成严重的生产事故,这在实生产际中是不允许的。

(2) 增量式PID
所谓增量式 PID 是指数字控制器的输出只是控制量的增量∆uk。当执行机构
需要的控制量是增量,而不是位置量的绝对数值时,可以使用增量式PID控制算法进行控制。
增量式 PID 控制算法可以通过位置式PID公式推导出。由位置式PID公式可以得到控制器的第 k-1 个采样时刻的输出值为:
小白学习日记-----arduino如何使用PID控制算法_第3张图片
对位置式PID取增量可以得到:
小白学习日记-----arduino如何使用PID控制算法_第4张图片
增量式PID算法的特点:
增量式 PID 控制算法与位置式 PID 算法公式相比,如果计算机控制系统采用恒定的采样周期 T,一旦确定Kp、Ti、Td参数,只要使用前后三次测量的偏差值,就可以由增量式PID公式求出控制量。计算量小的多,因此在实际中得到广泛的应用。

PID实际使用

增量法计算公式:

  //OUT=Kp*[E(t)-E(t-1)]+Ki*E(t)+Kd*[E(t)-2*E(t-1)+E(t-2)]
  ERROR = setpoint - input
  SUMERROR += ERROR
  OUT = KP*ERROR + KI*SUMERROR + KD*(LASTERROR - PREVERROR)input
  PREVERROR =  LASTERROR 
  LASTERROR = ERROR
arduino写的pid测试程序
int setpoint = 100;
long sumerror;
double kp = 0.3,ki = 0.15,kd = 0.1;
int lasterror;
int input = 10;
int output;
int nowerror;
void setup() {
  // put your setup code here, to run once:
    Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  nowerror = setpoint - input;
  sumerror += nowerror; 
  output = kp*nowerror + ki*sumerror + kd*(lasterror - nowerror);
  lasterror = nowerror;
  input += output;
  Serial.println(input);
  delay(50); 
 
}
kp  ki  kd  还没有调节。
arduino串口显示效果如下

小白学习日记-----arduino如何使用PID控制算法_第5张图片

你可能感兴趣的:(PID,arduino)