微分项的优化
问题
我的理解 微分 是对偏差的变化趋势做出反应,根据偏差的变化趋势实现超前调节,提高反应速度。
但是微分项会在启动的瞬间做出一个较大的反应,这个强度随着时间间隔的缩小被成比例的放大;
同时微分项对噪声(高频扰动)较敏感,容易导致控制过程振荡;
解决思路
已知:
d
d
t
e
(
t
)
=
d
S
e
t
p
o
i
n
t
d
t
−
d
I
n
p
u
t
d
t
\frac d{dt}e\left(t\right)=\frac{dSetpoint}{dt}-\frac{dInput}{dt}
dtde(t)=dtdSetpoint−dtdInput
当期望值固定时:
d d t e ( t ) = − d I n p u t d t \frac d{dt}e\left(t\right)=-\frac{dInput}{dt} dtde(t)=−dtdInput
由于PID的调节是一个连续的过程,当 S e t p o i n t Setpoint Setpoint 改变后,只会在改变的第一次有作用,在第一次忽略掉 d S e t p o i n t d t \frac{dSetpoint}{dt} dtdSetpoint并不会造成调控的断续,同时此修改还将对首次调控的瞬间过快响应起到一定的抑制作用。
代码实现
float kp,ki,kd; // * (P)roportional,(I)ntegral,(D)erivative Tuning Parameter
float setPoint, output, input, errSum, lastInput, lastErr;// 期望值,输出,输入,累积误差,系统上一时刻的误差
void SetTunings(double Kp, double Ki, double Kd, int SampleTime)//采样时间的单位为毫秒
{
float SampleTimeInSec = ((float)SampleTime)/1000;
kp = Kp;
ki = Ki * SampleTimeInSec;
kd = Kd / SampleTimeInSec;
}
void ReverseControllerDirection()
{
kp = (0 - kp);
ki = (0 - ki);
kd = (0 - kd);
}
void Compute()
{
/*Compute all the working error variables*/
float err = setPoint - input;
errSum += err;
float dErr = input - lastInput ;
/*Compute PID output*/
output = kp * err + ki * errSum - kd * dErr;
/*record var for next time*/
lastInput = input;
lastErr = err;
}