视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
增量式PID控制C语言代码
2025-09-30 19:46:46 责编:小OO
文档
增量式PID控制C语言代码 

增量式PID控制公式:

上面△u(k)是控制量增量,“增量式PID”就是直接以这个增量进行控制。

至于参数的整定,根据响应的情况调,比如,响应慢了,我就增大kp,或者减小kd,超调大了,就减小kp或增大点kd,这个规律你可以看看PID三个参数的作用:)

////////////////////////////////////////////////////////////////

// 定义PID参数结构体

///////////////////////////////////////////////////////////////

typedef struct PID {              //结构体定义

        int  SetPoint            //设定值

        int  Proportion;         // Proportion 比例系数

        int  Integral;            // Integral   积分系数

        int  Derivative;          // Derivative  微分系数

        int  LastError;          // Error[-1]  前一拍误差

        int  PreError;           // Error[-2]  前两拍误差

} PID;

main()

{

  PID vPID;                        //定义结构变量名

PIDInit ( &vPID );                 //Initialize Structure

vPID.Proportion = 10;             //Set PID Coefficients   

  vPID.Integral   = 10;             // Set PID Integral

  vPID.Derivative = 10;             // Set PID Derivative

  vPID. SetPoint =                 //根据实际情况设定

  while(1)

{

       Verror=Measure();               //得到AD的输出值

       Error =vPID. SetPoint- Verror;   //与设定值比较,得到误差值

tempi=PIDCal(&vPID, Error;

       laser.Value+=tempi;          // Value与Num[2]为共同体,共同体名laser

LASERH=laser.Num[0];

LASERL=laser.Num[1];

  }

}

///////////////////////////////////////////////////////////////////////

//Title:PID参数初始化

//Description: Proportion="0"

//           Integral=0

//           LastError=0

//Input: PID的P、I控制常数和之前的误差量(PID *pp)

//Return: 

//////////////////////////////////////////////////////////////////////

void PIDInit (PID *pp)                     //PID参数初始化,都置0

   {                          

     memset ( pp,0,sizeof(PID));

//memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。

// memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,

//第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。

//其函数原型为: void *memset(void*,int,unsigned);

//头文件

   }

///////////////////////////////////////////////////////////////////////

//Title:增量式PID算法程序

//Description:给出一个误差增量

//Input: PID的P、I控制常数和之前的误差量(PID *pp)& 当前误差量(ThisError)

//Return: 误差增量templ

//////////////////////////////////////////////////////////////////////

int PIDCal( PID *pp, int ThisError ){

 //增量式PID算法(需要控制的不是控制量的绝对值,而是控制量的增量)

    int pError,dError,iError;

long templ;    

pError = ThisError-pp->LastError;

    iError = ThisError;

dError = ThisError-2*(pp->LastError)+pp->PreError;

    

//增量计算 

templ=pp->Proportion*pError + pp->Integral*iError+pp->Derivative*dError; //增量

    

    //存储误差用于下次运算

pp->PreError = pp->LastError;

pp->LastError = ThisError;

return ((int)(templ>>8));

}

参考自:http://blog.sina.com.cn/s/blog_408540af0100asu3.html 下载本文

显示全文
专题