1.什么是PID
PID控制是一种经典的控制算法,它被广泛应用于工业、机械、电子、自动化等领域中的控制系统中。PID控制是指通过对系统输出值与期望值之间的误差进行实时反馈,调节控制器的输出值,以达到控制系统稳定工作的目的。
PID控制算法由三个控制元素组成:比例控制(P)、积分控制(I)和微分控制(D)。比例控制用于直接根据误差大小来调节控制器输出,使输出与误差成比例关系;积分控制则用于累积误差,以降低误差累积导致的系统偏差;微分控制则用于预测误差变化趋势,以抑制系统的过冲现象。
PID控制算法的优点在于可以对系统误差进行实时反馈调整,同时具有简单易懂、易于实现的特点。然而,PID控制算法的缺点是它无法对非线性、时变、不确定性等问题进行很好的控制,需要根据实际控制情况进行调整和优化。
2.PID的实现
2.1 结构体定义
typedef struct {
/* Controller gains */
float Kp;
float Ki;
float Kd;
/* Derivative low-pass filter time constant */
float tau;
/* Output limits */
float limMin;
float limMax;
/* Integrator limits */
float limMinInt;
float limMaxInt;
/* Sample time (in seconds) */
float T;
/* Controller "memory" */
float integrator;
float prevError; /* Required for integrator */
float differentiator;
float prevMeasurement; /* Required for differentiator */
/* Controller output */
float out;
} PIDController;
2.2 PID函数实现
void vPIDControllerInit(PIDController *pid)
{
/* Clear controller variables */
pid->integrator = 0.0f;
pid->prevError = 0.0f;
pid->differentiator = 0.0f;
pid->prevMeasurement = 0.0f;
pid->out = 0.0f;
}
float vPIDControllerUpdate(PIDController *pid, float setpoint, float measurement)
{
/*
* Error signal
*/
float error = setpoint - measurement;
/*
* Proportional
*/
float proportional = pid->Kp * error;
/*
* Integral
*/
pid->integrator = pid->integrator + 0.5f * pid->Ki * pid->T * (error + pid->prevError);
/* Anti-wind-up via integrator clamping */
if (pid->integrator > pid->limMaxInt) {
pid->integrator = pid->limMaxInt;
} else if (pid->integrator < pid->limMinInt) {
pid->integrator = pid->limMinInt;
}
/*Derivative (band-limited differentiator) */
pid->differentiator = -(2.0f * pid->Kd * (measurement - pid->prevMeasurement) /* Note: derivative on measurement, therefore minus sign in front of equation! */
+ (2.0f * pid->tau - pid->T) * pid->differentiator)
/ (2.0f * pid->tau + pid->T);
/*Compute output and apply limits */
pid->out = proportional + pid->integrator + pid->differentiator;
if (pid->out > pid->limMax) {
pid->out = pid->limMax;
} else if (pid->out < pid->limMin) {
pid->out = pid->limMin;
}
/* Store error and measurement for later use */
pid->prevError = error;
pid->prevMeasurement = measurement;
/* Return controller output */
return pid->out;
}
2.3 主线程调用
/* Controller parameters */
#define PID_KP (10.0f)
#define PID_KI (0.35f)
#define PID_KD (0)
#define PID_TAU (0.02f)
#define PID_LIM_MIN (10.0f)
#define PID_LIM_MAX (1000.0f)
#define PID_LIM_MIN_INT (-500.0f)
#define PID_LIM_MAX_INT (500.0f)
#define SAMPLE_TIME_S (1.0f)
PIDController pid;
void main(void)
{
for(;;)
{
if(HAL_GetTick()-uiTick >= 1*1000)//每隔一秒,对应上面的SAMPLE_TIME_S
{
float flow = vGetSystemFLow();//这里是获取流量传感器的读数
vPIDControllerUpdate(&pid,5.0, fFlow);
vTMC5160Rotate((uint16_t)pid.out,CCW);//根据PID的计算结果设定步进电机转速
}
}
}
3.总结
对于惯量较大的闭环控制系统,需要特别注意PID参数的调节。以下是一些可能有用的步骤:
-
确定系统的开环传递函数,也就是没有控制器时输入信号到输出信号的传递函数。这可以通过实验或建模得到。
-
选择合适的控制器类型,比如PID控制器。PID控制器有三个参数:比例增益Kp,积分时间Ti和微分时间Td。
-
首先尝试根据经验法则调节控制器参数。例如,对于惯量较大的系统,可以先将Kp设定为一个较小的值,逐渐增加到满意的水平,以避免产生过大的振荡。然后逐步增加Ti以提高系统的稳定性,最后再考虑Td以改善响应速度。
-
进行实验,评估控制器性能。可以通过观察系统响应曲线、计算系统性能指标(如稳态误差、超调量、调整时间等)来评估控制器性能,并根据需要调整控制器参数。
-
可以使用现代控制技术,例如自适应控制或模型预测控制,来进一步优化控制器性能。
-
如果系统过于复杂或难以建模,可以考虑使用智能控制技术,例如模糊控制或神经网络控制,来设计控制器。这些方法可能需要更多的试验和调整。
总之,调节PID控制器参数需要经验和实验结合,以满足系统要求并优化性能。