PID算法原理 一简单的认识一下PID的三个参数的作用

2023-05-16

PID算法原理 一简单的认识一下PID的三个参数的作用

以下的内容是我通过查阅了资料和加上我对PID的理解的总结,如果遇到有不对的地方,还望指出

先上一张图PID控制的结构图
在这里插入图片描述

关于PID控制,我相信很多小伙伴应该都听说过,比较PID控制是应用非常广泛的控制算法了,像平衡小车的平衡、无人机的飞行姿态等,都是可以通过PID控制的

那么PID到底是什么东西?

PID其实就是指比例(P),积分(I),微分(D)控制。
PID中最基本的常数有三个:Kp(比例系数)、Ki(积分系数)、Kd(微分系数)

也许有人不懂什么是微分和积分
我的理解是:微分就是一个微小的线性变化量。而积分在PID的控制中,说白了就是求和,是积累起来的量。

我们看看连续的PID公式:
在这里插入图片描述
离散化的PID公式:
在这里插入图片描述
看不懂没关系,我们先往下看

一、比例控制算法

比例就是用来对系统的偏差进行反应的,只要系统存在偏差,比例就会起作用

偏差err=需要控制的量的目标值-需要控制的量的当前值

偏差一旦产生,比例项立刻去减小偏差,比例在整个PID调节中起主导作用

比例项的输出大小与误差大小成正比,误差越大,比例项输出就越大:
比例项的输出值u1=Kp*err

如果只用比例控制的话,用一个网上很经典的例子:
假设现在有一个圆柱形的水缸,该水缸里面原本的水位为2m,我们需要往水缸里面加水,使水缸里面的水位到达10m,并且需要保证水缸里面的水位永远维持在10m的高度。
此时当前水位(2m)和目标水(10m)之间相差8m,也就是说,此时的误差err为8m
如果单纯的用比例控制算法,那么加入的水量(u)和误差err是成正比的
也就是u=Kp*err
Kp是我们自己设置的,我们取Kp为0.5

第一次加水:u=0.58=4 此时水位为4+2=6 此时的误差为err=10-6=4
第二次加水:u=0.5
4=2 此时水位为2+6=8 此时的误差为err=10-8=2
第二次加水:u=0.5*2=2 此时水位为1+8=9 此时的误差为err=10-9=1
通过n次加水后,最终的水位会相当接近10m,但是不管怎么加,都会有一个小小误差,该误差随着次数的增加在减小,该误差我们称为暂态误差,当n的值足够大,暂态误差就会变得足够小,小到可以忽略不计。

二、积分控制算法

积分主要用来消除静差,所谓静差就是指系统稳定后输入输出之间依然存在的差值,而积分就是通过偏差的累计来抵消系统的静差。

引用网上另一个例子,我们现在有一个加热装置,我们需要把加热装置带到非常冷的地方,开始烧水,需要将水烧到50℃。在P的作用下,水会慢慢升高,在理想情况下,水会升到50℃。当水温升到45℃的时候,我们突然发现由于天气太冷了,水散热的速度和P控制的加热速度相等了,此时水温就永远停留在了45℃,永远到不了50℃。
水散热的速度也就是现实中存在的外界的干扰,例如小车行驶过程中轮胎的摩擦力,无人机在飞行过程中遇到的空气阻力等。

回到水缸的例子,假设此时水缸漏水(外界干扰),我们每次加水前水缸都会漏掉1m水位的水
还是用上面的方法计算
第一次加水:u=0.58-1=3 此时水位为3+2=5 此时的误差为err=10-5=5
第二次加水:u=0.5
5-1=1.5 此时水位为1.5+5=6.5 此时的误差为err=10-6.5=3.5
第n吃加水:水位达到了0.8的位置 此时误差为err=10-8=2
第n+1次加水: u=0.5*2-1=0 此时水位为8+0=0 此时误差为err=10-8=2
也就是说单纯的用比例控制算法的话,水位只能到达8m的位置
当水位为8m的时候,水位已经稳定,但是此时会有一个2m的误差,我们称这个误差为稳态误差,那么如何消除这个稳态误差呢?,此时就需要引入I的概念了

为了解决这个稳态误差,我们正常的想法是进一步增加每次加水的量,但是每次该增加多少呢?前辈的科学家们就想到了一个很巧妙的方法,那就是引入一个“积分量”,只要误差存在,就不断的对误差进行积分(累加)。这个积分量就是我们在比例控制下额外的加水量,这样一来,随着加水次数的增加,只要还没达到我们的“目标值”,这个积分量就会不断的增加,直到误差为0。

我们取Ki=0.3
还是用上面的方法计算(为了更加直观,我这里不省略计算过程)

第n+1次加水:u=0.52+0.32-1=0.6
此时水位为8+0.6=8.6
误差为err=10-1.6=1.4

第n+2次加水:u=0.51.4+0.3(2+1.4)-1=0.72
此时水位为8.6+0.72=9.32
误差为err=10-9.32=0.68

第n+3次加水:u=0.50.68+0.3(2+1.4+0.68)-1=0.564
此时水位为9.32+0.564=9.884
此时误差为err=10-9.884=0.116

第n+3次加水:u=0.50.116+0.3(2+1.4+0.68+0.116)-1=0.3168
此时水位为9.884+0.3168=10.2005
此时误差为err=10-10.2005=-0.2005

第n+4次加水:u=0.5*-0.2005+0.3*(2+1.4+0.68+0.116-0.2005)-1=0.0984
此时水位为10.2005+0.0984=10.2989
此时误差为err=10-10.2989=-0.2989

第n+5次加水:u=0.5*-0.2989+0.3*(2+1.4+0.68+0.116-0.2005-0.2989)-1=-0.13047 此时水位为10.2989-0.13047=10.16843
此时误差为err=10-10.16843=-0.1684

第n+n次后,水位一直会在瓶口附近震荡,且震荡会越来越小。
也就是在I的作用下,能够有效的减小稳态情况下产生的误差,让受控物理量尽可能的接近目标值。
ki值越大,积分时乘的系数就越大,积分效果越明显。
I在使用时还有个问题:需要设定积分限制。防止积分量积得太大,难以控制。

三、微分控制算法

微分则是对偏差的变化趋势做出反应,根据偏差的变化趋势实现超前调节,提高反应速度。

为什么需要引入微分项呢,我打个比喻,假如在水位达到10m的时候,突然遇到了某些干扰,把水位突然加到了15m,此时系统在P和I的控制下还是能够重新稳定到10m,但是所需要的时间会比较长,此时就需要文峰控制来帮助比例控制沿着黑色线尽快使系统回到目标值

微分技术来公式:Kd*(当前误差值-前一个状态的误差值)
设Kd=0.5
那么此次微分输出值=0.5*(5-0)=-2.5

可以看出此时微分值为负数,和总输出量相加后,总输出量就会减少2.5,能够有效减少系统的波动。我们也可以吧微分控制当作一个“阻尼”的作用

回到上面水缸的例子,当发现水缸里的水位快要接近10的时候,加入微分项,可以防止水缸的水位超过10的高度,说白了就是减少控制过程中的震荡


看完后,回去再看公式,就能有一个很好的理解了

以上是我的对PID三个参数的粗略的总结,如果有错误的地方还望指出(大佬们勿喷)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PID算法原理 一简单的认识一下PID的三个参数的作用 的相关文章

  • Mysql基础(十九):锁

    目录 1 Mysql锁机制 1 1 乐观锁和悲观锁 1 1 1 乐观锁 1 1 2 悲观锁 1 2 共享锁与排他锁 1 2 1 共享锁 1 2 2 排他锁 1 3 行锁与表锁 1 3 1 行锁 1 3 2 表锁 1 4 间隙锁 1 4 1
  • 大数据时代的图表可视化利器——highcharts,D3和百度的echarts

    还记得阿里巴巴那个令人澎湃激情的双十一吗 xff1f 还记得淘宝生动形象地把你的的消费历程一一地展示给你看吗 xff1f 还记得那些酷炫拽的it报告图表吗 xff1f 在这个大数据越来越盛行的年代 xff0c 怎样去表达一些用户的关系 xf
  • 对三层和MVC的认识过程

    三层架构就是 MVC xff01 起初老师总说三层 MVC xff0c MVC 三层架构 所以开始的时候脑子就一个概念 xff1a 三层就是 MVC xff0c MVC 就是三层架构 而且想想也合理啊 xff0c 都是 三 MVC 是三个字
  • ROS雷达包出现:ERROR: cannot launch node of type: rplidar_ros

    ROS雷达包出现 xff1a ERROR cannot launch node of type rplidar ros 问题分析详情 问题分析 仅安装了基础ROS xff0c rplidar ros包没有安装 详情 下载包并解压缩 1 使用
  • nvidia-smi出现的比较慢

    一个比较老的问题 xff0c 一般四卡以上的机器可能会出现 以前我都是 nvidia span class hljs attribute smi span span class hljs attribute pm span span cla
  • 【tensorflow】tensorflow的安装及应用

    安装tensorflow的三种方法 1 在cmd命令行中输入pip install tensorflow xff0c 默认安装最新版 2 其他旧版本的安装 xff0c 去pypi org官网 可以点击release history选择想要的
  • 汇编:stmdb和ldmia指令

    参考了网上一些文章 xff0c 简单说一下stmdb和ldmia指令的作用 xff0c 如有错误欢迎指正 首先一句话说一下stmdb和ldmia指令 的作用 xff1a stmdb和ldmia指令一般配对使用 xff0c stmdb用于将寄
  • ARM 内联汇编 加速 算法

    首推移动端arm cpu优化学习笔记第4弹 内联汇编入门 xff0c 但是其只给出了代码 xff0c 很多人还不知道怎么在手机上跑起来 xff0c 其实只需要一个CMakeLists txt就可以了 cmake minimum requir
  • centos7.3环境编译安装pktgen-dpdk,dpdk工具

    概述编译环境编译DPDK编译Pktgen dpdkDebug 概述 DPDK xff08 Date Plane Development Kit xff09 主要基于Linux系统运行 xff0c 用于快速数据包处理的函数库与驱动集合 xff
  • 捷联惯导算法心得

    1 四个概念 xff1a 地理 坐标系 机体 坐标系 他们之间换算公式 换算公式用的系数 地理坐标系 xff1a 东 北 天 xff0c 以下简称 地理 在这个坐标系里有重力永远是 xff08 0 0 1g xff09 xff0c 地磁永远
  • Java中的域,静态域,实例域

    域 所谓的域 xff0c 是field的翻译 xff0c 也就是我们常说的字段 xff0c 或者属性 比如类的字段 xff08 属性 xff09 xff0c 局部的 xff0c 全局的 静态域 也就是静态属性 xff0c 我们可以单独为它设
  • 【线程篇】线程间同步之信号量、互斥锁

    线程 xff1a 进程内部的一条执行路径 xff08 序列 xff09 什么是线程什么是进程 xff0c 进程和线程的区别 xff1f 进程是一个正在运行的程序 xff0c 是系统进程资源分配的基本单位 线程是进程内部的一条执行路径 xff
  • PL/SQL报错:无法解析指定的连接标识符

    在安装oracle的时候PL SQL报错 xff1a ORA 12154 TNS 无法解析指定的连接标识符 xff0c 在网上找了很多资料 xff0c 然后问题解决 其中下面的文章分析的过程很值得学习 xff0c 特地转载过来时刻告诫自己全
  • 【idm】idm突破cookie封锁 (解决http:1.1 403 forbidden)(附charles使用教程)

    文章目录 一 问题二 解决方法 xff08 1 xff09 在chrome中获得cookies xff08 2 xff09 安装配置charles 三 另外的方法参考 idm的使用教程参考 xff1a 一 问题 使用idm下载文件出现如下问
  • 四旋翼飞行器数学建模+轨迹跟踪控制

    数学模型 xff08 状态空间方程 xff09 xff1a 控制算法 有限时间 xff08 finite time control xff09 控制 xff0c 文献 1 xff1b 比例 微分 xff08 PD xff09 控制 xff0
  • 卡尔曼滤波算法总结

    自己学习整理卡尔曼滤波算法 xff0c 从放弃到精通 kaerman 滤波算法 卡尔曼滤波是非常经典的预测追踪算法 xff0c 是结合线性系统动态方程的维纳滤波 xff0c 其实质是线性最小均方差估计器 xff0c 能够在系统存在噪声和干扰
  • 做嵌入式驱动的前途何在

    做嵌入式驱动的前途何在 做嵌入式linux驱动的前途何在 xff1f 或者说 xff0c 怎么才能做好这一行 xff1f 我做嵌入式驱动开发已经一年多了 xff0c 感觉没学到多少东西 从网络驱动到CAN驱动 从dataflash驱动到NA
  • 串口通信的调试01

    在开发中 xff0c 我们经常遇到这种情况 xff0c 供应商给了一台仪器 xff0c 然后仪器配套有软件 我们通过点击按钮往仪器发送命令 xff0c 仪器返回数据 有些时候 xff0c 我们希望可以通过自己编写的软件来操作仪器 xff0c
  • Linux驱动程序开发之三----按键驱动(Tiny6410)

    在Linux驱动程序开发之三 按键驱动 xff08 Tiny6410 xff09 博文中讨论了使用中断来实现按键驱动 xff0c 毫无疑问 xff0c 中断方式效率相当高 xff0c 但是在此之前 xff0c CPU要想获知按键的状态都是通
  • 飞控信号SBUS信号解析为PWM信号输出

    飞控信号SBUS信号解析为PWM信号输出 1 修改STM32时钟频率 xff1a static void SetSysClockTo72 void IO uint32 t StartUpCounter 61 0 HSEStatus 61 0

随机推荐