LZ以前有个小小的理想,就是让手边的MCU自己“思考”起来,写出真正带算法的程序。
前段时间做一个比赛项目的过程中,对经典、实用的PID算法有了一点点自己的理解,就写了这些,与大家分享
因为LZ想尽办法,试着用最易于理解的语言说清楚原理,不做太多的理论分析。(LZ文学功底不行),
所以下面的内容会有不严谨的地方,或者有解释错误的地方。大神们发现了,一定要帮我补充,或者给予批评~~~谢谢你们

好啦,正文开始:

啥是PID? PID可以吃吗?

PID,就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很常见的控制算法。算法是不可以吃的。
到LZ发帖的这一天,PID已经有105年的历史了

它并不是什么很神圣的东西,大家一定都见过PID的实际应用

——比如四轴飞行器,再比如平衡小车……还有汽车的定速巡航、3D打印机上的温度控制器….
再比如动物园里的海狮,将一根杆子直立着顶在头上(OOPS,这个也算..)

就是类似于这种:需要将某一个物理量“保持稳定”的场合(比如维持平衡,稳定温度、转速等),PID都会派上大用场。

那么问题来了:
比如,我想控制一个“热得快”,让一锅水的温度保持在50℃
这么简单的任务,为啥要用到微积分的理论呢你一定在想:
这不是so easy嘛~ 小于50度就让它加热,大于50度就断电,不就行了?几行代码用Arduino分分钟写出来

没错~在要求不高的情况下,确实可以这么干~ But! 如果LZ换一种说法,你就知道问题出在哪里了:

如果我的控制对象是一辆汽车呢?
要是希望汽车的车速保持在50km/h不动,你还敢这样干么

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

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

这时,就需要一种『算法』:

它可以将需要控制的物理量带到目标附近
它可以“预见”这个量的变化趋势
它也可以消除因为散热、阻力等因素造成的静态误差
….

于是,当时的数学家们发明了这一历久不衰的算法——这就是PID。

你应该已经知道了,P,I,D是三种不同的调节作用,既可以单独使用(P,I,D),也可以两个两个用(PI,PD),也可以三个一起用(PID)。
这三种作用有什么区别呢?客官别急,听我慢慢道来

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

kP

P就是比例的意思。它的作用最明显,原理也最简单。我们先说这个:

需要控制的量,比如水温,有它现在的『当前值』,也有我们期望的『目标值』。

当两者差距不大时,就让加热器“轻轻地”加热一下。
要是因为某些原因,温度降低了很多,就让加热器“稍稍用力”加热一下。
要是当前温度比目标温度低得多,就让加热器“开足马力”加热,尽快让水温到达目标附近。

这就是P的作用,跟开关控制方法相比,是不是“温文尔雅”了很多

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

要是你正在制作一个平衡车,有了P的作用,你会发现,平衡车在平衡角度附近来回“狂抖”,比较难稳住。
如果已经到了这一步——恭喜你!离成功只差一小步了~

kD

D的作用更好理解一些,所以先说说D,最后说I。

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

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

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

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

kD参数越大,向速度相反方向刹车的力道就越强。

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

等等,PID三兄弟好想还有一位。看起来PD就可以让物理量保持稳定,那还要I干嘛?
因为我们忽视了一种重要的情况:

kI

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

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

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

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

作为一个人,根据常识,我们知道,应该进一步增加加热的功率。可是增加多少该如何计算呢?
前辈科学家们想到的方法是真的巧妙。

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

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

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

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

这篇就写到这里。要想直观地体验PID的控制作用,需要一个具体的东西来调试。
LZ以后完成倒立摆项目后,会用一些视频来演示PID参数的整定方法。
原文来自DF创客社区
地址:http://www.dfrobot.com.cn/community/thread-14783-1-1.html

---------------------
作者:斜杠青年/
来源:CSDN
原文:https://blog.csdn.net/he__yuan/article/details/80739800

[转] PID算法的解析()相关推荐

  1. PID算法详细解析——基于单片机

    本文主要是分享资料,讲解不会太多,因为分享的资料里面就有具体的详细解析,而且百度上面也有详细的资料,所以本次博文主要是讲解我用PID算法调温的经验. PID算法调整温度最大的问题的温度的上升问题以及温 ...

  2. 三菱PLC增量式PID算法FB(带死区设置和外部复位控制)

    关于PID废话不多说,各种位置式增量式资料和公式网上也非常多.PID从提出和发展目前已经一个世纪过去了,还在不断研究创新,足见它的重要性.本篇博文给出三菱FX系列增量型PID的源代码.(三菱系列的优化 ...

  3. 控制算法-PID算法总结-从公式原理到参数整定解析(附C源码)

    目录 一.控制系统 1.1控制系统的分类 1.2 性能指标 二.PID算法的起源及特点 三.PID应用 四.PID公式原理 五.PID源码 六.PID整定方法 6.1 经验法 6.2 衰减曲线法 6. ...

  4. 对串级PID控温算法的解析

    ​​​​​​​目录 前言 单级PID 串级PID 系统分析 算法分析 总结 前言 笔者在做项目的过程中,需要对一个目标物体做精确控温,精度要求±1℃,需要在两分钟内使用电阻发热贴将温度由20控制到41 ...

  5. PID闭环控制算法解析(最透彻)

    PID闭环控制算法解析 PID简介 P Proportion(比例) 就是输入偏差乘以一个常数 I Integral(积分) 就是对输入偏差进行积分运算 D Derivative(微分) 对输入偏差进 ...

  6. 【控制理论】——控制系统分类PID算法简介PID参数整定PID上位机通信协议

    目录 ​ 前言 一.PID算法 1.控制系统分类&参数&信号 2.PID算法简介 二.PID参数整定 三.PID上位机通信协议 1.数据帧&协议调试 2.协议代码实现 拓展: ...

  7. PID算法入门与C语言代码实现

    PID算法的入门理解以及C代码实现 在结束了自控原理的学习后,了解到PID算法是一种万能算法,在课设中也是经常使用到的一种算法,所以想具体的来进行以下总结与学习,如果有错漏的地方,欢迎大家共同来探讨与 ...

  8. matlab整定串级pid,PID算法在Matlab串级控制中的应用

    PID算法在Matlab串级控制中的应用 自114 1112002039 陈艳 前言:这个专题是由王娟老师给我们授课,我感觉收获挺大的,尤其是matlab仿真软件的使用,为我以后的实验课打下良好的基础 ...

  9. C语言实现PID算法:位置式PID和增量式PID

    原创者微信公众号 PID算法可以说是在自动控制原理中比较经典的一套算法,在现实生活中应用的比较广泛. 大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID ...

最新文章

  1. Linux命令grep
  2. java实现layui分页,MVC下实现LayUI分页的Demo
  3. php mysql 日期时间_php Mysql日期和时间函数集合
  4. 自定义spring boot的自动配置
  5. RGB_D_开发征程(使用Kinect)
  6. HDU - 7031 Power Station of Art 思维 + 二分图模型
  7. 离人愁有用计算机怎么写歌词,离人愁歌词是什么意思 今两股痒痒什么意思
  8. tomcat7.0支持什么版本的jdk_恭喜你喜提JDK,那你知道JDK是什么吗?先来看看吧
  9. python学习笔记8-列表、集合、字典推导式
  10. virtualenvwrapper
  11. Pytorch nn.BCEWithLogitsLoss()的简单理解与用法
  12. leetcode 【 Add Two Numbers 】 python 实现
  13. Python 使用itchat 获取微信好友信息并解析(性别 区域 头像 签名等)
  14. git | 如何移除 Untracked files?
  15. 构建具有丰富功能的交互式 Kiosk
  16. 2021-11-12 Android 11 长按按键进入恢复出厂设置的实现方法-PhoneWindowManager里面用发广播的模式
  17. 电话号码344格式,修改也保持344格式
  18. 关于修复EeePC1008Ha在Ubuntu下系统快捷键部分失灵的解决
  19. 缠中说禅板块强弱指标的实现(具体代码)
  20. Android-自定义桌面小部件【完成小米MIUI小部件】

热门文章

  1. 关于手机拍照识别二维码
  2. 超级简单的视频调色教程分享
  3. 移动小人Python程序
  4. 浙大计算机学院博士生读几年,中国200万在读硕士生和博士生,每月能拿到多少补助?...
  5. 【算法练习】字符串处理 poj2690:首字母大写
  6. MAC电脑配置maven
  7. windows bat
  8. 使用BeautifulSoup爬取小猪短租的租房信息
  9. 数据结构课程设计---魔王语言解释
  10. 小程序推送服务通知(前后端代码)