PID公式的推导过程及实现代码
2017-07-31 14:45
375 查看
一、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;
/*******************************************************************************
* 函数名称 : 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); //微分项
}
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;
/*******************************************************************************
* 函数名称 : 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); //微分项
}
相关文章推荐
- 不同平面直角坐标系之间的转换公式的推导及C#代码实现
- 拟牛顿法公式推导以及python代码实现(二)-BFGS家族
- 拟牛顿法公式推导以及python代码实现(一)
- ab压力测试代码及实现过程
- Word2vec 原理公式推到和代码实现
- 核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程
- 基于Android的ELF PLT/GOT符号和重定向过程ELF Hook实现(by 低端农业代码 2014.10.27)
- SVM原理介绍与Python实现(二):SVM的推导过程
- 【智能车新手入门】-位置式、增量式PID实现代码
- openwrt 问题二 js 通过nginx 服务器调用 lua代码的过程实现
- 纯代码无图片Tips实现过程
- 最小二乘法拟合直线公式推导及vc实现[转]
- 关于感知学习模型机中空间任一点到超平面的距离公式的推导过程
- 关于感知学习模型机中空间任一点到超平面的距离公式的推导过程
- PHP调用MySQL的存储过程的实现代码
- QuickSort最优实现过程代码(java)
- 统计C#项目有效代码行数的实现过程
- 反向传播算法(过程及公式推导)
- Coursera deeplearning.ai 深度学习笔记1-3-Shallow Neural Networks-浅层神经网络原理推导与代码实现
- RSA算法趣解及C实现(代码,实例,验证过程)