一. 什么是PID
比例-积分-微分(Proportion Integration Differentiation)的简称,PID是一个负反馈闭环控制系统。
二. PID应用场景
PID可以应用在对压力、温度、流量、液位等工艺变量要求维持在一定的数值上。
三. PID的代码以及控制逻辑
PID控制分两种,分别为位置式PID和增量式PID。
1. 位置式PID
位置式pid公式
ek:Sv -Pv (目标值与当当前值的误差)
2. 增量式PID
增量式pid公式
ek:Sv -Pv (目标值与当当前值的误差)
void IncPIDInit(void);
int IncPIDCalc(int CurrPoint);
void PID_SetValue(PID *pid, int sv);
#define MAXOUT 100
/********************结构体定义********************/
typedef struct PID
{
int32 SetPoint; //设定值
float Proportion; // 比例
float Integral; // 积分
float Derivative; // 微分
int iError; //当前误差
int iIncpid; //增量误差
int LastError; //前1次误差值
int PrevError; //前2次误差值
int Uk; //输出返回值
} PID, *PID_t;
PID pid;
static PID_t sptr;
/********************PID参数初始化********************/
void IncPIDInit(void)
{
sptr = &pid;
sptr->SetPoint = 700; //设定值
sptr->Proportion = 3.0f; //比例
sptr->Integral = 0.0f; //积分
sptr->Derivative = 0.0f; //微分
sptr->LastError = 0u; //前2次误差值
sptr->PrevError = 0u; //前1次误差值
sptr->iError = 0; //当前误差
sptr->iIncpid = 0; //输出返回值
}
/********************PID算法实现********************/
/**
* 输入参数:当前控制量
* 返 回 值:目标控制量
*/
int IncPIDCalc(int CurrPoint)
{
//当前误差
sptr->iError = sptr->SetPoint - CurrPoint;
/* 消除抖动误差 */
if((sptr->iError<0.05f )&& (sptr->iError>-0.05f))
sptr->iError = 0.0f;
//增量误差
sptr->iIncpid = sptr->Proportion * sptr->iError //E[k]项
- sptr->Integral * sptr->LastError //E[k-1]项
+ sptr->Derivative * sptr->PrevError; //E[k-2]项
//存储误差,用于下次计算
sptr->LastError = sptr->iError;
sptr->PrevError = sptr->LastError;
//输出值限幅
if (sptr->iIncpid >= MAXOUT)
{
sptr->iIncpid = MAXOUT;
}
else if(sptr->iIncpid <= 0u)
{
sptr->iIncpid = 0;
}
else sptr->iIncpid = sptr->iIncpid;
return (sptr->iIncpid);
}
/********************更改目标温度********************/
void PID_SetValue(PID *pid, int sv)
{
pid->Sv = sv;
}
3. 参数调试
调整方式 | (on) 上升时间 | 超调量 | 安定时间 | 稳态误差 | 稳定性 |
---|---|---|---|---|---|
↑ Kp | 减少 ↓ | 增加 ↑ | 小幅增加 ↗ | 减少 ↓ | 变差 ↓ |
↑ Ki | 小幅减少 ↘ | 增加↑ | 增加 ↑ | 大幅减少↓↓ | 变差↓ |
↑ Kd | 小幅减少 ↘ | 减少↓ | 减少↓ | 变动不大→ | 变好 ↑ |
4. 二者区别
实际应用中大多用增量式PID。优点是:控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作。