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);
    
    }
  • 相关阅读:
    FZU 2129 子序列个数(DP)题解
    FZU 2082 过路费(树链剖分 边权)题解
    2019牛客多校第一场E ABBA(DP)题解
    ajax解决csrf的跨站请求伪造
    django实现简单的跨域请求数据
    python 与jQuery之间的接口对应
    GO语言的初次学习
    Django一些常用参数的设置
    auth认证模块
    Django中间件模块的使用
  • 原文地址:https://www.cnblogs.com/snddman/p/1676325.html
Copyright © 2011-2022 走看看