PID算法原理介绍

先来彻底搞懂PID到底是啥?

 PID,就是“比例(proportional)、积分(integral)、微分(differential)”,是一种很常见的控制算法。在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。

PID已经有107年的历史了,它并不是什么很神圣的东西,大家一定都见过PID的实际应用。比如四轴飞行器,再比如平衡小车......还有汽车的定速巡航、3D打印机上的温度控制器....来看下通过PID实现机器人骑自行车的文章:应用PID控制,让机器人学会骑自行车。

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

那么问题来了:比如,我想控制一个“热得快”,让一锅水的温度保持在50℃。这么简单的任务,为啥要用到微积分的理论呢。

你一定在想:这不是so easy嘛~!小于50度就让它加热,大于50度就断电,不就行了?几行代码用Arduino分分钟写出来。

 没错,在要求不高的情况下,确实可以这么干!如果换一种应用场景,你就发现有问题了:

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

所以,在大多数场合中,用“开关量”来控制一个物理量,就显得比较简单粗暴了。有时候,是无法保持稳定的。因为单片机、传感器不是无限快的,采集、控制需要时间。

而且,控制对象具有惯性。比如你将一个加热器拔掉,它的“余热”(即热惯性)可能还会使水温继续升高一小会。

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

  • 它可以将需要控制的物理量带到目标附近

  • 它可以“预见”这个量的变化趋势

  • 它也可以消除因为散热、阻力等因素造成的静态误差

  • ....

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

你应该已经知道了,P,I,D是三种不同的调节作用,既可以单独使用(P,I,D),也可以两个两个用(PI,PD),也可以三个一起用(PID)。关于PID原理应用的文章:PID控制在无人机中的应用。

 这三种作用有什么区别呢?客官别急,听我慢慢道来

3595ce865c880a7563c1ccc406dd9deb.gif

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

kP

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

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

  • 当两者差距不大时,就让加热器“轻轻地”加热一下。

  • 要是因为某些原因,温度降低了很多,就让加热器“稍稍用力”加热一下。

  • 要是当前温度比目标温度低得多,就让加热器“开足马力”加热,尽快让水温到达目标附近。

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

实际写程序时,就让偏差(目标减去当前)与调节装置的“调节力度”,建立一个一次函数的关系,就可以实现最基本的“比例”控制了。

kP越大,调节作用越激进,kP调小会让调节作用更保守。

要是你正在制作一个平衡车,有了P的作用,你会发现,平衡车在平衡角度附近来回“狂抖”,比较难稳住。

如果已经到了这一步,离成功只差一小步了。

kD

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

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

9c81fa19ae14005b75878a587061f393.gif

你心里设想一个弹簧:现在在平衡位置上。拉它一下,然后松手。这时它会震荡起来。因为阻力很小,它可能会震荡很长时间,才会重新停在平衡位置。

请想象一下:要是把上图所示的系统浸没在水里,同样拉它一下 :这种情况下,重新停在平衡位置的时间就短得多。

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

44878eaf7dc49098a177839b2957f6f4.png

因为,当比较接近目标时,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到底怎么调?

PID参数调整口诀:

参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大

曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢。微分时间应加长
理想曲线两个波,前高后低四比一
一看二调多分析,调节质量不会低

若要反应增快,增大P减小I

若要反应减慢,减小P增大I

如果比例太大,会引起系统震荡

如果积分太大,会引起系统迟钝

9418e510802180d830f2d72c619712b4.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将python代码编译成.so文件

https://moonlet.gitbooks.io/cython-document-zh_cn/content/ch1-basic_tutorial.html add_num.pyx文件 def add_nums(ls):total 0.for l in ls:total lreturn totalset_up.py from distutils.core import setup from Cython.Build import cythonizesetup(ext_modules cyth…

将iphone中的照片同步到电脑

在windows中: 去我的电脑,点iphone的图标,打开直接就是照片的文件夹,可以进行各种操作; 在mac中: 使用iphoto软件,选择iphoto的菜单栏中“iphoto”->"performance"->"gene…

雅虎公司C#笔试题

雅虎公司C#笔试题,包括问答题和选择题两部分。试试看,你能回答出多少题,可以通过雅虎的考试吗?Question 1. (单选)在计算机网络中,表征数据传输可靠性的指标是1. 传输率2. 误码率3. 信息容量4. 频带利用率Question 2. (单选)以下关…

打败opencv ,哦,是快了3倍

大家好,本文转自我一个读者朋友Homio的文章,推荐给大家,希望对做这方便的同学有所帮助。程序员,哦!不!软件工程师们都对opencv很熟悉,它在工作学习研究中起到了不可或缺的作用。但是它臃肿的身躯…

Linux内核裁减

Linux内核裁减 (1)安装新内核: i)将新内核copy到/usr/src下, #tar xzvf linux-2.6.38.4.tar.gz -----解压缩. ii) 将名为linux的符号链接删掉,这是旧版本内核的符号链接. #ln -s linux-2.6.38.4 linux ------建立linux-2.6.38.4的符号链接linux. &#x…

python 将一个字符list的列表扁平化成了一个list

a[[app,ap,ade],[er],[bcc,brt]] 将这么一个list 转换成 a2[app,ap,ade,er,bcc,brt] 做法:a2[x for tup in a for x in tup] 转载于:https://www.cnblogs.com/cheng-cheng/p/10027446.html

数据库中使用自增量字段与Guid字段作主键的性能对比(补充篇)-----转

我在发表过“据库中使用自增量字段与Guid字段主键的性能对比”这篇文章后,得到博客园各园友的很多评价,大家对我的测试方法也提出一些改进的方法。让我吃惊的是一园友提出:把guid和id的测试顺序颠倒一下,看下结果。今天就再测试一…

JDBC操作数据库就这八步!

1.載入JDBC驅動程式 內含於JDK中,名稱為"Sun.jdbc.odbc.JdbcOdbcDriver",可以使用"java.lang"套件下的 Class.forName()方法載入。 2.透過DriverManager類別建立Connection物件 於"java.sql"套件下可以運用到此JDBC API&a…

DEVC++出新版本了

昨天发了一篇文章C语言能判断一个变量是int还是float吗?然后有同学问我在Windows下是怎么写C代码的我是没有安装包的,只不过这个同学关系跟我不错,所以我就去找了下安装包,不找不知道,找了才发现,原来这个更…

iphone-common-codes-ccteam源代码 CCNSArray.h

//// CCNSArray.h// CCFC//// Created by xichen on 11-12-17.// Copyright 2011年 ccteam. All rights reserved.//#import <Foundation/Foundation.h>interface NSArray(cc)// 判断一个对象指针(不是对象的值)是否在数组中存在- (BOOL)isPointerExistsInArray:(id)…

TZOJ--1518: 星星点点 (二进制模拟)

1518: 星星点点 时间限制(普通/Java):1000MS/10000MS 内存限制:65536KByte 描述 输入一个由“*”和“.”组成的字符串&#xff0c;然后根据规则生成下一行字符串&#xff1a; 如果该行的第i和第i1个位置上的符号不同&#xff0c;则下一行的第i个位置上为“*”&#xff0c;…

关于反射的我的一些看法

关于反射的我的一些看法 最近因为项目的需要大量地使用了反射工厂,也看了大量的有关反射性能问题的讨论和各种测评.总的感觉是反射的性能太低,不适合在性能要求高的地方使用.但根据我多年的网站开发经验来看,一个WEB网站的性能关键一般只会是看数据表的设计是否合理,更进一步的…

EPOLL模型

最近在公司里面主要负责一些手机网络游戏的服务器端的编写。虽然接触时间不多&#xff0c;但是感触良多。特意将我此段时间的体会和大家分享。 以前公司的服务器都是使用HTTP连接&#xff0c;但是这样的话&#xff0c;在手机目前的网络情况下不但显得速度较慢&#xff0c;而且不…

小鹏汽车面试经验分享

大家周一好&#xff0c;这篇文章转自我的朋友李纳克斯&#xff0c;在做工作的同事&#xff0c;去面试也能增长自己的技术面和技术深度。推荐给大家&#xff0c;希望对大家有所帮助。某个下午&#xff0c;小鹏汽车的HR在招聘软件上撩我&#xff0c;于是我决定去聊聊看。接触下来…

(Bezier)贝塞尔曲在路径规划的运用,机器运动控制常用

前言之前被安排了活&#xff0c;一个局部区域机器运动控制的工作&#xff0c;大致是一个机器位于一个极限区域时候&#xff0c;机器要进入一个特殊的机制&#xff0c;使得机器可以安全的走出来。其中用到了bezier曲线进行优化路径&#xff0c;今天写一下&#xff0c;正好也给大…

IT部门绩效考核:一本糊涂账?

IT部门绩效考核&#xff1a;一本糊涂账&#xff1f; 作者&#xff1a; 三人行  来源&#xff1a;赛迪网 http://www.csai.cn 2005年11月02日 AMT-企业资源管理研究中心 高级顾问 姚磊 北京新华信管理顾问有限公司 顾问 宋炜 光明乳业信息总监 赵春雨 明基逐鹿人力资源咨询…

Spark安装

1 Spark安装地址 运行环境:CentOS 6.8 Hadoop 2.7.2JDK 1.8Scala 2.11.8Spark 2.1.1 集群以3台机器模拟:hadoop202 hadoop203 hadoop204 1&#xff0e;官网地址 http://spark.apache.org/ 2&#xff0e;文档查看地址 https://spark.apache.org/docs/2.1.1/ 3&#xff0e;下载地…

mysql开启慢查询日志及查询--windows

转载地址&#xff1a;http://blog.csdn.net/ljasdf123/article/details/9713523 MySQL慢查询配置 1. 慢查询有什么用? 它能记录下所有执行超过long_query_time时间的SQL语句, 帮你找到执行慢的SQL, 方便我们对这些SQL进行优化. 2. 如何开启慢查询? 首先我们先查看MYSQL服务器…

如何成为“10倍效率”开发者

导读&#xff1a;Brad Feld的一篇文章The Rise of Developeronomics中提到了“10倍效率的开发者&#xff08;10x developer&#xff09;”的概念&#xff08;伟大的开发者的效率往往比一般的开发者高很多&#xff0c;而不只是一点点&#xff09;&#xff0c;Adam Loving在读了之…

当然可以不努力

我刚开始觉得他说的不对&#xff0c;现在越看越觉得他说的有道理。我们这一代人&#xff0c;太容易被别人影响&#xff0c;小的时候&#xff0c;觉得要赶上别人家的孩子&#xff0c;所以就努力读书&#xff0c;努力干家务。长大了一些&#xff0c;要用功的工作&#xff0c;用功…