一、介绍
比例(Proportion)积分(Interrupt)微分(Different)控制器(PID控制器或三项控制器)是一种采用反馈控制回路机制,广泛应用于工业控制系统和需要连续调制控制的各种系统中。
二、PID系统定义与公式
1、r(t) setpoint, reference,是期望的过程值或设定值(SP);
2、y(t) output, process variable,是测量的过程值,输出值(PV);
3、e(t) error,是偏差;
4、u(t) control effort,是控制量;
5、PID控制器不断计算误差值e(t)作为所需设定点之间的差异SP=r(t)和测量的过程变量 PV=y(t):e(t)=r(t)−y(t) ,并应用基于比例、积分和导数项的修正;
6、公式如下:
三、代码实现(C/C++)
//首先定义PID结构体用于存放一个PID的数据
typedef struct
{
float kp,ki,kd;//三个系数
float error,lastError;//误差、上次误差
float integral,maxIntegral;//积分、积分限幅
float output,maxOutput;//输出、输出限幅
}PID;
//用于初始化pid参数的函数
void PID_Init(PID *pid,float p,float i,float d,float maxI,float maxOut)
{
pid->kp=p; //P环增益
pid->ki=i; //I环增益
pid->kd=d; //D环增益
pid->maxIntegral=maxI; //积分限幅
pid->maxOutput=maxOut; //输出限幅
}
//进行一次pid计算
//参数为(pid结构体,目标值,反馈值),计算结果放在pid结构体的output成员中
void PID_Calc(PID *pid,float reference,float feedback)
{
//更新数据
pid->lastError=pid->error;//将旧error存起来
pid->error=reference-feedback;//计算新error
//计算微分
float dout=(pid->error-pid->lastError)*pid->kd;
//计算比例
float pout=pid->error*pid->kp;
//计算积分
pid->integral+=pid->error*pid->ki;
//积分限幅
if(pid->integral > pid->maxIntegral) pid->integral=pid->maxIntegral;
else if(pid->integral < -pid->maxIntegral) pid->integral=-pid->maxIntegral;
//计算输出
pid->output=pout+dout+pid->integral;
//输出限幅
if(pid->output > pid->maxOutput) pid->output=pid->maxOutput;
else if(pid->output < -pid->maxOutput) pid->output=-pid->maxOutput;
}
PID mypid;//创建一个PID结构体变量
int main()
{
//...这里有些其他初始化代码
PID_Init(&mypid,10,1,5,800,1000);//初始化PID参数
while(1)//进入循环运行
{
float feedbackValue=...;//这里获取到被控对象的反馈值
float targetValue=...;//这里获取到目标值
PID_Calc(&mypid,targetValue,feedbackValue);//进行PID计算,结果在output成员变量中
设定执行器输出大小(mypid.output);
delay(10);//等待一定时间再开始下一次循环
}
}