基本思想:PID算法不但考虑控制对象当前状态(现在状态),而且还考虑控制对象过去一段时间的状态值(历史状态),和最近一段时间的状态值变化(预期),由这3方面共同决定当前的输出控制信号。
一.计算:PIDout = Pout + Iout + Dout
Pout = Kp * Ek +OUT0.其中Kp为比例系数,Ek =Sv - Pv。OUT0为一个常数。
Iout = Kp * Sk + OUT0.其中Kp为比例系数,Sk = (1/Ti) * (历史偏差之和)*T。其中T为采样周期(计算周期),Ti积分时间(相当于计算历史偏差时间的总时间)。
Dout = Kp * Dk+ OUT0.其中Kp为比例系数,Dk = Td * ((Ek-Ek-1)/T)。其中Ek-Ek-1为当前两次偏差之差,T为计算周期,Td微分常数。((Ek-Ek-1)/ T 反应了偏差的变化率)。
合并后:
PIDout = (Kp * EK) + ( Kp *(T/Ti) * (历史偏差Ek之和) ) + (Kp *(Td / T) * (Ek - Ek-1) ) + OUT0
需要设定的值:Kp比例系数,T采样周期(计算周期),Ti积分时间,Td微分常数。算出的值可直接作为输出结果,因此称为位置式PID。
增量式PID :
DetPIDout = PIDoutK - PIDoutK-1 。带入到PIDout 公式后 DetPIDout = Kp *(Ek- Ek-1) + Kp *(T/Ti) * Ek + Kp *(Td/T) * (Ek -2Ek-1 +Ek-2)。从公式可知增量式PID算法简单一些,增量式PID一般用在有记忆功能的控制系统中。
示例:下面是实际温控项目的参数设定
void PID_Init(void)
{
pid.Sv = 120;// 设定温度120度
pid.Kp = 30;// 比例系数
pid.T = 500;// PID计算周期 500ms,每隔500ms我们计算一次当前的温度偏差值Ek。
pid.Ti = 5000000;//积分时间(可理解为历史偏差的时间是5000s)
pid.Td = 1000;// 微分时间(作用调节因计算周期过长或过短对输出结果的影响:Td*((Ek - Ek-1) / T))
pid.pwmcycle = 1000;// 单片机PWM输出的周期时间1000ms
pid.OUT0 = 1;// 调节常数(避免设定值与当前值相等时,输出为0,此时需要保持输出一个维持结果的微信号)
}
由以上参数带入位置式PID计算公式可以得到的结果可直接作为pwm的控制信号。
得到输出结果后,要做一下归并:
out = Pout + Iout +Dout + pid.OUT0;
if(out > pid.pwmcycle) // 输出结果大于pwm的周期
{
pid.OUT = pid.pwmcycle;// 把pwm的周期值作为输出结果
}
else if(out < 0)
{
pid.OUT = 0;// 控制信号归0
}
else // 计算结果是我们需要的值
{
pid.OUT = out;
}
pid.Ek-1 = pid.Ek ; // 把本次的偏差作为下次的偏差
最后pid.OUT 要和pwm控制结合,在1ms中断中改变控制信号
void PID_OUT(void) // 输出PID运算结果到负载,每1ms进中断调用此函数
{
u6 static pw;
pw ++;
if(pw >= pid.pwmcycle)
{
pw =0;
}
if(pw < pid.OUT)
{
pwm_ctr =1;// 开始加热
}
else
{
pwm_ctr = 0;// 关加热
}
}
2017.09.06 PID算法实现制冷片恒温控制
2018.0407 莫恩率雾化器加热丝使用的PID算法: