一个简单的PID控制算法
回校后要进行校电子设计竞赛,把以前做过的温控系统PID算法重温下。
比例(P)、积分(I)、微分(D)控制算法各有作用:
比例,反应系统的基本(当前)偏差e(t),系数大,可以加快调节,减小误差,但过大的比例使系统稳定性下降,甚至造成系统不稳定;
积分,反应系统的累计偏差,使系统消除稳态误差,提高无差度,因为有误差,积分调节就进行,直至无误差;
微分,反映系统偏差信号的变化率e(t)-e(t-1),具有预见性,能预见偏差变化的趋势,产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除,因此可以改善系统的动态性能。但是微分对噪声干扰有放大作用,加强微分对系统抗干扰不利。积分和微分都不能单独起作用,必须与比例控制配合。
以温控系统为例:
比例调节,还没有加热到预定温度,就继续增加占空比,误差越大占空比增加的越厉害。微分调节,当实际温度越来越离目标温度近的时候,微分调节会拉下占空 比,避免冲过目标温度。积分调节,当温度稳定在目标温度之上一小点时,比例调节和微分调节无效,积分误差越来越大,进行积分调节,消除稳态误差。
void SetPID(double p,i,d) { Kp = p; Ki = i * 10.0; Kd = d / 10.0; } void PIDCompute() { double error; double sumerror; double derror; double lasterror = 27.0; error = settemp - temp; //设定温度 - 当前温度 sumerror += error; derror = error - lasterror; output = Kp * error + Ki * sumerror + Ki * derror; lasterror = error; }
编程时只是设定它们的大概数值,在系统运行时通过反复调试来确定最佳值。
程序开始时:SetPID(44.5,0.7,0.1);
在单片机中断里每秒执行 PIDCompute() 一次。我的程序每秒钟采集一次当前温度,调节一次占空比。