PID的基本理念是读取传感器的值,根据计算比例、积分、微分响应得出期望的输出,将三个值相加计算输出。
1、控制系统
闭环系统如图。以温度控制距离,设定温度100度,这时传感器采到温度80度,经过控制算法后的输出将控制外设打开加热,整个系统的温度将会上升。采到温度高于设定温度同理。这样就形成了一个闭环的控制系统。
2、PID术语
比例响应
比例模块取决于设定值和过程变量之间的差值。称为“误差”。比例增益决定了输出响应对误差信号的比例。例如,误差为10,比例增益为5时,比例响应为50。一般而言,提高比例增益会增加控制系统响应的速度。但是如果比例增益太大,过程变量会有振荡。如果继续增加Kc,系统振荡会越来越大,以至于超出控制,使得系统变得不稳定。
积分响应
积分模块将一段时间内的误差相加。 即使是一个很小的误差,也会让积分响应缓慢增加。积分响应会根据时间持续增加,除非误差为0。积分响应的目的在于将稳定状态的误差保持在0。稳定状态误差是过程变量和设定值之间的差值。当积分操作满足了控制器的条件,而控制器还未将误差保持在0时,会产生积分饱和的结果。
微分响应
微分模块在过程变量迅速增大时停止输出。微分响应与过程变量变化的速度之间成比例关系。增加微分时间(Td)会使控制系统对误差的反应更加剧烈,会增加整个控制系统的响应时间。大多数实用控制系统使用非常小的微分时间(Td),因为微分响应对过程变量的噪声特别敏感。如传感器反馈信号中有噪声或控制循环速率太低,微分响应会使控制系统变得不稳定。
再配个图就是
3、程序实现
增量式PID的计算公式是下面这个:
算法的关键部分如下:
void PID_Handle(struct _PID *pp) { int err1,err2; int Pout, Iout, Dout; int pidOutTemp; int Out; pp->En = pp->setTemp - pp->currTemp; err1 = pp->En - pp->En_1; err2 = pp->En - 2 * pp->En_1 + pp->En_2; Pout = pp->Kp * err1; //比例 Iout = pp->Ti * pp->En; //积分 Dout = pp->Td * err2; //微分 pidOutTemp = Pout + Iout + Dout; Out = pp->Dout + pidOutTemp; if (Out > MAX_TIME) { Out = MAX_TIME; } else if (Out < MIN_TIME) { Out = MIN_TIME; } pp->Dout = Out; pp->En_2 = pp->En_1; pp->En_1 = pp->En; }
对结构体的定义如下:
struct _PID { int currTemp; //当前温度 int setTemp; //设定温度 int En; //当前误差 int En_1; //上次误差 int En_2; //上上次误差 int Kp; int Ti; int Td; int Dout; };
都用了整型是为了计算更加快速,在输入之前,有对实际采集温度进行1位小数的保留。其他的想到了再编辑吧,准备再去试试位置式的PID。