原创 增量式PID控制C语言代码

2009-8-28 13:22 2991 3 4 分类: MCU/ 嵌入式

增量式PID控制C语言代码 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


增量式PID控制公式:


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />0ad7f76e-e688-4fab-836a-b9c3135faec0.jpg


 


上面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;          // ValueNum[2]为共同体,共同体名laser


LASERH=laser.Num[0];


LASERL=laser.Num[1];


  }


}


 


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


//Title:PID参数初始化


//Description: Proportion="0"


//           Integral=0


//           LastError=0


//Input: PIDPI控制常数和之前的误差量(PID *pp


//Return:


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


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


   {                                           


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


 


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


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


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


//其函数原型为: void *memset(void*intunsigned)


//头文件<string.h>


   }


 


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


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


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


//Input: PIDPI控制常数和之前的误差量(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

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

xucun915_925777961 2009-9-11 14:31

学习一下
相关推荐阅读
用户1417329 2009-10-27 10:58
浮地是什么意思?浮地和接地问题解答集(转载)
“地”是电子技术中一个很重要的概念。由于“地”的分类与作用有多种,容易混淆,故总结一下“地”的概念。“接地”有设备内部的信号接地和设备接大地,两者概念不同,目的也不同。“地”的经典定义是“作为电路或系...
用户1417329 2009-10-21 21:15
51单片机PID算法程序(一)PID算法
51单片机PID算法程序(一)PID算法(转载自blog.ednchina.com/tengjingshu )<?xml:namespace prefix = o ns = "urn:schem...
用户1417329 2009-10-21 21:10
电磁兼容中的接地详细分析
转载自http://www.eetrend.com/blog/100018988 作者 陶显芳首先我们应该弄清楚“地”的概念。很多人都把电子线路中电源的负极或正极当成“地”,在很多电子书籍中也都是这么...
用户1417329 2009-10-08 12:32
zz模块地线策略
转载自http://blog.ednchina.com/yulzhu/269796/message.aspx在设计模块的时候,通常会遇到地线策略的问题,这通常又与EMC有关,一般的来说,地线是信号电流...
用户1417329 2009-09-11 14:38
上拉电阻下拉电阻总结( 转载)
上拉电阻:1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。2、OC门电路必须加...
用户1417329 2009-09-10 14:39
RS485 APPLICATION NOTE
 非常经典,转个链接http://hotpower.21ic.org/user1/48/archives/2006/9466.html...
EE直播间
更多
我要评论
1
3
关闭 站长推荐上一条 /3 下一条