⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pid.pas

📁 PID算法
💻 PAS
字号:
unit PID;

interface
type
  TPID=class        //定义一个类
  sp,pv:single;    //设定值和测量值
  errormin,errormax,error_1:single;//偏差下限、偏差上限和上次偏差
  umax,umin,U_1:single;//超调区上限、超调区下限和上次PID输出
  Kp,Ti,Td,T:single; //比例增益、积分、微分和采样时间
  deadband,Ui_sum:single; //死区和积分总和
  Ud_1:single; //不完全微分惯性
  function pidcontrol():single; //PID控制器输出
  end;
implementation
  function TPID.pidcontrol():single;
  var
    error:single; //即时偏差
    Ki,Kd:single;  //定义积分增益、微分增益
    Up,Ui,Ud:single;//P作用、I作用和D作用
    Ud_a,a,Td_s:single; //不完全微分的系数
    mv:single;
  begin
    Ki:=Kp*T/Ti;  //求积分增益
    Kd:=Kp*Td/T;  //求微分增益
    error:=sp-pv; //求即时偏差error
    if (Kd=0) then
    begin
      Td_s:=0;
      a:=0;
      Ud:=0;
      Ud_1:=0;
    end else begin
      Td_s:=T+Td/Kd;  //Ud的系数
      a:=Td/(Td+T*Kd);//Ud_1的系数
      Ud:=a*Ud_1+(Kd*Td/Td_s)*(error-error_1); //微分作用
      Ud_1:=Ud;
    end;
    if (abs(error)>deadband) then  //判断在死区?
    begin
      if (u_1>umax)then    //遇限消弱积分
      begin
        if (error<0) then   //减小方向则计算
        begin
          Ui:=Ki*error;
        end else Ui:=0;
      end else if (u_1<umin) then   //遇限消弱积分
      begin
        if (error>0) then          //增加方向则计算
        begin
          Ui:=Ki*error;
        end else Ui:=0;
      end else Ui:=Ki*error;    //积分作用
      Ui_sum:=Ui_sum+Ui;    //积分累加
      if (Ui_sum>100) then   //防止积分过饱和
      begin
        Ui_sum:=100;
        mv:=100;
      end else if(Ui_sum<0)then    //防止积分过饱和
        Ui_sum:=0;
        Up:=Kp*error;    //比例作用
        mv:=Up+Ui_sum+Ud;  //共同作用
      if (mv>100) then      //输出范围限制
        mv:=100
      else if (mv<0) then
        mv:=0;
    end else mv:=Ui_sum;   //不在死区
    error_1:=error;     //返回偏差,作为上次偏差
    U_1:=mv;
    result:=mv;        //最终输出
  end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -