PID算法(zt)

/*====================================================================================================
   这是从网上找来的一个比较典型的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
   }
  }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值