加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

PID公式的推导过程及实现代码

(2016-04-13 11:52:19)
标签:

pid

c语言实现

分类: 电子知识
一、PID框图:



n0(t)是要稳定的值
n(t)是当前输出值
e(t) = n0(t) - n(t)


一、模拟PID控制原理
 
这个公式网络上很好找:

 二、数字PID控制
由于模拟的微积分运算对应计算机来说是不太好写代码的,所以要利用采样将数据离散化

于是公式就可以转换为:



 其中T为采样时间,由于T之类的参数是常量,所以将Kp乘入公式中可以转换成另一种写法
这个公式叫位置式算法

由于要不断的累加ej,增加了计算量,所以这个公式又可以转换为增量式算法:


然后u(k) = u(k-1) + u

三、参数的整定
先将Ti设置为无穷大,Td设置为0,调节Kp
然后再调节Ti,最后是Td

四、实现代码

typedef struct PID
{
    int  SetPoint;     //设定目标 Desired Value
    long SumError;                //误差累计
    double  Proportion;         //比例常数 Proportional Cons
    double  Integral;           //积分常数 Integral Const
    double  Derivative;         //微分常数 Derivative Const
    int LastError;               //Error[-1]
    int PrevError;               //Error[-2]
} PID;

int IncPIDCalc(int NextPoint)
{
    int iError, iIncpid;
    //当前误差
    iError = sptr->SetPoint - NextPoint;
    //增量计算
    iIncpid = sptr->Proportion * iError               //E[k]项
              - sptr->Integral   * sptr->LastError     //E[k-1]项
              + sptr->Derivative * sptr->PrevError;   //E[k-2]项
    //存储误差,用于下次计算
    sptr->PrevError = sptr->LastError;
    sptr->LastError = iError;
    //返回增量值
    return(iIncpid);
}
int LocPIDCalc(int NextPoint)
{
    int  iError,dError;
    iError = sptr->SetPoint - NextPoint;       //偏差
    sptr->SumError += iError;       //积分
    dError = iError - sptr->LastError;     //微分
    sptr->LastError = iError;
    return(sptr->Proportion * iError            //比例项
           + sptr->Integral * sptr->SumError   //积分项
           + sptr->Derivative * dError);        //微分项
}
 





0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有