原创 标准的PID处理例程 (转贴)

2008-4-13 22:34 992 1 1 分类: 工业电子
标准的PID处理例程
   --- 工业控制中常用算法 ---
  
  /*====================================================================================================
  这是从网上找来的一个比较典型的PID处理程序,在使用单片机作为控制cpu时,请稍作简化,具体的PID
  参数必须由具体对象通过实验确定。由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,
  而将所有参数全部用整数,运算到最后再除以一个2N次方数据(相当于移位),作类似定点数运算,可
  大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的余数,做好余
  数补偿。这个程序只是一般常用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条评论)

登录后参与讨论
相关推荐阅读
208servo_586623692 2013-11-17 16:56
基于Matlab的IIR数字滤波器设计方法比较及应用
  0 引言   数字滤波器(Digital Filter)是指输入、输出都是离散时间信号,通过一定运算关系改变输入信号所含频率成分的相对比例或者滤除某些频率成分的器件。数字滤波器在数字信号处理中起着...
208servo_586623692 2012-06-09 08:04
评论:@信号链杂谈's Blog 博客中提到的“信号链基础知识# 63:利用 SPICE 设计 TEC 温度环路 ...”
TEC温度环路PID控制...
208servo_586623692 2011-02-01 23:17
用DSP实现增量式光电编码器的细分
用DSP实现增量式光电编码器的细分 技术分类: 微处理器与DSP  | 2011-01-04 21ic   1 引言   目前,各类伺服驱动器及其应用中广泛采用光栅装置作为速度测量、位置测量的敏感元...
208servo_586623692 2011-02-01 23:16
基于MSP430F149单片机的光电编码器位置检测系统设计
基于MSP430F149单片机的光电编码器位置检测系统设计 技术分类: 测试与测量  | 2011-01-31 微计算机信息 李红果   在实际的工业位置控制领域中,为了提高控制精度,准确地对控制对...
208servo_586623692 2011-02-01 23:11
业界首款可直接安装在电机上的定制化电机控制模块
业界首款可直接安装在电机上的定制化电机控制模块 技术分类: 工业电子  | 2010-12-03 : EDN China    智能功率器件及解决方案供应商意法半导体发布业界首款整合工业级以太网接口...
208servo_586623692 2011-02-01 23:05
MEMS惯性传感器优势解析THELMA制程和低成本封装方法
MEMS惯性传感器优势解析:THELMA制程和低成本封装方法 技术分类: 模拟设计  | 2010-11-29 意法半导体 Benedetto Vigna   意法半导体公司推出一系列惯性传感器,极...
我要评论
0
1
1
2
3
4
5
6
7
8
9
0
关闭 热点推荐上一条 /4 下一条