PID的增量式与位置式

这篇具有很好参考价值的文章主要介绍了PID的增量式与位置式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在刚接触到PID控制器的时候,我对增量式,位置式这些其实也是很懵的,然后又有什么速度环啊,位置环啊,电流环啊…巴拉巴拉一堆的,但是现在理解起来其实也就利用一些简简单单的离散数据运算出期望罢了。

首先假设我们已经知道了什么是Kp、Ki、Kd了(不知道的话那就看看我上一篇讲PID的那个文章)。

关于PID的算法可以分为两大类,一类是位置式,还有一类是增量式,下面就开始说说我对这两种算法的理解。

位置式PID

首先是位置式,也是我用得最多的一种算法。位置式PID其实就是当前系统实际位置,与你期望想要达到的位置的偏差而进行的PID控制。那么一个用位置式的系统中是什么样的呢?

看公式来理解:

U k = K p ∗ e k + K i ∑ j = 0 k e k + K d ( e k − e k − 1 ) U_k= K_p*e_k+K_i\sum^k_{j=0}e_k+K_d(e_k-e_{k-1}) Uk=Kpek+Kij=0kek+Kd(ekek1)

由上式可以看出,PID的每次运算的输出都与过去的状态有关,并且积分项的误差会进行累加。如果偏差一直都是正的或者是负的,位置式PID在积分项就会一直累积,当偏差开始反向变化的时候,位置式PID需要一段时间才能从最大值减下来,会造成位置PID控制输出的滞后。所以我们还需要对积分项进行限幅(做一个最大值max和最小值min),同时也要对输出进行限幅。同时,我们输出的 U k U_k Uk对应的是执行机构的实际位置,一旦控制输出出错了,也就是说我们控制的对象当前的状态值出现了问题, U k U_k Uk的大幅度变化就会影响到系统的大幅度变化。

所以我们如果单单使用位置式PID的时候,一般都是直接使用PD控制的,也正因为这样,位置式PID是用于执行机构不带积分部件的对象,像平衡车的直立控制呀、温控系统呀…等等。

下面是代码实现:

#define HAVE_PID_INTEGRAL

#define LIMIT(TargetValue, LimitValue) \
if (TargetValue > LimitValue)\
{\
  TargetValue = LimitValue;\
}\
else if (TargetValue < -LimitValue)\
{\
  TargetValue = -LimitValue;\
}\

typedef struct{
  float Kp;
  float Ki;
  float Kd;
#ifdef HAVE_PID_INTEGRAL
  int index;            // 积分分离系数
  float Integral;       // 积分项
  float I_outputMax;    // 积分限幅
#endif
  float Last_Err;       // 上次误差
  float Output;         // PID输出
  float OutputMax;      // 位置式PID输出限幅
}Position_PID;

void PositionPID_Calculate(Position_PID *pid,const float Target,const float Measure)
{

  if(pid == NULL)
    return;
    
  float Err;
  
  Err = Target - Measure;
  
  pid->Output = pid->Kp * Err + pid->Kd * (Err - pid->Last_Err)
  
#ifdef HAVE_PID_INTEGRAL
    /* 积分分离 */
  if(abs(pid->Err) > Integraldead_zone)
  {
    pid->index=0;
  }else
  {
    pid->index = 1;
  }
  pid->Integral += pid->Ki * Err * pid->index;
  
  LIMIT(pid->Integral,I_outputMax);
  
  pid->Output += pid->Integral;
#endif
  
  LIMIT(Output,OutputMax);
  
  pid->Last_Err = Err;
  
}

优点:

位置式是一种非递推式算法,可以直接控制对象,U(k)的值与对象的实际当量是一一对应的,所以在不带积分部件的控制对象中可以很好应用。

缺点:文章来源地址https://www.toymoban.com/news/detail-849926.html

每次输出都与之前的状态有关,并且还要对误差值err进行累加,计算量大。

增量式PID

那么什么是增量式PID呢?增量式PID的输出只是控制量的增量 Δ U k \Delta U_k ΔUk。当执行机构需要的控制量是增量,那么我们就可以采用增量式PID控制算法进行控制。(增量式PID的计算输出结果是增量,并不是直接作用到执行机构)

(增量式PID可以由位置式推导出,感兴趣的可以百度,这里就不浪费篇幅了。)

看公式来理解:

Δ U k = K p ( e ( k ) − e ( k − 1 ) ) + K i e ( k ) + K D [ e ( k ) − 2 e ( k − 1 ) + e ( k − 2 ) ] \Delta U_k=K_p(e(k)-e(k-1))+K_i{e(k)}+K_D[e(k)-2e(k-1)+e(k-2)] ΔUk=Kp(e(k)e(k1))+Kie(k)+KD[e(k)2e(k1)+e(k2)]

对于增量式PID来说,给定一个输入量,系统反馈回来的量与设定的量的偏差为Err,系统中保存上一次的偏差Last_Err和上上次的偏差Previous_Err,这三个输入量经过增量式PID可以计算得到上述说的控制量增量 Δ U k \Delta U_k ΔUk。而得出的控制量 Δ U ( k ) \Delta U(k) ΔU(k)对应的是近几次位置误差的增量,而不是对应与实际位置的偏差,也就是说没有误差累加。即在上一次的控制量的基础上需要增加控制量。

以下是代码实现:

#define LIMIT(TargetValue, LimitValue) \
if (TargetValue > LimitValue)\
{\
  TargetValue = LimitValue;\
}\
else if (TargetValue < -LimitValue)\
{\
  TargetValue = -LimitValue;\
}\

#define Integraldead_zone 100 // 积分死区 根据自己的需求定义
typedef struct{
  float Kp;
  float Ki;
  float Kd;
  float p_out;
  float i_out;
  float d_out;
  float Err;
  float Last_Err;       // 上次误差
  float Previous_Err;   // 上上次误差
  float Output;
  float OutputMax;      // 增量式式PID输出限幅
}Incremental_PID;

void IncrementalPID_Calculate(Incremental_PID *pid,const float Target,const float Measure)
{ 
  if(pid == NULL)
    return;
    
  pid->Err = Target - Measure;
  
  pid->p_out = pid->Kp * (Err - Last_Err);
  pid->i_out = pid->Ki * Err;
  pid->d_out = pid->Kd * (Err - 2.0f*Last_Err + Previous_Err);
  
  pid->Output += p_out + i_out + d_out; 
  
  LIMIT(pid->Output, pid->OutputMax); // 限幅
  
  pid->Previous_Err = pid->Last_Err;
  pid->Last_Err = Err;
  
}

优点:

  1. 系统在误动作时影响小,并且可以利用逻辑判断来对错误数据进行去除。
  2. 冲激小,便于实现无扰动切换。
  3. 不需要累加误差值,并且控制增量的确定只与最近几次采样值有关。

缺点:

  1. 积分的阶段效应大,有稳态误差。
  2. 溢出的影响大,有的被控对象用增量式不好。

总结(增量式与位置式的区别)

  1. 增量式算法不需要做累加,增量式PID求出来的是系统需要的增量,并且增量的确定仅与最近几次偏差采样值有关,计算的误差对控制量计算的影响比较小。与位置式相比的话,位置式就需要用到偏差的累加值(Ki*err),容易产生累计误差。
  2. 增量式PID控制输出的是控制量增量,没有积分作用,所以该方法适用于带积分部件的对象。而位置式PID适用于执行机构不带积分部件的对象。
  3. 上面的代码也很清楚的显示了,位置式PID需要积分限幅和输出限幅,而增量式PID只需要输出限幅。

到了这里,关于PID的增量式与位置式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 位置式Pid和增量式Pid的定义及应用

    PID算法是一个典型的闭环控制系统。P、I、D,比例、积分、微分。 开环:输入量对输出量没有反馈作用; 闭环:输入量对输出量有反馈作用。 位置式Pid 位置式Pid就是位置闭环控制,位置闭环控制就是根据编码器的脉冲累加,测量电机的位置信息,并与目标值进行比较得到一

    2024年02月05日
    浏览(43)
  • PID控制器(位置式和增量式)

    PID控制:一种调节器控制规律为比例、积分、微分的控制。其中:P:比例(proportion)I:积分(integral)D:微分(derivative) 式子中Kp为比例系数,Ti为积分时间参数,Td为微分时间常数。 各参数的意义: Kp:比例系数。一般增大比例系数,将加快系数的响应。 Ti:积分时间常

    2024年02月16日
    浏览(50)
  • 用纯C语言分别实现增量式与位置式的PID自整定算法

    1、对于增量式PID自整定算法,C语言代码如下: 2、位置式PID控制是一种常用的控制方法,可以实现给定值与实际值之间的闭环控制。下面是使用C语言编写的一个位置式PID自整定算法的代码,包含详细的注释: 这个代码实现了一个位置式PID自整定算法,它包括了两个函数 pr

    2024年02月15日
    浏览(35)
  • 【PID】基于Matlab实现增量式PID算法

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 增量式PID控制较常规PID更具优势,但有关其参数整定的方法很少,针对这种问题,介绍了增量式PID算法的原理及特点,基于MATLAB平台

    2024年02月14日
    浏览(42)
  • 博途PLC增量式PID和脉冲轴组合控制阀门开度(算法介绍)

    这篇博客我们以S7-1200PLC平台来举例,介绍我们的PID闭环控制器如何控制脉冲轴实现阀门角度控制。SMART PLC PID控制器控制伺服驱动器实现关节角度控制详细内容请参考下面文章: https://rxxw-control.blog.csdn.net/article/details/129658364 https://rxxw-control.blog.csdn.net/article/details/129658364 增量

    2024年01月21日
    浏览(86)
  • STM32之增量式编码器电机测速

    编码器,是一种用来测量机械旋转或位移的传感器。它能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系列电信号。 . 按监测原理分类 光电编码器 光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器

    2024年02月13日
    浏览(39)
  • STM32CubeMX 直流电机串级PID位置速度控制、HAL库、cubemx、PID、串级PID、位置控制、速度控制、双环控制

    提示:本文章的串级PID位置速度控制,是在前两篇文章速度控制,位置控制的基础上实现的,这一章节中不需要额外的cubemx的配置,只需要写简单的代码即可,复杂的地方在于串级pid的调试过程。 pid是我们在学习单片机中首先要学会的控制算法,而串级pid又是在单pid的基础上

    2024年02月14日
    浏览(53)
  • 霍尔增量式编码器左右车轮线速度的计算

    对于霍尔式编码器的左右轮线速度计算: 首先线速度=距离s / 时间 t 要获得距离S ,也就是轮子在一段时间内跑过的距离。要先知道一下两个参数: 1.轮子的半径 r 2.轮子转动一圈的脉冲数 cnt 轮子转动一圈的脉冲数:如电机我们选用减速比为1:90的TT直流减速电机,编码器为

    2024年02月15日
    浏览(41)
  • 《LIO-SAM阅读笔记》-为何要引入增量式里程计?

    前言: LIO-SAM在后端中同时维护着两个里程计,一个是增量式里程计,一个是优化后的里程计,其中优化后的里程计是经过imu、回环、gps因子图联合优化后的结果,是整个系统中最准确的位姿估计,那么为什么还需要维护增量式里程计呢? 以下是我的理解 ,不一定正确,如有

    2024年01月22日
    浏览(46)
  • 4 OpenCV实现多目三维重建(多张图片增量式生成稀疏点云)【附源码】

    本文是基于 OpenCV4.80 进行的,关于环境的配置可能之后会单独说,先提一嘴 vcpkg 真好用 从多张图片逐步生成稀疏点云,这个过程通常包括以下步骤: 初始重建: 初始两张图片的选择 十分重要 ,这是整个流程的基础,后续的增图都是在这两张图片的基础上进行的 对于输入图

    2024年02月06日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包