专家PID依赖经验与规则的制定,同样也依赖调参。专家PID使用时多用于电机环。
if (pid->errABS < sErr) {
//小偏差 较小误差, 调小比例
pid->outPut = offineK * pid->outPut;
} else if (pid->errABS > lErr) {
//大偏差
//串联BangBang-PID
pid->outPut = (pid->errNow > 0) ? (9500) : (-9500);
} else {
//正常偏差
if ((pid->errNow * (pid->errNow - pid->errLast) > 0 && pid->errLast * (pid->errLast - pid->errLastLast) > 0) || (pid->errNow - pid->errLast) == 0) {
//偏差在朝向偏差绝对值增大的方向变化(偏差越来越大), 或者偏差一直为某一固定值
if (pid->errABS > midErr) {
//控制器实施较强的控制作用
pid->outPut = onlineK * pid->outPut;
} else {
//但是偏差绝对值本身并不是很大
pid->outPut = pid->outPut + 0;
}
} else if(pid->errNow * (pid->errNow - pid->errLast) < 0 && (pid->errNow - pid->errLast) * (pid->errLast - pid->errLastLast) > 0 || (pid->errNow == 0 && pid->errLast == 0) {
//偏差的绝对值向减小的方向变化,或者已经达到平衡状态
//此时可以保持控制器输出不变
} else if(pid->errNow * (pid->errNow - pid->errLast) < 0 && ((pid->errNow - pid->errLast) * (pid->errLast - pid->errLastLast) < 0)) {
//偏差处于极值极限状态
if (pid->errABS > midErr) {
pid->outPut = onlineK * pid->outPut;
} else {
//但是偏差绝对值本身并不是很大
pid->outPut = pid->outPut + 0;
}
} else {
//正常情况
pid->outPut = pid->outPut + 0;
}
}
这是一套较为完整的专家PID,根据实际使用时的情况可以随意删减规则,如为了实际应用时减小静差则不使用小偏差弱调节,为了更为稳定不串联BangBang-PID等,较为依赖经验。