<>一. 什么是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次的采样值有关,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作。