一个简单的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() 一次。我的程序每秒钟采集一次当前温度,调节一次占空比。

原文地址:https://www.cnblogs.com/ht-beyond/p/4292066.html