入门电机系列之6PID 算法的原理与应用

入门电机系列,基于STM32硬件

本文章学习借鉴于野火团队资料,以表感谢。官网http://products.embedfire.com/
入门电机系列之6PID 算法的原理与应用。


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


一、为什么使用 PID?

PID 算法是控制领域非常常见的算法,小到控制温度,大到控制飞机的飞行姿态和速度等等,都
会涉及到 PID 控制,在控制领域可以算是万能的算法,如果你能够掌握 PID 算法的控制与实现,
那么已经足以应对控制领域的一般问题了。并且在众多控制算法中 PID 是最能体现反馈思想的
算法;可以算上是经典之作,那么如此好用的算法是不是很复杂呢?并不是,经典不等同于复杂,
往往经典的东西是都是简单的。所以放心学习就好了!
以小车速度为例,你一定会发现这样一个问题,当你刚把充满的 12V 电池装在小车上时,然后
在程序上给了一个固定 50% 的占空比,此时小车跑的很快动力很足,但是跑着跑着就慢了下来,
因为电池电压的影响小车速度变慢了,在刚充满的时候 12V 电池 50% 的占空比相当于直接作用
在电机两端的电压是 12V x 50% = 6V , 当使用一段时间后电池的电压变为 9V,虽然程序占空比
没有变,但是由于电池电压降低了,所以作用在电机两端的电压也就变了,所以小车变慢了。那
么怎么才能够使小车按照恒定速度行驶呢?其思想就是当小车速度慢了,就增加占空比。那么速
度慢多少开始增加占空比呢?怎么增加?增加多少呢?
此时,PID 算法就是一个非常好的选择,对于增加多少的问题,一定要通过 PID 算法,因为速度
和占空比到底是个什么关系,谁也不知道。但是此时使用 PID 算法,通过编码器的速度反馈,可
以实时的知道小车的速度是否慢了,然后利用目标速度与实际速度的误差带入算法,即可获得当
前占空比,达到控制速度的效果。

日常应用

比如四轴飞行器,再比如平衡小车…还有汽车的定速巡航、3D打印机上的温度控制器…就是类似于这种:需要将某一个物理量“保持稳定”的场合(比如维持平衡,稳定温度、转速等),PID都会派上大用场。

PID 算法介绍

PID,就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很常见的控制算法。

在这里插入图片描述

比例(P)
比例控制是最简单的一种控制方式,成比例的反应控制系统中输入与输出的偏差信号,只要偏差
一旦产生,就立即产生控制的作用来减小产生的误差。比例控制器的输出与输入成正比关系,能
够迅速的反应偏差,偏差减小的速度取决于比例系数 Kp,Kp 越大偏差减小的就越快,但是极易
引起震荡;Kp 减小发生震荡的可能性减小,但是调节的速度变慢,单纯的比例控制存在不能消
除的静态误差,这里就需要积分来控制。

积分(I)

在比例控制环节产生了静态误差,在积分环节中,主要用于就是消除静态误差提高系统的无差
度。积分作用的强弱,取决于积分时间常数 Ti,Ti 越大积分作用越弱,反之则越强。积分控制作
用的存在与偏差 e(t) 的存在时间有关,只要系统存在着偏差,积分环节就会不断起作用,对输入
偏差进行积分,使控制器的输出及执行器的开度不断变化,产生控制作用以减小偏差。在积分时
间足够的情况下,可以完全消除静差,这时积分控制作用将维持不变。Ti 越小,积分速度越快,
积分作用越强。积分作用太强会使系统超调加大,甚至使系统出现振荡。

微分(D)

微分环节的作用是反应系统偏差的一个变化趋势,也可以说是变化率,可以在误差来临之前提前
引入一个有效的修正信号,有利于提高输出响应的快速性, 减小被控量的超调和增加系统的稳定
性,虽然积分环节可以消除静态误差但是降低了系统的响应速度,所以引入微分控制器就显得很
有必要,尤其是具有较大惯性的被控对象使用 PI 控制器很难得到很好的动态调节品质,系统会
产生较大的超调和振荡,这时可以引入微分作用。在偏差刚出现或变化的瞬间,不仅根据偏差量
作出及时反应(即比例控制作用),还可以根据偏差量的变化趋势(速度)提前给出较大的控制
作用(即微分控制作用),将偏差消灭在萌芽状态,这样可以大大减小系统的动态偏差和调节时
问,使系统的动态调节品质得以改善。微分环节有助于系统减小超调,克服振荡,加快系统的响
应速度,减小调节时间,从而改善了系统的动态性能,但微分时间常数过大,会使系统出现不稳
定。微分控制作用一个很大的缺陷是容易引入高频噪声,所有在干扰信号比较严重的流量控制系
统中不宜引入微分控制作用。

举例分析便于理解

点击查看参考理解案例其他博主写的

设想一下,假如汽车的定速巡航电脑在某一时间测到车速是45km/h。它立刻命令发动机:加速!
结果,发动机那边突然来了个100%全油门,嗡的一下,汽车急加速到了60km/h。这时电脑又发出命令:刹车!
结果,吱…哇…(乘客吐)

所以,在大多数场合中,用“开关量”来控制一个物理量,就显得比较简单粗暴了。有时候,是无法保持稳定的。因为单片机、传感器不是无限快的,采集、控制需要时间。
而且,控制对象具有惯性。比如你将一个加热器拔掉,它的“余热”(即热惯性)可能还会使水温继续升高一小会。

在这里插入图片描述

我们先只说PID控制器的三个最基本的参数:kP,kI,kD。

目标(会有误差)= 偏差(kP)+调节力度

实际写程序时,就让偏差(目标减去当前)与调节装置的“调节力度”,建立一个一次函数的关系,就可以实现最基本的“比例”控制了~
kP越大,调节作用越激进,kP调小会让调节作用更保守

刚才我们有了P的作用。你不难发现,只有P好像不能让平衡车站起来,水温也控制得晃晃悠悠,好像整个系统不是特别稳定,总是在“抖动”。

在这里插入图片描述

你心里设想一个弹簧:现在在平衡位置上。拉它一下,然后松手。这时它会震荡起来。因为阻力很小,它可能会震荡很长时间,才会重新停在平衡位置。
请想象一下:要是把上图所示的系统浸没在水里,同样拉它一下 :这种情况下,重新停在平衡位置的时间就短得多。

我们需要一个控制作用,让被控制的物理量的“变化速度”趋于0,即类似于“阻尼”的作用。

因为,当比较接近目标时,P的控制作用就比较小了。越接近目标,P的作用越温柔。有很多内在的或者外部的因素,使控制量发生小范围的摆动。D的作用就是让物理量的速度趋于0,
只要什么时候,这个量具有了速度,D就向相反的方向用力,尽力刹住这个变化。
kD参数越大,向速度相反方向刹车的力道就越强。

如果是平衡小车,加上P和D两种控制作用,如果参数调节合适,它应该可以站起来了~欢呼吧

一个让平衡车来回摆动,让站立起来就是KP的作用,KD需要让摆动趋于逐渐平稳过程,也就是把误差接近于0的过程。

kI
还是以热水为例。假如有个人把我们的加热装置带到了非常冷的地方,开始烧水了。需要烧到50℃。

在P的作用下,水温慢慢升高。直到升高到45℃时,他发现了一个不好的事情:天气太冷,水散热的速度,和P控制的加热的速度相等了
这可怎么办?

P兄这样想:我和目标已经很近了,只需要轻轻加热就可以了。
D兄这样想:加热和散热相等,温度没有波动,我好像不用调整什么。

于是,水温永远地停留在45℃,永远到不了50℃。

作为一个人,根据常识,我们知道,应该进一步增加加热的功率。可是增加多少该如何计算呢?

前辈科学家们想到的方法是真的巧妙。

设置一个积分量。只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。

这样一来,即使45℃和50℃相差不太大,但是随着时间的推移,只要没达到目标温度,这个积分量就不断增加。系统就会慢慢意识到:还没有到达目标温度,该增加功率啦!
到了目标温度后,假设温度没有波动,积分值就不会再变动。这时,加热功率仍然等于散热功率。但是,温度是稳稳的50℃。
kI的值越大,积分时乘的系数就越大,积分效果越明显。

所以,I的作用就是,减小静态情况下的误差,让受控物理量尽可能接近目标值。

I在使用时还有个问题:需要设定积分限制。防止在刚开始加热时,就把积分量积得太大,难以控制。

PID 算法的离散化

先看一下 PID 算法的一般形式:

PID 框图如下所示
在这里插入图片描述
通过以上框图不难看出,PID 控制其实就是对偏差的控制过程;如果偏差为 0, 则比例环节不起作
用,只有存在偏差时,比例环节才起作用;积分环节主要是用来消除静差,所谓静差,就是系统
稳定后输出值和设定值之间的差值,积分环节实际上就是偏差累计的过程,把累计的误差加到原
有系统上以抵消系统造成的静差;而微分信号则反应了偏差信号的变化规律,也可以说是变化趋
势,根据偏差信号的变化趋势来进行超前调节,从而增加了系统的预知性;

离散公式我就不放了,主要不好理解

在这里插入图片描述

增量式和位置式的PID的区别

1、增量式算法不需要对积分项累加,控制量增量只与近几次的误差有关,计算误差对控制量
计算的影响较小。而 位置式算法要对近几次的偏差的进行积分累加,容易产生较大的累加
误差;
2、增量式算法得出的是控制量的增量,例如在阀门控制中,只输出阀门开度的变化部分,误
动作影响小,必要时还可通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作;而
位置式的输出直接对应对象的输出,因此对系统影响较大;
3、增量式算法控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分
部件的对象,如步进电机等,而 位置式算法适用于执行机构不带积分部件的对象,如电液
伺服阀;
4、在进行 PID 控制时,位置式 PID 需要有积分限幅和输出限幅,而 增量式 PID 只需输出限

位置式 PID 优缺点:

优点
位置式 PID 是一种非递推式算法,可直接控制执行机构(如平衡小车),u(k) 的值和执行
机构的实际位置(如小车当前角度)是一一对应的,因此在执行机构不带积分部件的对象中可以
很好应用;
缺点
每次输出均与过去的状态有关,计算时要对 e(k) 进行累加,运算工作量大。

增量式 PID 优缺点:

优点
误动作时影响小,必要时可用逻辑判断的方法去掉出错数据
手动/自动切换时冲击小,便于实现无扰动切换。算式中不需要累加。控制增量 Δu(k) 的确定仅与最近 3 次的采样值有关。在速度闭环控制中有很好的实时性。
缺点
积分截断效应大,有稳态误差;
溢出的影响大。有的被控对象用增量式则不太好;

二、使用步骤

1.C语言代码实现位置式PID实现代码

代码如下(示例):

int OUT,P_OUT,I_OUT,D_OUT,Error,Last_Error; //总输出、P输出、I输出、D输出、本次误差、上次误差
float P = 100.0 ; //随便写的值 
float I = 100.0 ;
float D = 100.0 ;
int Target_value = 500 ; //希望系统达到的值 
int value ;  //系统当前的值

void PID
{
	Error = Target_value - value ;   //计算当前误差 
	P_OUT = P * Error ;              //比例项 
	I_OUT += I * Error ;             //积分项 
	D_OUT = D * (Error - Last_Error) ;    //微分项 
	OUT = P_OUT + I_OUT + D_OUT ;     //各项相加计算输出值 
	Last_Error = Error               //本次误差赋给上次误差 
} 

2.C语言代码实现增量式PID实现代码

代码如下(示例):

int OUT,P_OUT,I_OUT,D_OUT,Error,Last_Error,Last_Error2; //总输出、P输出、I输出、D输出、本次误差、上次误差、上上次误差 
float P = 100.0 ; //随便写的值 
float I = 100.0 ;
float D = 100.0 ;
int Target_value = 500 ; //希望系统达到的值 
int value ;  //系统当前的值

void PID
{
	Error = Target_value - value ;         //计算当前误差 
	P_OUT = P * (Error - Last_Error) ;                    //比例项 
	I_OUT += I * Error ;    //积分项 
	D_OUT = D * (Error - 2*Last_Error + Last_Error2) ;     //微分项 
	OUT = Last_OUT + P_OUT + I_OUT + D_OUT ;     //各项相加计算输出值 
	
	Last_Error = Error ;         //本次误差赋给上次误差 
} 

总结

位置式PID:

通过目标值对当前值的误差比较进行公式运算,使其不断输出达到目标值
每次输出均与过去的状态有关,计算时要对误差进行累加,运算工作量大
非递推式算法,在执行机构不带积分部件的对象中可以很好应用

增量式PID:

增量的确定仅与最近几次偏差采样值有关,容易通过加权处理获得比较好的控制效果
误动作时影响小,高强度干扰时冲击小,便于实现无扰动切换
积分截断效应大,有稳态误差

  • 1
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闰土小蒋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值