zoukankan      html  css  js  c++  java
  • 增量式PID控制算法

    当执行机构需要的不是控制量的绝对值,而是控制量的增量(例如去驱动步进电动机)时,需要用PID的“增量算法”。


    增量式PID控制算法C51程序

    /*====================================================================================================
    PID Function
    The PID (比例、积分、微分) function is used in mainly
    control applications. PIDCalc performs one iteration of the PID
    algorithm.
    While the PID function works, main is just a dummy program showing
    a typical usage.
    =====================================================================================================*/ 
    
    typedef struct PID
    
    {
    
    int SetPoint; //设定目标 Desired Value
    
    long SumError; //误差累计
    
    double Proportion; //比例常数 Proportional Const
    
    double Integral; //积分常数 Integral Const
    
    double Derivative; //微分常数 Derivative Const
    
    int LastError; //Error[-1]
    
    int PrevError; //Error[-2]
    
    } PID;
    
    
    
    
    
    static PID sPID;
    
    static PID *sptr = &sPID;
    
    /*====================================================================================================
    Initialize PID Structure PID参数初始化
    =====================================================================================================*/
    
    void IncPIDInit(void)
    
    {
    
    sptr->SumError = 0;
    
    sptr->LastError = 0; //Error[-1]
    
    sptr->PrevError = 0; //Error[-2]
    
    sptr->Proportion = 0; //比例常数 Proportional Const
    
    sptr->Integral = 0; //积分常数Integral Const
    
    sptr->Derivative = 0; //微分常数 Derivative Const
    
    sptr->SetPoint = 0;
    
    }
    
    
    
    /*====================================================================================================
    增量式PID计算部分
    =====================================================================================================*/
    
    int IncPIDCalc(int NextPoint)
    
    {
    
    register int iError, iIncpid; //当前误差
    
    iError = sptr->SetPoint - NextPoint; //增量计算
    
    iIncpid = sptr->Proportion * iError //E[k]项
    
    - sptr->Integral * sptr->LastError //E[k-1]项
    
    + sptr->Derivative * sptr->PrevError; //E[k-2]项
    
    //存储误差,用于下次计算
    
    sptr->PrevError = sptr->LastError;
    
    sptr->LastError = iError;
    
    //返回增量值
    
    return(iIncpid);
    
    }
  • 相关阅读:
    JS知识点简单总结
    Js答辩总结
    JS答辩习题
    轮播
    jQuery选择器总结
    JS的魅力
    JS与JAVA数据类型的区别
    单表查询、多表查询、虚拟表连接查询
    Mysql基本语句
    Mysql数据库
  • 原文地址:https://www.cnblogs.com/snddman/p/1676325.html
Copyright © 2011-2022 走看看