一、什么是PID
PID(Proportional-Integral-Derivative)是一种经典的控制算法,广泛应用在自动化控制系统中。它是通过对被控对象的测量值和设定值进行比较,并根据误差的大小来调整输出信号,实现对被控对象的稳定控制。
PID控制器由三个部分组成:比例控制器(P)、积分控制器(I)和微分控制器(D)。这三个部分分别对应了控制系统中的比例、积分和微分操作。
首先,我们来看比例控制器(P)。比例控制器根据被控对象当前的偏差与设定值之间的比例关系来调整输出信号。假设被控对象的偏差为e,比例增益为Kp,那么比例控制器的输出信号为Kp * e。比例控制器主要用于快速响应系统的初始偏差,但可能会导致系统存在超调和稳态误差。
接下来是积分控制器(I)。积分控制器根据被控对象偏差的累积值来调整输出信号,以消除稳态误差。假设被控对象的偏差累积值为∑e,积分增益为Ki,那么积分控制器的输出信号为Ki * ∑e。积分控制器主要用于消除系统的稳态误差,但如果增益过大,可能会导致系统出现震荡或不稳定的情况。
最后是微分控制器(D)。微分控制器根据被控对象偏差的变化率来调整输出信号,以抑制系统的超调和振荡。假设被控对象的偏差变化率为de/dt,微分增益为Kd,那么微分控制器的输出信号为Kd * (de/dt)。微分控制器主要用于提高系统的稳定性和响应速度,但如果增益过大,可能会引入噪声或造成系统震荡。
PID控制器的输出信号是这三个部分的总和:输出信号 = Kp * e + Ki * ∑e + Kd * (de/dt)。实际应用中,可以通过试验和经验来确定适当的增益参数,以达到所需的控制效果。
总结一下,PID控制器是一种常用的控制算法,通过比例、积分和微分操作来调整输出信号,实现对被控对象的稳定控制。它在工业、自动化等领域广泛应用,能够有效地解决许多控制问题。然而,在实际应用中需要根据具体情况调整参数,以获得最佳的控制效果。
学过自动控制原理的对PID并不陌生,PID控制是对偏差信号e(t)进行比例、积分和微分运算变换后形成的一种控制规律。PID 算法的一般形式:
- PID控制系统原理框图
二、PID离散化
在实际应用中,PID控制器通常需要在数字系统中进行离散化处理。离散化是将连续时间域的PID控制器转换为离散时间域的控制器,以适应数字控制系统的要求。
离散化PID控制器的关键在于将连续时间域的微分和积分操作转换为离散时间域的形式。下面介绍一种常用的离散化方法:采样周期法(也称为Z变换法)。
-
采样周期(Sampling Period):首先确定控制系统的采样周期,即每次对被控对象进行测量和调整输出的时间间隔。
-
离散化比例项(Discretization of the Proportional Term):离散化比例项可以简单地通过乘以采样周期得到。离散比例增益Kp_discrete = Kp * T(其中Kp为连续比例增益,T为采样周期)。
-
离散化积分项(Discretization of the Integral Term):离散化积分项可以使用数值积分方法来实现,常用的方法是离散化误差的累加。离散积分增益Ki_discrete = Ki * T(其中Ki为连续积分增益,T为采样周期)。
-
离散化微分项(Discretization of the Derivative Term):离散化微分项可以使用数值微分方法来实现,常用的方法是差分运算。离散微分增益Kd_discrete = Kd / T(其中Kd为连续微分增益,T为采样周期)。
-
离散化PID控制器(Discretization of the PID Controller):将离散化的比例项、积分项和微分项相加,得到离散化的PID控制器输出信号。离散化PID控制器的输出信号为PID_discrete = Kp_discrete * e + Ki_discrete * ∑e + Kd_discrete * (de/dt)。
通过以上离散化方法,我们可以将连续时间域的PID控制器转换为离散时间域的控制器,方便在数字控制系统中实现。
需要注意的是,在离散化过程中可能会引入一定的误差,特别是在采样周期较大或被控对象响应速度较快的情况下。因此,在实际应用中,需要根据系统的要求和性能指标进行参数调节和系统优化,以获得最佳的离散化PID控制效果。
对PID连续系统离散化,从而方便在处理器上实现,PID 离散表示形式:
离散化后最终得到位置式PID:
u(k)为控制器输出的控制量;(输出)
e(k)为偏差信号,它等于给定量与输出量之差;(输入)
Kp 为比例系数;
Ti 为积分时间常数;
Td 为微分时间常数。
1. 位置式PID公式
2. 增量式PID公式
三、两种PID的不同点
- 位置式
是一种非递推算法,输出值U(k)和执行机构的实际位置一一对应,在不带积分部件的对象中可以很好的应用。但是每次输出均与过去的状态有关,计算量大。 - 增量式
输出的是增量,控制增量的值仅与最近3次采样值有关,不需要累计偏差,运算量小,计算错误影响小。但会积分截断效应大,有稳态误差。
四、C语言程序实现
- pid.c
#include "pid.h"/*定义PID参数结构体*/
typedef struct _PID
{float Kp,Ki,Kd;//比例系数、积分系数、微分系数float SetValue,ActualValue;//目标值、实际值float Error;//第K次误差float LastError;//第K-1次误差float PreError;//第K-2次误差float SumError;//累计偏差float Integral,MaxI;//积分、积分限幅float Output,MaxOut;//输出、输出限幅
}PID;/************************************************
*@brief :位置式PID控制器
*@param :PID结构体变量地址,当前实际值
*@retval : 期望输出值
*************************************************/
int32_t Position_PID_Control(PID *pid,float Cur_Value)
{pid->Error=pid->SetValue-Cur_Value; //计算偏差 pid->SumError +=pid->Error;//累计偏差pid->ActualValue=(pid->Kp*(pid->Error-pid->LastError))//比例环节+(pid->Ki*pid->SumError)//积分环节+(pid->Kd*(pid->Error-pid->LastError);//微分环节pid->LastError=pid->Error;return ((int32_t)pid->ActualValue); //返回计算值
}/************************************************
*@brief :速度闭环PID控制
*@param :PID结构体变量地址,当前实际值
*@retval : 期望输出值
*************************************************/
int32_t Inc_Pid_Ctrl(PID *pid,float Cur_Value)
{pid->Error=pid->SetValue-Cur_Value; //计算偏差pid->ActualValue +=(pid->Kp*(pid->Error-pid->LastError))//比例环节+(pid->Ki*(pid->Error))//积分环节+(pid->Kd*(pid->Error-2*pid->LastError+pid->PreError));//微分环节 pid->PreError=pid->LastError;//存储偏差,进行下次计算 pid->LastError=pid->Error; return ((int32_t)pid->ActualValue); //返回计算值
}