打印
[技术问答]

什么是PID算法,增量式PID又是什么?

[复制链接]
1077|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jonas222|  楼主 | 2024-7-29 07:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、什么是增量式PID?

先看一下增量式PID的离散公式如下:

:比例系数 :积分系数 :微分系数 :偏差

对于所谓的位置式,增量式的算法,这两者只是在算法的实现上的存在差异,本质的控制上对于系统控制的影响还是相同,单纯从输入和输出的角度来比较,具体如下表所示;

这里简单的说明一下;

  • 位置式:位置式算法较为简单,直接输入当前的偏差 ,即可得到输出;
  • 增量式:增量式算法需要保存历史偏差,,即在第次控制周期时,需要使用第和第次控制所输入的偏差,最终计算得到 ,此时,这还不是我们所需要的PID输出量;所以需要进行累加;

不难发现第一次控制周期时,即时;

由以上公式我们可以推导出下式:

所以可以看出,最终PID的输出量,满足以下公式:

可见增量式算法,就是所计算出的PID增量的历史累加和:

2、举个例子2.1 位置式PID

下面从一个简单的例子中去理解一下增量式PID,这里依然举一个不是很恰当的例子;如果是位置式PID算法的话:

  • 隆哥对一个直流电机进行调速,设定了转速为 1000;
  • 这时由于反馈回来的速度和设定的速度偏差为 ;
  • 经过位置式PID计算得到;
  • 作为Process的输入值(可以是PWM的占空比),最终Process输出相应的PWM驱动直流电机;
  • 反馈装置检测到电机转速,然后重复以上步骤;

整体框图如下所示:

2.2 增量式PID

对于增量式PID来说;

  • 隆哥对一个直流电机进行调速,设定了转速为 1000;
  • 这时由于反馈回来的速度和设定的速度偏差为 ,系统中保存上一次的偏差和上上次的偏差,这三个输入量经过增量PID计算得到;
  • 系统中还保存了上一次的PID输出的,所以加上增量,就是本次控制周期的PID输出——;
  • 作为Process的输入值(可以是PWM的占空比),最终Process输出相应的PWM驱动直流电机;
  • 反馈装置检测到电机转速,然后重复以上步骤;

整体框图如下所示:

所以这里不难发现,所谓增量式PID,它的特点有:

  • 需要输入历史的偏差值;
  • 计算得到的是PID输出增量,因此每一次需要累加历史增量最为当前的PID输出;

下面简单介绍一下如何实现增量式PID算法;

3、伪算法previous02_error:=0//上上次偏差previous01_error:=0//上一次偏差integral:=0//积分和pid_out:=0//pid增量累加和//循环//采样周期为dtloop://setpoint设定值//measured_value反馈值error:=setpoint−measured_value//计算得到偏差proportion:=error-previous01_error//计算得到比例输出integral:=error×dt//计算得到积分累加和derivative:=(error−2*previous01_error+previous02_error)/dt//计算得到微分pid_delta:=Kp×error+Ki×integral+Kd×derivative//计算得到PID增量pid_out:=pid_out+pid_delta//计算得到PID输出//保存当前的偏差和上一次偏差作为下一次采样所需要的历史偏差previous02_error:=previous01_errorprevious01_error:=error//保存当前偏差为下一次采样时所需要的历史偏差wait(dt)//等待下一次采用gotoloop4、C语言实现

这里直接使用了TI公司的PID算法,做了积分抗饱和;具体可以参考controlSUITElibsapp_libsmotor_controlmath_blocksv4.2pid_grando.h

具体代码如下所示:

pid_grando.h

/*=================================================================================Filename:PID_GRANDO.H===================================================================================*/#ifndef__PID_H__#define__PID_H__typedefstruct{_iqRef;//Input:referenceset-point_iqFbk;//Input:feedback_iqOut;//Output:controlleroutput_iqc1;//Internal:derivativefiltercoefficient1_iqc2;//Internal:derivativefiltercoefficient2}PID_TERMINALS;//note:c1&c2placedheretokeepstructuresizeunder8wordstypedefstruct{_iqKr;//Parameter:referenceset-pointweighting_iqKp;//Parameter:proportionalloopgain_iqKi;//Parameter:integralgain_iqKd;//Parameter:derivativegain_iqKm;//Parameter:derivativeweighting_iqUmax;//Parameter:uppersaturationlimit_iqUmin;//Parameter:lowersaturationlimit}PID_PARAMETERS;typedefstruct{_iqup;//Data:proportionalterm_iqui;//Data:integralterm_iqud;//Data:derivativeterm_iqv1;//Data:pre-saturatedcontrolleroutput_iqi1;//Data:integratorstorage:ui(k-1)_iqd1;//Data:differentiatorstorage:ud(k-1)_iqd2;//Data:differentiatorstorage:d2(k-1)_iqw1;//Data:saturationrecord:[u(k-1)-v(k-1)]}PID_DATA;typedefstruct{PID_TERMINALSterm;PID_PARAMETERSparam;PID_DATAdata;}PID_CONTROLLER;/*-----------------------------------------------------------------------------DefaultinitalisationvaluesforthePIDobjects-----------------------------------------------------------------------------*/#definePID_TERM_DEFAULTS{0,0,0,0,0}#definePID_PARAM_DEFAULTS{      _IQ(1.0),_IQ(1.0),_IQ(0.0),_IQ(0.0),_IQ(1.0),_IQ(1.0),_IQ(-1.0)}#definePID_DATA_DEFAULTS{   _IQ(0.0),_IQ(0.0),_IQ(0.0),_IQ(0.0),_IQ(0.0),_IQ(0.0),_IQ(0.0),_IQ(1.0)}/*------------------------------------------------------------------------------PIDMacroDefinition------------------------------------------------------------------------------*/#definePID_MACRO(v)            /*proportionalterm*/   v.data.up=_IQmpy(v.param.Kr,v.term.Ref)-v.term.Fbk;               /*integralterm*/      v.data.ui=_IQmpy(v.param.Ki,_IQmpy(v.data.w1, (v.term.Ref-v.term.Fbk)))+v.data.i1;      v.data.i1=v.data.ui;          /*derivativeterm*/    v.data.d2=_IQmpy(v.param.Kd,_IQmpy(v.term.c1,(_IQmpy(v.term.Ref,v.param.Km)-v.term.Fbk)))-v.data.d2;      v.data.ud=v.data.d2+v.data.d1;          v.data.d1=_IQmpy(v.data.ud,v.term.c2);           /*controloutput*/     v.data.v1=_IQmpy(v.param.Kp,(v.data.up+v.data.ui+v.data.ud));v.term.Out=_IQsat(v.data.v1,v.param.Umax,v.param.Umin);v.data.w1=(v.term.Out==v.data.v1)?_IQ(1.0):_IQ(0.0);#endif//__PID_H__

example

/*InstancethePIDmodule*/PIDpid1={PID_TERM_DEFAULTS,PID_PARAM_DEFAULTS,PID_DATA_DEFAULTS};main(){pid1.param.Kp=_IQ(0.5);pid1.param.Ki=_IQ(0.005);pid1.param.Kd=_IQ(0);pid1.param.Kr=_IQ(1.0);pid1.param.Km=_IQ(1.0);pid1.param.Umax=_IQ(1.0);pid1.param.Umin=_IQ(-1.0);}voidinterruptperiodic_interrupt_isr(){pid1.Ref=input1_1;//Pass_iqinputstopid1pid1.Fbk=input1_2;//Pass_iqinputstopid1PID_MACRO(pid1);//Callcomputemacroforpid1output1=pid1.Out;//Accesstheoutputofpid1}5、总结

简单总结了位置式PID算法和增量式PID算法的差异,参考了TI公司的增量式PID算法实现,对于不同的控制对象可以根据系统要求选择合适的PID算法。


使用特权

评论回复
沙发
macpherson| | 2024-8-5 10:06 | 只看该作者
PID算法是一种广泛应用于工业控制系统中的反馈控制算法,它的名称来源于其所包含的三个主要组成部分:比例(Proportional)、积分(Integral)和微分(Derivative)。PID控制器通过这三个组件的组合来调节一个系统的输出,以达到期望的设定点或参考值。

使用特权

评论回复
板凳
wilhelmina2| | 2024-8-5 11:21 | 只看该作者
增量式PID在系统发生问题时,不会严重影响系统的工作,而位置式PID的输出直接对应对象的输出,因此对系统影响较大

使用特权

评论回复
地板
51xlf| | 2024-8-5 14:33 | 只看该作者
增量式PID控制算法是指其输出只是被控制量的增量。这种算法通过计算前后两次采样时刻的控制量之差来得到新的控制量,适用于执行机构需要控制量增量而不是位置量绝对值的情况

使用特权

评论回复
5
pixhw| | 2024-8-5 15:29 | 只看该作者
相比位置式PID算法,增量式PID算法仅依赖于近期的偏差数据,计算量更小,更容易实现。由于每次只输出控制量的增量,因此它对系统的冲击较小,控制更为平稳,适用于需要精细调节的场合。

使用特权

评论回复
6
loutin| | 2024-8-5 17:03 | 只看该作者
增量式PID的优点包括:

不需要累加误差,减少了计算量。
对于计算机实现更为方便,因为只需要存储几个误差值。
由于输出的是增量,因此对系统的扰动较小,有利于系统的稳定。

使用特权

评论回复
7
robertesth| | 2024-8-5 18:55 | 只看该作者
增量式PID不需要存储积分项的累积值,只需要最近几次的误差值,因此更容易实现。

使用特权

评论回复
8
maudlu| | 2024-8-5 20:43 | 只看该作者
比例项(P)‌:负责系统的即时响应,它根据当前误差的大小来调整控制输出。比例增益决定了比例项对误差的敏感程度。
积分项(I)‌:负责消除稳态误差,它通过对过去误差的累积来调整控制输出。积分时间常数决定了积分项对历史误差的重视程度。
微分项(D)‌:负责预测未来的误差趋势,它根据误差的变化率来调整控制输出。微分时间常数决定了微分项对未来误差变化的敏感程度。

使用特权

评论回复
9
hudi008| | 2024-8-5 22:30 | 只看该作者
PID算法包含三个主要组成部分:比例(P)、积分(I)和微分(D)。

使用特权

评论回复
10
lzbf| | 2024-8-6 09:38 | 只看该作者
PID算法的核心是基于系统的误差信号来进行控制,即通过计算当前系统输出与期望输出之间的差值(误差),并根据这个误差来调整系统的控制参数。

使用特权

评论回复
11
youtome| | 2024-8-6 12:17 | 只看该作者
PID算法是一种经典的控制算法,尤其在闭环控制系统中得到广泛应用。它通过比例、积分和微分三个环节的线性组合构成控制量,对被控对象进行精确控制。

使用特权

评论回复
12
lzbf| | 2024-8-6 13:51 | 只看该作者
PID(Proportional-Integral-Derivative)算法是一种广泛应用于控制系统的设计方法,主要用于调节控制系统的性能,使其达到稳定、快速响应的状态。

使用特权

评论回复
13
tabmone| | 2024-8-6 15:31 | 只看该作者
PID控制器通过调整这三个部分的增益系数来控制系统的输出,以使系统的实际输出值尽可能接近期望的目标值(设定点)。

使用特权

评论回复
14
pentruman| | 2024-8-6 17:08 | 只看该作者
增量式PID控制器是一种改进型的PID控制器,它的输出不是直接用于控制,而是作为控制量的增量来使用。这样做的好处是可以避免积分项累积带来的问题,比如积分饱和等。

使用特权

评论回复
15
lzmm| | 2024-8-6 18:44 | 只看该作者
通过了解PID算法及其两种形式(位置式和增量式)的定义和区别,可以更好地选择合适的PID算法应用于不同的控制系统中。

使用特权

评论回复
16
uptown| | 2024-8-6 20:24 | 只看该作者
增量式PID适用于执行机构带有积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象

使用特权

评论回复
17
usysm| | 2024-8-6 22:07 | 只看该作者
PID算法,即比例-积分-微分控制算法,是一种通过反馈机制自动调整控制量的方法。它通过三个环节的加和作用,对系统的偏差进行控制,以达到精确控制的目的

使用特权

评论回复
18
nomomy| | 2024-8-8 09:55 | 只看该作者
通过比例(P)、积分(I)和微分(D)三个环节的加和来控制被控量,以达到期望的输出效果。增量式PID是PID算法的一种形式,其输出是控制量的增量,而不是位置量的绝对值。

使用特权

评论回复
19
iyoum| | 2024-8-8 11:31 | 只看该作者
增量式PID算法是PID算法的一种改进形式。它通过计算控制量的增量(即本次控制量与上次控制量之差)来实现控制。

使用特权

评论回复
20
sdlls| | 2024-8-8 13:07 | 只看该作者
由于增量式PID算法只计算增量,可以有效减少积分饱和现象,提高系统的稳定性。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

1287

帖子

0

粉丝