电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

增量式PID控制C语言代码

<p><strong>增量式PID控制C语言代码</strong> ** **</p>
<p><strong>增量式PID控制公式:</strong></p>
<p><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=408540af0100b17n&url=http://static1.photo.sina.com.cn/orignal/408540af458bc64b05b60"></a><img src="http://space.ednchina.com/Upload/2009/5/8/0ad7f76e-e688-4fab-836a-b9c3135faec0.jpg" /></p>
<p> </p>
<p>上面△u(k)是控制量增量,“增量式PID”就是直接以这个增量进行控制。</p>
<p>至于参数的整定,根据响应的情况调,比如,响应慢了,我就增大kp,或者减小kd,超调大了,就减小kp或增大点kd,这个规律你可以看看PID三个参数的作用:)</p>
<p> </p>
<p>////////////////////////////////////////////////////////////////</p>
<p>// 定义PID参数结构体</p>
<p>///////////////////////////////////////////////////////////////</p>
<p>typedef struct PID {              //结构体定义</p>
<p>        int  SetPoint            //设定值</p>
<p>        int  Proportion;         // Proportion 比例系数</p>
<p>        int  Integral;            // Integral   积分系数</p>
<p>        int  Derivative;          // Derivative  微分系数</p>
<p>        int  LastError;          // Error[-1]  前一拍误差</p>
<p>        int  PreError;           // Error[-2]  前两拍误差</p>
<p>} PID;</p>
<p> </p>
<p>main()</p>
<p>{</p>
<p>  PID vPID;                        //定义结构变量名</p>
<p>PIDInit ( &vPID );                 //Initialize Structure</p>
<p>vPID.Proportion = 10;             //Set PID Coefficients  </p>
<p>  vPID.Integral   = 10;             // Set PID Integral</p>
<p>  vPID.Derivative = 10;             // Set PID Derivative</p>
<p>  vPID. SetPoint =                 //根据实际情况设定</p>
<p> </p>
<p>  while(1)</p>
<p>{</p>
<p>       Verror=Measure();               //得到AD的输出值</p>
<p>       Error =vPID. SetPoint- Verror;   //与设定值比较,得到误差值</p>
<p>tempi=PIDCal(&vPID, Error;</p>
<p>       laser.Value+=tempi;          // Value与Num[2]为共同体,共同体名laser</p>
<p>LASERH=laser.Num[0];</p>
<p>LASERL=laser.Num[1];</p>
<p>  }</p>
<p>}</p>
<p> </p>
<p>///////////////////////////////////////////////////////////////////////</p>
<p>//Title:PID参数初始化</p>
<p>//Description: Proportion="0"</p>
<p>//           Integral=0</p>
<p>//           LastError=0</p>
<p>//Input: PID的P、I控制常数和之前的误差量(PID pp)</p>
<p>//Return:</p>
<p>//////////////////////////////////////////////////////////////////////</p>
<p>void PIDInit (PID pp)                     //PID参数初始化,都置0</p>
<p>   {                                           </p>
<p>     memset ( pp,0,sizeof(PID));</p>
<p> </p>
<p>//memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。</p>
<p>// memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,</p>
<p>//第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。</p>
<p>//其函数原型为: void memset(void,int,unsigned);</p>
<p>//头文件<string.h></p>
<p>   }</p>
<p> </p>
<p>///////////////////////////////////////////////////////////////////////</p>
<p>//Title:增量式PID算法程序</p>
<p>//Description:给出一个误差增量</p>
<p>//Input: PID的P、I控制常数和之前的误差量(PID pp)& 当前误差量(ThisError)</p>
<p>//Return: 误差增量templ</p>
<p>//////////////////////////////////////////////////////////////////////</p>
<p>int PIDCal( PID pp, int ThisError ){</p>
<p> //增量式PID算法(需要控制的不是控制量的绝对值,而是控制量的增量)</p>
<p>    int pError,dError,iError;</p>
<p>long templ;</p>
<p>    pError = ThisError-pp->LastError;</p>
<p>    iError = ThisError;</p>
<p>    dError = ThisError-2
(pp->LastError)+pp->PreError;</p>
<p>   </p>
<p>//增量计算</p>
<p>    templ=pp->Proportion
pError + pp->Integral
iError+pp->Derivative
dError;  //增量</p>
<p>   </p>
<p>    //存储误差用于下次运算</p>
<p>    pp->PreError  = pp->LastError;</p>
<p>    pp->LastError = ThisError;</p>
<p> </p>
<p>    return ((int)(templ>>8));</p>
<p>}</p>
<p> </p>
<p>参考自:</p>

博主
tengjingshu@126.com
在路上
   路漫漫其修远兮,吾将上下而求索   工程师健康:http://group.ednchina.com/2693/ <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;
点击跳转