打印
[文档]

PID控制算法

[复制链接]
332|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alvpeg|  楼主 | 2024-9-16 17:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

 

#define DEAD_BAND 50//死区控制值   
#define PID_OUT_MAX 200 //PID输出上限
#define PID_OUT_MAX 200 //PID输出上限

#include "math.h"           
//PID结构体
typedef struct
{
   volatile float    Proportion;             // 比例常数 Proportional Const
   volatile float    Integral;               // 积分常数 Integral Const
   volatile float    Derivative;             // 微分常数 Derivative Const
   volatile int      Error1;                 // Error[n-1]
   volatile int      Error2;                 // Error[n-2]
   volatile int      iError;                 // Error[n]
   volatile  int     Error_sum;
} PID

/****************************************************************************************/                                                        //                位置式PID
//                    //pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]  
/****************************************************************************************/
float PID_Postion (float set_point,,float now_point,PID* sptr)
{
  float  iIncpid=0;
  sptr->iError=now_point-set_point; // 计算当前误差
  //死区控制算法                                    
  if(fabs(sptr->iError)>DEAD_BAND)
  {
  sptr->Error_sum+=sptr->iError;//积分项      
  iIncpid=sptr->Proportion * sptr->iError                  // P
         +sptr->Integral * sptr->Error_sum                // I
         +sptr->Derivative * (sptr->iError-sptr->Error1); // D
  sptr->Error1=sptr->iError ;          // 存储误差,用于下次计算

  }  
  else
  {
    iIncpid=0;
    //sptr->Error_sum+=sptr->iError;//积分项   
    sptr->Error1=sptr->iError;  // 存储误差,用于下次计算
  }  
  
    return(iIncpid);          // 返回计算值                  
}

/****************************************************************************************/                                    //增量式PID                                            
//        pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]                                      //
/****************************************************************************************/
float PID_increase(int iError,PID* sptr)
{
  
  float  iIncpid=0;
  sptr->iError=iError;//直接检测当前偏差
  if(fabs(sptr->iError)>DEAD_BAND)
  {
  iIncpid=sptr->Proportion * (sptr->iError-sptr->Error1)                  // P
         +sptr->Integral * sptr->iError                                   // I
         +sptr->Derivative * (sptr->iError-2*sptr->Error1+sptr->Error2);  // D            
  sptr->Error2=sptr->Error1;                          // 存储误差,用于下次计算
  sptr->Error1=sptr->iError;

}
else
{
  iIncpid=0;//输出增量值为0
  sptr->Error2=sptr->Error1; // 存储误差,用于下次计算                       
    sptr->Error1=sptr->iError;
}
  return(iIncpid);   // 返回增量值  
}


使用特权

评论回复
沙发
yangjiaxu| | 2024-9-24 16:18 | 只看该作者
感觉做PID就数学一定要好一些,而且PID应用确实很广泛,电机和调节的时候确实用PID就很不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

1470

帖子

0

粉丝