专栏中心

EEPW首页 > 专栏 > 增量式PID控制C语言代码

增量式PID控制C语言代码

发布人:mayer 时间:2009-09-01 来源:工程师 发布文章

增量式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);

//头文件<string.h>

   }

 

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

//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));

}

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

艾睿电子推进新一代汽车电子电气架构升级与创新

【MWC 2026 预热】洞察消费科技趋势,抢先把握行业先机

Axcelis 推出 Purion H6 高束流离子注入机

国际视野 2026-02-11

安森美公布2025年第四季度及全年业绩

国际视野 2026-02-11

英飞凌收购艾迈斯欧司朗混合信号传感器产品线

模拟技术 2026-02-11

煤矿行业专用DC宽压输入电源——URF24_LD-30WR3C系列

强强联合锻造\"芯\"力量:图灵进化与国家集成电路创新中心达成战略合作,共推AI算力芯片自主创新与产业化

2026-02-11

EasyARM2200开发套件功能介绍

PIC10F32X和PIC16F150X系列集成的数控振荡器

贸泽推出电机控制资源中心 助力工程师打造出色的电子设计

互补波形发生器的基本操作

Arasan 推出业界首款双模 xSPI/eMMC PHY IP

网络与存储 2026-02-11

如何使用Microchip MAPS选择适合你的PIC® MCU

EasyARM2131 选型指南

资源下载 2007-03-30

全国产化铂金+CRPS服务器专用电源——350-800W

EasyARM2131开发套件功能介绍

PIC10F32X和PIC16F150X系列的可配置逻辑单元

面向超精准应用的匹配电阻器网络

视频 2012-06-27
更多 培训课堂
更多 焦点
更多 视频

技术专区