当前位置:   article > 正文

PID基本原理及代码实现(基于正点原子电机教程)_正点原子 pid

正点原子 pid

开环控制系统

        开环控制系统输出只受系统输入控制,没有反馈回路,控制精度和抗干扰能力差。

         如上图的风扇风力控制系统,如果输入目标风力为300,正常情况下控制电路会驱动电机使扇叶达到300的转速,但是实际上不可避免会有阻力,会导致风力达不到300,这就是由于没有反馈,导致精度不足。

闭环控制系统

        闭环控制系统引入反馈回路,利用输出和输入值的偏差对系统进行控制,避免偏离预定目标,又称为反馈控制系统。

        如上图的直流有刷电机速度闭环控制系统,假设目标转速为300,初始实际转速为0,编码器返回的转速就是0,计算偏差为300,经过单片机和调压电路,控制电机输出300转速,由于有阻力,编码器返回的实际转速有偏差,与目标转速计算偏差后再输入系统进行进一步控制,可以有效提高精度。下面举一个最简单的直流有刷电机闭环控制算法,略去初始化部分,只包含反馈调节部分,如果电机转速小于24,就增大PWM占空比,电机转速大于26,就减小PWM占空比:

  1. //电机的目标转速在24~26RPM,转速由编码器测速获得
  2. if(g_motor_data.speed <= 24)//如果转速小于24
  3. {
  4. moter_pwm += 1;//PWM值++,提高电机转速
  5. moter_pwm_set(moter_pwm);
  6. }
  7. else if(g_motor_data.speed >= 26)//如果转速大于26
  8. {
  9. moter_pwm -= 1;//PWM值--,降低电机转速
  10. moter_pwm_set(moter_pwm);
  11. }

PID控制

        PID 是 Proportional(比例)、Integral(积分)、Differential(微分)的首字母缩写,它是一种结合比例、积分和微分三个环节于一体的闭环控制算法。 ​ 本质:根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出。

比例环节 

        比例环节可以成比例地反应控制系统的偏差信号,即输出与输入偏差成正比,可以用来减小系统的偏差。此环节的公式如下:

  1. //u表示输出,Kp是比例系数,e是偏差
  2. u = Kp * e;

        我们接下来以大棚温控实例来理解这个公式。假设我们现在需要调节棚内温度为 30℃,而实际温度为 10℃,此时的偏差 e=20,由比例环节的公式可知,当 e 确定时,Kp 越大则输出u 越大,也就是温控系统的调节力度越大,这样就可以更快地达到目标温度;而当 Kp 确定时,偏差 e 越大则输出 u 越大。由此可见,在比例环节中,比例系数 Kp 和偏差 e 越大则系统消除偏差的时间越短,具体的曲线表现如图所示:

        当 Kp 的值越大时,其对应的橙色曲线达到目标值的时间就越短,与此同时,橙色曲线出现了一定幅度的超调和振荡,这会使得系统的稳定性下降,因此,我们在设置比例系数的时候,并不是越大越好,而是要兼顾消除偏差的时间以及整个系统的稳定性。

静态误差

        在实际的应用中,如果仅有比例环节的控制,可能会给系统带来静态误差。静态误差是指系统控制过程趋于稳定时,目标值与实测值之间的偏差。以大棚温控系统为例:

        假设我们现在需要调节棚内温度为 30℃,而实际温度为 25℃,此时偏差 e=5,Kp 为固定值,如果此时的输出可以让大棚在半个小时之内升温 5℃,而外部的温差可以让大棚在半个小时之内降温 5℃,也就是说,输出 u 的作用刚好被外部影响抵消了,这就使得偏差会一直存在,此时的曲线如图所示:

              如果Kp过大容易产生超调和震荡Kp过小又会产生静态误差,为了解决静态误差,引入了积分环节。 

积分环节

        积分环节可以对偏差 e 进行积分,只要存在偏差,积分环节就会不断起作用,主要用于消除静态误差,提高系统的无差度。引入积分环节后,比例+积分环节的公式如下:

        我们依旧以大棚温控实例来理解积分环节的作用。假设现在温控系统的比例环节作用被抵消,存在静态误差 5℃,此时偏差存在,积分环节会一直累计偏差,以此增大输出,从而消除静态误差。从上述公式中可以得知,当积分系数 Ki 或者累计偏差越大时,输出就越大,系统消除静态误差的时间就越短,具体的曲线表现如图所示:

        当 Ki 的值越大时,其对应的橙色曲线达到目标值的时间就越短,与此同时,橙色曲线出现了一定幅度的超调和振荡,这会使得系统的稳定性下降,因此,我们在设置积分系数的时候,并不是越大越好,而是要兼顾消除静态误差的时间以及整个系统的稳定性。我们前面有说过,只要系统还存在偏差,积分环节就会不断地累计偏差。当系统偏差为 0的时候,说明已经达到目标值,此时的累计偏差不再变化,但是积分环节依旧在发挥作用(此时往往作用最大),这就很容易产生超调的现象了。因此,我们需要引入微分环节,提前减弱输出,抑制超调的发生。

微分环节

        微分环节可以反应偏差量的变化趋势,根据偏差的变化量提前作出相应控制,减小超调,克服振荡。引入微分环节后,比例+积分+微分环节的公式如下:

        我们依旧以大棚温控实例来理解微分环节的作用。假设温控系统目标温度为 30℃,在上午八点的时候存在偏差15℃,经过一段时间的调节,到了上午九点,此时偏差已经缩小到5℃,偏差的变化量= 九点的偏差(第 k 次)-八点的偏差(第 k-1 次)= -10,结合上述公式可知,此时微分环节会削弱比例和积分环节的作用,减小输出以抑制超调。  

PID算法离散公式

位置式PID公式

        位置式PID的计算需要全部控制量参与,它的每一次输出都和过去状态有关。

 增量式PID公式

        通过位置式PID可以推导出增量式PID公式:

        从公式中可以看出,增量式 PID 的计算并不需要一直累计偏差,它的输出与近三次的偏差有很大关系。注意:增量式 PID 公式输出的只是控制量的增量。我们以一个实例来理解这句话:假设电机实际转速为 50RPM,现在我们要让它加速到 60RPM,如果采用的是位置式 PID,系统将直接输出 60RPM 对应的控制量(占空比);如果采用的是增量式 PID,系统将输出提速 10RPM对应的控制量(占空比),此时我们还需要加上上次(50RPM)的输出。

        两种PID公式的对比如下:

对比项位置式增量式
输出全量输出增量输出
偏差需要一直累计偏差只考虑最近三次偏差
积分作用
限幅需要输出和积分限幅只需要输出限幅

两种PID公式的优缺点

① 位置式:

优点:位置式 PID 是一种非递推式算法,带有积分作用,适用于不带积分部件的对象。

缺点:全量计算,计算错误影响很大;需要对偏差进行累加,运算量大。

② 增量式:

优点:只输出增量,计算错误影响小;不需要累计偏差,运算量少,实时性相对较好。

缺点:积分截断效应大,有稳态误差。

积分饱和问题

        在位置式 PID 中,如果系统长时间无法达到目标值,累计偏差(积分)就会变得很大,此时系统的响应就很慢了。我们以一个实例来分析这个问题:假设某个电机能达到的最大速度为 300RPM,而我们设置了目标速度为 350RPM,这明显是一个不合理的目标值,此时 PID 控制系统的曲线如图所示:

        由于系统长时间无法达到目标值,累计偏差(积分)会变得越来越大,逐渐达到深度饱和的状态,此时我们再设置一个合理范围的目标速度(例如 200RPM),系统就没有办法在短时间内响应了。为了避免位置式 PID 中可能出现的积分饱和问题,可采取以下措施:

① 优化 PID 曲线,系统越快达到目标值,累计的偏差就越小;

② 限制目标值调节范围,规避可以预见的偏差;

③ 进行积分限幅,在调整好 PID 系数之后,根据实际系统来选择限幅范围。

 PID算法代码实现

控制量相关的结构体

        有了 PID 的离散化公式之后,我们实现 PID 算法的代码是非常简单的,首先通过一个结构体来管理所需的控制量:

  1. typedef struct
  2. {
  3. __IO float SetPoint; /* 目标值 */
  4. __IO float ActualValue; /* 期望输出值 */
  5. __IO float SumError; /* 偏差累计 */
  6. __IO float Proportion; /* 比例系数 P */
  7. __IO float Integral; /* 积分系数 I */
  8. __IO float Derivative; /* 微分系数 D */
  9. __IO float Error; /* Error[1],第 k 次偏差 */
  10. __IO float LastError; /* Error[-1],第 k-1 次偏差 */
  11. __IO float PrevError; /* Error[-2],第 k-2 次偏差 */
  12. } PID_TypeDef;

PID算法代码

        PID 算法的代码实现本质上就是对于两个离散公式的应用,我们先看位置式 PID 代码

  1. /*
  2. \* @brief pid 闭环控制
  3. \* @param *PID:PID 结构体变量地址
  4. \* @param Feedback_value:当前实际值
  5. \* @retval 期望输出值
  6. */
  7. int32_t increment_pid_ctrl(PID_TypeDef *PID,float Feedback_value)
  8. {
  9. PID->Error = (float)(PID->SetPoint - Feedback_value); /* 计算偏差 */
  10. PID->SumError += PID->Error; /* 累计偏差 */
  11. PID->ActualValue = (PID->Proportion * PID->Error) /* 比例环节 */
  12. \+ (PID->Integral * PID->SumError) /* 积分环节 */
  13. \+ (PID->Derivative * (PID->Error - PID->LastError)); /* 微分环节 */
  14. PID->LastError = PID->Error; /* 存储偏差,用于下次计算 */
  15. return ((int32_t)(PID->ActualValue)); /* 返回计算后输出的数值 */
  16. }

        在函数中,我们先计算本次偏差 Error,然后把偏差累计,存入 SumError 成员当中,接着根据位置式的公式进行三个环节的计算,计算后的期望输出存入 ActualValue 成员当中,然后存储本次偏差,最后返回期望输出值。

        接着我们看增量式 PID 代码:

  1. /*
  2. \* @brief pid 闭环控制
  3. \* @param *PID:PID 结构体变量地址
  4. \* @param Feedback_value:当前实际值
  5. \* @retval 期望输出值
  6. */
  7. int32_t increment_pid_ctrl(PID_TypeDef *PID,float Feedback_value)
  8. {
  9. PID->Error = (float)(PID->SetPoint - Feedback_value); /* 计算偏差 */
  10. PID->ActualValue +=
  11. /* 比例环节 */
  12. (PID->Proportion * (PID->Error - PID->LastError))
  13. /* 积分环节 */
  14. \+ (PID->Integral * PID->Error)
  15. /* 微分环节 */
  16. \+ (PID->Derivative * (PID->Error - 2 * PID->LastError + PID->PrevError));
  17. PID->PrevError = PID->LastError;
  18. /* 存储偏差,用于下次计算 */
  19. PID->LastError = PID->Error;
  20. return ((int32_t)(PID->ActualValue)); /* 返回计算后输出的数值 */
  21. }

        增量式 PID 的代码实现和位置式是非常类似的,所以我们在实际的代码实现中,可以通过一个宏定义来切换这两种不同的算法,值得注意的是,增量式 PID 输出的是调节量,所以计算期望输出值 ActualValue 的时候是自增运算,这一点和位置式 PID 是不一样的。

PID参数整定

采样周期选择

        采样周期指的是 PID 控制中实际值的采样时间间隔,其越短,效果越趋于连续,但对硬件资源的占用也越高。在实际的应用中,我们可以使用理论或者经验方法来确定采样周期:

① 理论方法:香农采样定理。这个定理可以用来确定采样周期可选择的最大值,当采样周期超出了这个最大的允许范围,我们所得到的信号就会失真,也就无法较好地还原信号了。香农采样定理的具体原理我们不展开介绍,感兴趣的朋友可以去查找相关的资料,我们这里重点关注经验方法。

② 经验方法:根据控制对象突变能力选择。假设电机当前转速为 20RPM,我们需要提高它的转速到 30RPM,此电机的转速在 1s 之内最大可以突变 10RPM(即电机速度的突变能力),如果我们每 1ms 采集一次电机转速,那么每一次采集到的速度变化量最大为 10RPM / 1000 =0.01RPM,很明显,此时最大的变化量远远小于当前的速度,这对于我们的 PID 控制效果并没有明显的提升,但是却占用了很多的硬件资源,因此,我们需要根据控制对象的突变能力来选择采样周期

PID参数整定方法

理论计算整定法:依据系统的数学模型,经过理论计算确定 PID 参数。这种方法是建立在理想化条件下的,其得到的参数不一定能够直接使用,还需要结合经验以及实际的系统进行调整。

工程整定法:依靠工程经验,直接在控制系统的试验中进行整定,此方法易于掌握,在实际调参中被广泛采用。工程整定法包括:试凑法、临界比例法和一般调节法。注意:无论采用哪一种方法所得到的 PID 参数,都需要在实际运行中进行最后调整与完善,因此,在 PID 参数整定中,最重要的就是经验的积累。接下来我们了解一下 PID 各个系数调节的效果,这样才能做到在 PID 调参中有的放矢。

① 比例系数:调节作用快,系统一出现偏差,调节器立即将偏差放大输出。

② 积分系数:积分系数的调节会改变输入偏差对于系统输出的影响程度。积分系数越大,消除静差的时间越短,但是过大的积分系数则会导致系统出现超调现象,这在具有惯性的系统中尤为明显。

③ 微分系数:微分系数的调节是偏差变化量对于系统输出的影响程度。微分系数越大,系统对于偏差量的变化越敏感,越能提前响应,进而抑制超调,但是过大的微分系数则会让整个系统出现振荡。

试凑法

1)内容:结合系统的具体情况以及经验,先试凑几组合理的 PID 系数,同时需要观察系统的曲线变化,确定每一个系数对于整个系统曲线的大致影响,然后再根据具体的曲线进行调整。

2)调节思路

① 先是比例(P),再积分(I),最后是微分(D);

② 按纯比例系统整定比例系数,使其得到比较理想的调节过程曲线,然后再把比例系数缩小 1.2 倍左右,将积分系数从小到大改变,使其得到较好的调节过程曲线;

③ 在这个积分系数下重新改变比例系数,再看调节过程曲线有无改善;

④ 如有改善,可将原整定的比例系数减少,改变积分系数,这样多次的反复,就可得到合适的比例系数和积分系数;

⑤ 如果存在外界的干扰,系统的稳定性不好,可把比例、积分系数适当减小,使系统足够稳定;

⑥ 如果系统存在小幅度超调,可以将整定好的比例系数和积分系数适当减小,增大微分系数,以得到超调量最小、调节作用时间最短的系统曲线;

临界比例法

内容:在闭环的控制系统里,将调节器置于纯比例作用下,从小到大逐渐调节比例系数,直到系统曲线出现等幅振荡,再根据经验公式计算参数。

调节思路:

① 将积分、微分系数置零,比例度取适当值,平衡操作一段时间,使控制系统按纯比例作用的方式投入运行。

② 慢慢地增大比例系数,细心观察曲线的变化情况。如果控制过程的曲线波动是衰减的,则把比例系数继续增大;如果曲线波动是发散的,则应把比例系数减小,直至曲线波动呈等幅振荡,此时记下临界比例系数 δK 和临界振荡周期 Tk 的值。

③ 根据记下的比例系数和周期,采用经验公式,计算调节器的参数。

一般调节法

内容:这种方法针对一般的 PID 控制系统所以称之为一般调节法。

调节思路:

① 首先将积分、微分系数置零,使系统为纯比例控制。控制对象的值设定为系统允许的最大值的 60%~70%,接着逐渐增大比例系数,直至系统出现振荡;此时再逐渐减小比例系数,直至系统振荡消失,然后记录此时的比例系数,并设定系统的比例系数为当前值的 60%~70%。

② 确定比例系数后,设定一个较小的积分系数,然后逐渐增大积分系数,直至系统出现振荡;此时在逐渐减小积分系数,直至系统振荡消失,然后记录此时的积分系数,并设定系统的积分系数为当前值的 55%~65%。

③ 微分系数一般不用设定,为 0 即可。若系统出现小幅度振荡,并且通过 PI 环节无法优化,这可以采用与确定比例、积分系数相同的方法,微分系数取系统不振荡时的 30%左右。

④ 系统空载、带载联调,再对 PID 参数进行微调,直至满足要求。

实际调参演示

接下来我们将从实际的 PID 系统曲线来理解 PID 各个系数的调节效果,大家一定要注意经验的积累。我们调节 PID 系数的思路如下:

先调整比例系数,积分、微分系数设置为 0,此时的系统只有比例环节参与控制。如果此时系统的曲线出现大幅振荡,如图 9.2.4.1 所示:

首先确定硬件上是否出现了故障,例如电压不稳定、电机堵转等,排除了这些之后,那就说明比例系数调节的过大了,这个时候我们可以把比例系数慢慢地减小,并同时观察曲线的变化。

② 当我们调小比例系数之后,曲线的大幅度振荡现象消失,但是曲线依旧存在小幅度的超调现象,并且此时通过调节比例系数已经无法优化曲线,如图 9.2.4.2 所示:

此时,我们可以慢慢地增大微分系数,并同时观察曲线的变化,从而找到最合适的参数。增大微分系数之后,如果系统的曲线已经较为理想,则说明这个系统只需要比例和微分环节的控制。

③ 如果在纯比例环节的控制下,系统的实际值始终达不到目标值,存在静态误差,如图9.2.4.3 所示:

此时,我们可以逐渐增大积分系数,并同时观察曲线的变化,如果消除静差的时间过长,则可以再适当增大积分系数,但是需要注意兼顾系统的超调量。经过调整之后,如果系统的曲线已经较为理想,则说明这个系统只需要比例和积分环节的控制。

④ 如果系统在比例和积分环节的控制下出现小幅度的超调现象,此时,我们可以慢慢地增大微分系数,并同时观察曲线的变化,从而找到最合适的参数。以上就是在实际调参中经常遇到的一些问题以及解决方法。然而,在实际应用中,控制系统是多样且复杂的,上述方法只能作为参考,并不是通用的,因此在 PID 调参过程中,大家一定要注意经验的积累。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/711412
推荐阅读
相关标签
  

闽ICP备14008679号