1.位置环

位置环的作用是控制电机平缓的到达目标位置,其运用了位置式PID,其输入的是电机反馈的实际位置。

输入:位置误差=目标位置-实际位置

输出:目标速度

其中值得注意的是:位置式PID在积分项达到饱和时,误差仍然会在积分作用下继续累积,也即是积分饱和问题,故在位置环会直接使用PD控制

2. 位置式PID

本例中位置式PID是输入的是目标位置到实际位置的偏差,输出的是电机的目标速度。
主要作用:控制电机以适当的速度到达目标位置

float PID_realize(float speed)
{    
     pid.SetSpeed=speed; 
     pid.err=pid.SetSpeed-pid.ActualSpeed;
     pid.integral+=pid.err; 
     pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pi d.err_last); 
     pid.err_last=pid.err;
     pid.ActualSpeed=pid.voltage*1.0; 
    return pid.ActualSpeed; 
}

注:这里用了最基本的算法实现形式,没有考虑死区问题,没有设定上下限。

3. 串级PID

在本例的云台控制中,位置环的输出作为速度环的输入,这种两个PID串联的控制也即串级PID,其中转速环称为串级PID的内环位置环称为串级PID的外环。

主要作用:期望速度必须能减小位置误差,且位置误差为0时,期望速度为0

串级PID之所以能够实现的实质是:速度与位置存在我们已知的简单变化关系,即速度的积分是位置。也即能够实现快速稳定的到达目标位置。知乎上有个不错的关于串级PID的解答:

再回到我们的控制对象电机中来看,利用串级PID能使电机以一个平稳的速度到达目标位置

总结

根据应用场景,位置环也不光使用位置式PID,有时可能用一部分轨迹规划的控制,但所有这些方法的目的都是为了控制电机相对平稳和快速的运行到目标位置。当然这只是最基本的应用,实际还涉及死区的选取,控制的上下限,还有最重要的调参。

我在实际中在位置式PID中,只引入了比例项,也满足了我的控制需求,当然这也不是一概而论的,实际也还是看每个人的需求。后面有时间单独将实际使用和各个参数的调整拿出来介绍下。

注:内容里有错误或不严谨的地方,请多多指教