网站导航: 首页 > 设计参考 > 正文 文章搜索
单片机PID控制算法程序库
 
文章编号:
091221170510
文章分类: 单片机 51系列
点 击:
...
关 键 词: PID
文章来源:
互联网
摘 要:
这是从网上找来的一个比较典型的PID处理程序,在使用单片机作为控制cpu时,请稍作简化,具体的PID 参数必须由具体对象通过实验确定...

 
  1. /*====================================================================================================  
  2.     这是从网上找来的一个比较典型的PID处理程序,在使用单片机作为控制cpu时,请稍作简化,具体的PID  
  3. 参数必须由具体对象通过实验确定。由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,  
  4. 而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可  
  5. 大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余  
  6. 数补偿。这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。  
  7. =====================================================================================================*/  
  8. #include <string.h>   
  9. #include <stdio.h>   
  10. /*====================================================================================================  
  11.     PID Function  
  12.       
  13.     The PID (比例、积分、微分) function is used in mainly  
  14.     control applications. PIDCalc performs one iteration of the PID  
  15.     algorithm.  
  16.  
  17.     While the PID function works, main is just a dummy program showing  
  18.     a typical usage.  
  19. =====================================================================================================*/  
  20.   
  21. typedef struct PID {   
  22.   
  23.         double  SetPoint;           //  设定目标 Desired Value   
  24.   
  25.         double  Proportion;         //  比例常数 Proportional Const   
  26.         double  Integral;           //  积分常数 Integral Const   
  27.         double  Derivative;         //  微分常数 Derivative Const   
  28.   
  29.         double  LastError;          //  Error[-1]   
  30.         double  PrevError;          //  Error[-2]   
  31.         double  SumError;           //  Sums of Errors   
  32.   
  33. } PID;   
  34.   
  35. /*====================================================================================================  
  36.    PID计算部分  
  37. =====================================================================================================*/  
  38.   
  39. double PIDCalc( PID *pp, double NextPoint )   
  40. {   
  41.     double  dError,   
  42.             Error;   
  43.   
  44.         Error = pp->SetPoint -  NextPoint;          // 偏差   
  45.         pp->SumError += Error;                      // 积分   
  46.         dError = pp->LastError - pp->PrevError;     // 当前微分   
  47.         pp->PrevError = pp->LastError;   
  48.         pp->LastError = Error;   
  49.         return (pp->Proportion * Error              // 比例项   
  50.             +   pp->Integral * pp->SumError         // 积分项   
  51.             +   pp->Derivative * dError             // 微分项   
  52.         );   
  53. }   
  54.   
  55. /*====================================================================================================  
  56.    Initialize PID Structure  
  57. =====================================================================================================*/  
  58.   
  59. void PIDInit (PID *pp)   
  60. {   
  61.     memset ( pp,0,sizeof(PID));   
  62. }   
  63.   
  64. /*====================================================================================================  
  65.     Main Program  
  66. =====================================================================================================*/  
  67.   
  68. double sensor (void)                    //  Dummy Sensor Function   
  69. {   
  70.     return 100.0;   
  71. }   
  72.   
  73. void actuator(double rDelta)            //  Dummy Actuator Function   
  74. {}   
  75.   
  76. void main(void)   
  77. {   
  78.     PID         sPID;                   //  PID Control Structure   
  79.     double      rOut;                   //  PID Response (Output)   
  80.     double      rIn;                    //  PID Feedback (Input)   
  81.   
  82.     PIDInit ( &sPID );                  //  Initialize Structure   
  83.     sPID.Proportion = 0.5;              //  Set PID Coefficients   
  84.     sPID.Integral   = 0.5;   
  85.     sPID.Derivative = 0.0;   
  86.     sPID.SetPoint   = 100.0;            //  Set PID Setpoint   
  87.   
  88.     for (;;) {                          //  Mock Up of PID Processing   
  89.   
  90.         rIn = sensor ();                //  Read Input   
  91.         rOut = PIDCalc ( &sPID,rIn );   //  Perform PID Interation   
  92.         actuator ( rOut );              //  Effect Needed Changes   
  93.     }   
  94. }   

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4