先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线

                    http://liuxinyu520zhuanshu.qzone.qq.com                                        

  在正式进入正文前,补充一下本人学习PID算法的背景,先自我介绍一下:本人一名大三电子专业的学生,到现在可以说我已经研究了快两年的PID,这期间做过帆板角度控制系统,做过平衡车,做过倒立摆,做过板球控制系统,做过openmv小球追踪系统,还做过四旋翼等……,可以说现在已经很熟悉PID算法,包括单级的PID算法和多级的PID算法。到现在感觉其实这个PID算法还是很经典,很有用的,那么简简单单的几行代码,就能实现自动追踪,自动跟随,平衡等操作,用途广泛。如果你不会PID算法,大多数控制其实你是实现不了的,如果这个经典而又简单的算法你不会,别的控制类的算法估计你也不会。可能让你做一件产品或是参加某些控制类比赛,显然,不会PID这些算法,你只能做简单的逻辑控制,而逻辑控制又太简单,几个if()语句判断显然是不满足控制类设计的需要的。另外,很多不需要PID算法的设计其实也是可以加入PID算法的,这能让你的设计更有稳定性,有些必须需要PID算法的设计,没有PID不能形成闭环控制,是根本不能完成的。

  扯淡的不多说,本人就喜欢简单粗暴,喜欢把复杂的东西简单化,很多的电子教程虽然把PID算法介绍的很全面,但是写的复杂的不得了,今天本人就用通俗易懂的语言把复杂的问题简单化:

  先解释一下传统的位式算法,也就是简单的逻辑算法:位式算法的输出要么是0,要么是1,也就是在一定条件下是全速运行,不满足这个条件就完全停止或反向全速运行。

  ①先拿恒温烧水系统来说,假如说你要把水烧到80度,简单的逻辑做法是在水里加一个温度传感器和电热烧水器,然后用单片机测温,如果if(温度<80度),那你就给电热烧水器加热烧水,如果if(温度>80度),那我就停止加热。思考一下,最后你得到的水温一定会是80(可以上下有微小差别)度吗?答案肯定是否定的。(这里说明一下,不要教条,不要问你为什么会把水烧到80度)这是为什么?我来解释一下,当传感器测到温度达到80度时,单片机控制加热器停止加热,虽然加热器断电了,但是加热器的余温还是比水的温度要高,所以加热器不会立即停止加热,而是继续给水加热一会儿直到和水的温度一样,此时水的温度会高于80度,可能电热器的余温就把水加热到了90度,对吧!然后水和加热器又一起降温,一般情况下加热器降温的速度会更快,所以当水的温度下降到80度时,加热器的温度又低于80度,这时传感器检测到水温低于80度,单片机又控制加热器加热,而此时加热器温度不够低于80度,所以需要预热一下再给水加热,在预热的这段时间里水的温度可能又降到了75度才开始加热。所以,水的温度不能保持在80度上下轻微浮动的范围内,水温一直都是在75度到90度之间浮动的!

  ②再拿平衡车系统来说,你需要一个陀螺仪传感器,比如(mpu6050),先说下平衡车的原理,避免有些人不懂,平衡车为什么两个轮子能站着不到,大家一定都军训过,站过军姿,站军姿的时候教官让你身体前倾,但是只能轻微的前倾,如果你能前倾45度,那你一定控制不住身体平衡,需要往前迈步才能达到平衡。平衡车跟这个原理是一样的,如果车要往前倒,那我让车轮前转来维持平衡,如果车往后倒,那我让车轮后传来维持平衡,原理都应该明白了吧!(如果这个原理还不明白建议不要学了,更不要搞控制方向了,避免学了半天还得转行浪费时间)继续,假设车上的陀螺仪角度0度时车是平衡的,如果角度大于0度我就让车轮前转,如果角度小于0度我就让车轮后转,显然这样做,车是平衡不了的,由于车的惯性作用,一下可能就过调了,直接倒了。原理跟烧水差不多,不多说了。

      再来解释下PID算法:

1.刚才介绍了半天位式算法,位式算法的输出就是简单的逻辑输出,不是0就是1,比如烧水,小于80度就接通烧水器的继电器,功率直接达到最大,当水温大于80度时,继电器就直接断开,功率直接降到最低。在平衡车上用位式算法解读就是,车的倾角<0度,电机控制器给-1,电机反向全速运转,车的倾角>0度时,电机控制器给+1,电机正向全速运转,位式算法的特点就是要不就全速运行,要不就直接停止。

2.PID算法就不一样了,PID算法通常输出的都是可以调节输出功率大小的,比如输出的PWM或直接输出电压值大小DAC(PWM即脉宽调速占空比),假设PWM的周期是255,当高电平占空比为255(100%)时相当位式算法输出的1,即全速运行,当高电平占空比为128(50%)时,输出的功率理论上为全速的一般。说到这大家就应该明白了,PID的输出是可以控制方向以及大小的。

  下面开始说PID算法:

  先说PID三个参数,P是比例,I是积分,D是微分;很多人都知道这三个参数,只是不了解其背后代表的含义,为啥用比例积分微分。不着急听我慢慢给你介绍,只要我介绍完,你一下就懂了。

  首先介绍一下P,P代表比例,光用一个比例算法其结构是这样的:

    err(误差)=setpoint(设定值)-actual_value(传感器测量的实际值)    (误差这个概念大家应该都明白)

    output(输出值比如PWM)=p(比例系数)*err(误差)

    比例反应的是现在的状态。

    这个比例系数P,需要你大概估测一下值是多少,比如平衡车,光一个比例控制就能让平衡车站半天了。比如设置平衡点为0度,此时实际的值为8度,此时误差就为-8度,输出的PWM值就等于(-8)*P。PWM=(-8)*P,这个P的具体值就需要你根据周期和占空比来估计决定,比如此时的PWM值应该是64才能让平衡车具有恢复平衡的能力,那么P的值就应该为8.0。这下大家应该明白了P这个参数该如何来设定。

   (时隔这个长时间,今天继续,当时说明天继续着,忙着考研拖了一个月了)

…………………………继续,以上是一个月之前写的,今天继续………………………………

在介绍一下积分I,积分分为好几种,这里先介绍两种:

1.普通的

    一般滴,没有单独用一个I控制的模型,所以这里用PI控制:

    err(当前误差)=setpoint(设定值)-actual_value(传感器测量的实际值)

    err_integral(误差的积分值)=err_integral(误差的积分值)+err(当前误差)

    output(输出值比如PWM)=p(比例系数)*err(误差)+I(积分系数)*err_integral(误差的积分值)

    这里介绍一下积分的作用,

    积分反应的是过去的状态。

    积分的意义:积分的作用就在于对误差的累加,我就根据实际情况来解释,比如说,我光用一个比例P来控制一个模型的运转,在误差较大的时候这个比例的作用起的很大,还是说平衡车,当角度误差值为8时,假定预测P=8.0,PWM=角度误差*P,此时PWM值为64,这时候电机可以按一定的速度转动起来,当偏差为0.5时,PWM的值就为4,当PWM为4的时候,根据电机的特性,可能因为这个4太小,电机根本连转的力气都没有,这时候本来平衡点应该是0,可到了0.5电机因为pwm值太小而不起作用,这样就始终达不到平衡点。那我现在加上积分,积分的作用就是把一个个的误差加起来,因为误差有正也有负,所以积分不会只朝着一个方向增大(正或负),比如误差在0.5时比例就失去了调节能力,那么此时积分就起作用了,积分会把这个0.5累加直到PWM值能够给电机充足的能量去达到0这个平衡点。一般积分I这个系数的值设为P*1/200.

2.积分分离算法

    普通的PI算法积分,积分会一直起作用,不管误差有多大,而当误差太大的时候,积分的一直累加运行会让系统产生过冲,一个普通的PID算法做的平衡车一上电时因为手持摆放的位置离平衡点太远会引起过冲,让平衡车一上电电机就猛地往一边冲,过一会儿才能好。

    为了解决这个问题可以用积分分离的方式,误差太大时,积分就不起作用,当误差小的时候,积分再起作用。能有效避免过冲。

    

    err(当前误差)=setpoint(设定值)-actual_value(传感器测量的实际值)

    if(err(当前误差)<某个值时)

    {err_integral(误差的积分值)=err_integral(误差的积分值)+err(误差)}

    else

    {err_integral(误差的积分值)=0}

    output(输出值比如PWM)=p(比例系数)*err(当前误差)+I(积分系数)*err_integral(误差的积分值)

最后咱们说微分D

微分反应的是误差的变化率

微分预测将来的状态。

    err(当前误差)=setpoint(设定值)-actual_value(传感器测量的实际值)

    if(err(当前误差)<某个值时)

    {err_integral(误差的积分值)=err_integral(误差的积分值)+err(误差)}

    else

    {err_integral(误差的积分值)=0}

    differential(微分)=err(当前误差)-last_err(上一次误差)

    执行完这句后

    last_err(上一次误差)=err(当前误差)

    output(输出值比如PWM)=p(比例系数)*err(当前误差)+I(积分系数)*err_integral(误差的积分值)+D(微分系数)*differential(微分)

总结,PID的算法基本含义就是,要观测当前的误差并进行调整,还要总结过去的误差来摆脱现状,还需预测未来的误差趋势加快调整。

转载于:https://www.cnblogs.com/LiuXinyu12378/p/8878582.html

pid算法通俗解释,平衡车,倒立摆,适合不理解PID算法的人来看!相关推荐

  1. Fleury (弗罗莱) 算法通俗解释

    Fleury (弗罗莱) 算法通俗解释 1.定义 2.举例说明 图2为连通图G,现利用Fleury算法求它的欧拉通路.(注意区分:欧拉通路.欧拉回路) 其中一种欧拉通路如下:4 5 8 7 6 8 9 ...

  2. PID算法通俗理解,平衡车,倒立摆,适合不理解PID算法的人来看!

    先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线(PID资料再我的另一篇博客里) 倒立摆资料连接↓ https://www.cnblogs.com/LiuXinyu ...

  3. pid算法(平衡车+风力摆)

    前段时间做了一辆平衡车,移植学长的代码,虽然做出来了,但是对于其中的pid控制还是不熟,这几天又重新研究了一下,现在来做一个总结,也供大家学习. 1.为什么要用pid 1.PID即:Proportio ...

  4. Matlab 仿真——单自由度倒立摆(3)PID控制器设计

    文章目录 0. 受控对象与设计要求 0.1 受控对象 0.2 设计要求 1. 控制系统结构 2. PID控制器设计 3. 那小车呢? 4. 几个问题 5. 参考 0. 受控对象与设计要求 这里列出上一 ...

  5. 【强化学习】优势演员-评论员算法(Advantage Actor-Critic , A2C)求解倒立摆问题 + Pytorch代码实战

    文章目录 一.倒立摆问题介绍 二.优势演员-评论员算法简介 三.详细资料 四.Python代码实战 4.1 运行前配置 4.2 主要代码 4.2.1 网络参数不共享版本 4.2.2 网络参数共享版本 ...

  6. 【毕业设计】基于PID控制的智能平衡车 - stm32 物联网 单片机 超详细

    文章目录 0 前言 1 课题背景 2 设计内容 3 设计方案 3.1 设计思路 3.3 硬件设计 3.4 软件设计 3.4.1 关键技术 - PID控制算法 3.4.2 关键技术 - 倾角估计算法 3 ...

  7. 神经网络算法有哪些模型,神经网络算法通俗解释

    神经网络算法实例说明有哪些? 在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能.构作专家系统.制成机器人.复杂系统控制等等. 纵观当代新兴科学技 ...

  8. 神经网络算法通俗解释,神经网络的数学表达式

    我想问一下什么是神经网络 神经网络可以指向两种,一个是生物神经网络,一个是人工神经网络.生物神经网络:一般指生物的大脑神经元,细胞,触点等组成的网络,用于产生生物的意识,帮助生物进行思考和行动. 人工 ...

  9. 通俗解释对称加密、非对称加密、散列算法与PKI

    这是我前些年写在51的,现在转过来,其实是CISSP的学习笔记,用自己的语言组织起来的,用通俗的话说明对称加密.非对称加密.散列算法.PKI(CA)到底都是干啥的.OK,进入主题: 密码学要解决的问题 ...

最新文章

  1. Redis学习-String
  2. kafka 不同分区文件存储_Kafka深入理解-1:Kafka高效的文件存储设计
  3. 数据库表-权限表应用
  4. QT的QJSEngine类的使用
  5. Codeforces 427 D. Match amp; Catch
  6. Java笔记-连接本地代理服务
  7. win10专业版 提供管理员权限才能删除文件夹
  8. Quartz的集群模式和单机模式共存-让一个非集群的Quartz与集群节点并行着运行
  9. POJ1007 UVA612 UVALive5414 ZOJ1188 HDU1379 Bailian4086 DNA Sorting【排序+逆序数】
  10. python_selenium简单的滑动验证码
  11. 计算机网络—五层知识架构图
  12. 弱电智能化施工组织设计方案
  13. 中国的量子软件无法再次失去三十年
  14. 01.网络工程师常识
  15. ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新
  16. 【Dongle】【数据库系统原理】模式分解之无损分解
  17. 轻量型网络之MobileNetV2: Inverted Residuals and Linear Bottlenecks论文学习
  18. python 比较运算符列表_python基础-列表,文件,运算符
  19. 用ps帧动画整个放置身份证示意图
  20. Python并行处理

热门文章

  1. mysql多实例配置使用方法
  2. 《Javascript高级程序设计》读书笔记之bind函数详解
  3. HTML5-WebSocket实现对服务器CPU实时监控
  4. 山重水复疑无路,柳暗花明又一村
  5. Centos7.x下Nginx安装及SSL配置与常用命令
  6. 博通1300亿美元收购高通,一场充满大饼和落井下石的“大戏”
  7. python-------装饰器
  8. C++走向远洋——26(项目二,2,构造函数与析构函数)
  9. 15个PHP库,你值得拥有!(下)
  10. ssential Diagram for Windows FormsC#/winForm类似visio的拓扑图节点连线控件免费下载