您的位置 首页 发布

PID公式的推导进程及完成代码

一、PID框图:n0(t)是要稳定的值n(t)是当前输出值e(t)=n0(t)-n(t)一、模拟PID控制原理这个公式网络上很好找:二、数字PID控制由于

一、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
longSumError; //差错累计

double Proportion; //份额常数 Proportional Cons
double Integral; //积分常数 Integral Const
double Derivative; //微分常数 Derivative Const
int LastError; //Error[-1]
int PrevError; //Error[-2]
} PID;

/*******************************************************************************
* 函数称号 : IncPIDCalc
* 函数描绘 : 增量式 PID 操控核算
* 函数输入 : int 当时方位
* 函数输出 : 无
*函数回来 : 增量式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);
}

/*******************************************************************************
* 函数称号 : LocPIDCalc
* 函数描绘 : 方位式 PID 操控核算
* 函数输入 : int 当时方位
* 函数输出 : 无
*函数回来 : 方位式PID成果
*******************************************************************************/
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); //微分项
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/317726.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部