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

📄 pid2.txt

📁 pid
💻 TXT
字号:
/*转载:标准PID源程序 

--- 工业控制中常用算法 ---*/ 
     
    /*==================================================================================================== 
     这是从网上找来的一个比较典型的PID处理程序,在使用单片机作为控制cpu时,请稍作简化,具体的PID 
    参数必须由具体对象通过实验确定。由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算, 
    而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可 
    大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余 
    数补偿。这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。 
    =====================================================================================================*/ 
    #include <string.h> 
    #include <stdio.h> 
    /*==================================================================================================== 
     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 { 
     
     double SetPoint; // 设定目标 Desired value 
     
     double Proportion; // 比例常数 Proportional Const 
     double Integral; // 积分常数 Integral Const 
     double Derivative; // 微分常数 Derivative Const 
     
     double LastError; // Error[-1] 
     double PrevError; // Error[-2] 
     double SumError; // Sums of Errors 
     
    } PID; 
     
    /*==================================================================================================== 
     PID计算部分 
    =====================================================================================================*/ 
     
    double PIDCalc( PID *pp, double NextPoint ) 
    { 
     double dError, Error; 
     
     Error = pp->SetPoint - NextPoint; // 偏差 
     pp->SumError += Error; //  
     dError = pp->LastError - pp->PrevError; // 当前微分 
     pp->PrevError = pp->LastError; 
     pp->LastError = Error; 
     return (pp->Proportion * Error // 比例项 
     + pp->Integral * pp->SumError // 积分项 
     + pp->Derivative * dError // 微分项 
     ); 
    } 
     
    /*==================================================================================================== 
     Initialize PID Structure 
    =====================================================================================================*/ 
     
    void PIDInit (PID *pp) 
    { 
     memset ( pp,0,sizeof(PID)); 
    } 
     
    /*==================================================================================================== 
     Main Program 
    =====================================================================================================*/ 
     
    double sensor (void) // Dummy Sensor Function 
    { 
     return 100.0; 
    } 
     
    void actuator(double rDelta) // Dummy Actuator Function 
    {} 
     
    void main(void) 
    { 
     PID sPID; // PID Control Structure 
     double rOut; // PID Response (Output) 
     double rIn; // PID Feedback (Input) 
     
     PIDInit ( &sPID ); // Initialize Structure 
     sPID.Proportion = 0.5; // Set PID Coefficients 
     sPID.Integral = 0.5; 
     sPID.Derivative = 0.0; 
     sPID.SetPoint = 100.0; // Set PID Setpoint 
     
     for (;;) { // Mock Up of PID Processing 
     
     rIn = sensor (); // Read Input 
     rOut = PIDCalc ( &sPID,rIn ); // Perform PID Interation 
     actuator ( rOut ); // Effect Needed Changes 
     } 
    } 

⌨️ 快捷键说明

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