正反作用的调节
问题
如果是冰箱等设备,存在随着输出的提升被控量减小的情况下,目前的PID并不适用;
解决思路
因为是调节方向跟物理特性相关,所以在初始化时就可以完成,那么增加一个函数 R e v e r s e C o n t r o l l e r D i r e c t i o n ( ) ReverseControllerDirection() ReverseControllerDirection() 翻转PID控制的调节方向(默认正向调节);
代码实现
float kp,ki,kd; // * (P)roportional,(I)ntegral,(D)erivative Tuning Parameter
float setPoint, output, input, errSum, 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 = err - lastErr;
/*Compute PID output*/
output = kp * err + ki * errSum + kd * dErr;
/*record var for next time*/
lastErr = err;
}