控制算法之PID算法 | 从入门到理解到应用 (一发入魂)

控制算法之PID算法 | 从入门到理解到应用 (一发入魂)目录 一 简介二 二位式控制算法三 位置式 PID 算法 1 P 算法 2 I 算法 3 D 算法四 增量式 PID 算法五 几种增量式 PID 算法的变形一 简介将偏差的比例 Proportion 积分 Integral 和微分 Differential 通过线性组合构成控制量 用这一控制量对被控对象进行控制 这样的控制器称 PID 控制器 二 二位式控制算法三 位置式 PID 算法 1 P 算法 2

PID算法 是控制算法中的经典算法,特别是在一个闭环控制系统中更为常用。自己曾是第十三届全国大学生“恩智浦”杯智能汽车竞赛的参赛选手,相信所有的选手在电机控制算法上大多都是用PID算法,本想好好使用这种算法,却无奈没有学过。而网上查阅资料却又是基本都是一些苦涩难懂数学公式和脍炙人口的一些PID语句,对于刚接触PID算法的人而言无异于天书。所以写此文章,意在用于分享自己对于PID算法的理解,希望可以帮助同样与我曾经有相同困惑的人排除困惑。
注:本文是自己通过查阅书籍和观看视频学习而得,若有错误,欢迎批评指正。

  • PS:感谢评论区的大佬指出我画的PID的图都有些小问题,但是我还画不好一个比较好的图来替代它们,所以大家可以根据自己所学,结合评论区大佬的建议看看。(QAQ我尽量早些画出比较好的图来替代。)
  • 2020.4.8:随着这篇文章的点赞数越来越多,首先感谢大家对我的肯定,其次,不好意思,我的图还没画出来,?大家一定要带着怀疑的心态看我的图片啊.❗️ 期待各位看官可以再给我提出新的问题和改进思路。?

一、简介

1.1控制系统 : 开环控制系统闭环控制系统

控制系统有几种分类方法,其中,按控制原理的不同,自动控制系统分为 开环控制系统闭环控制系统
开环控制系统

在开环控制系统中,系统输出只受输入的控制,控制精度和抑制干扰的特性都比较差。

Expect

用户自定义的期望值

控制算法

执行部件

控制对象

输出

闭环控制系统

闭环控制系统利用输出量同期望值的偏差对系统进行控制,可获得比较好的控制性能。闭环控制系统又称反馈控制系统

Expect

采集

反馈

用户自定义的期望值

控制算法

执行部件

控制对象

输出

传感器

由图中可以很明显的看出,此控制系统比开环系统多了一个环节——传感器,通过传感器进行 采集和反馈 到控制算法中,形成一个 闭合的回环 这也就是闭环控制系统中的闭环

1.2PID算法介绍

PID算法 是将 偏差比例( P roportion)积分( I ntegral)微分( D ifferential) 通过线性组合构成控制量,用这一控制量对被控对象进行控制,这样的控制器称PID控制器

偏差

偏差

偏差

传感器采集

单片机内设的期望值

比例P

积分I

微分D

求和

输出

简单来说,偏差= 用户设定的 期望值 — 传感器采集回来的 当前值,将偏差进行PID三个环节的计算,再进行求和、输出

二、二位式控制算法

2.1 为什么要解释二位式控制算法

二位式控制算法在某种程度上可谓是PID算法的前身,了解原理便可更好的理解PID算法。

2.2 以实例理解二位式控制

二位式控制算法输出的控制量只有高 \ 低 电平2种状态。
我们以烧水为例: 假设我们要求此控制系统要将水加热到100℃,当传感器采集反馈回的当前值 没有达到期望值 (100℃),便全高/低电平加热;当传感器采集反馈回的当前值达到期望值(100℃),便停止加热。

Created with Raphaël 2.3.0 开始烧水 加热丝发热 是否达到用户期望? 停止加热 yes no

2.3 引入惯性环节

一个简单的控制系统这么设计看似毫无问题,然而,由于我们的控制对象具有惯性,例如我们控制加热丝烧水,当我们达到指定温度 停止加热 的时候,加热丝不会马上冷却下来,水温还会继续升高,超过指定温度;而过了一会儿,水温冷却下来低于指定温度时,给加热丝通电,加热丝也 无法立刻把温度升上去
由于我们的控制对象(加热丝、电感、电容、电机等)具有 惯性,而二位式控制算法的 输出量只于当前状态有关,故很难达到 精确控制
eg:电机就是一个 具有惯性的对象,给他施加电压,不能马上转到对应的速度;撤去电压,电机也不能马上停下。
由于惯性环节的存在,会使控制对象超出期望由于惯性环节的存在,会使控制对象超出期望值。






三、位置式PID算法

①如果我们把二位式控制算法理解为数字量输出,那么PID算法则就是模拟量输出
②二位式控制算法只于当前偏差有关,而PID算法则是考虑到过去、现在、和未来的控制算法。
我们规定:用户期望值为 Expect,每隔一个固定时间对控制对象进行信息采样Xn,在此基础上,我们在三个环节中介绍三个序列。




3.1 P环节(现在)

P(比例)环节:对当前时刻的偏差进行比例放大。

  • 采样序列:系统中每个时刻采集回来的当前值 Xn
  • X1、X2、X3 … Xn-1、Xn
    第k时刻的 偏差e(k)=Expect — Xk
    • e(k)>0 : 控制系统还未达到期望值;
    • e(k)=0 : 控制系统已经达到期望值;
    • e(k)<0 : 控制系统已经超过期望值;


  • P环节的第k时刻的输出u(k)=Kp * e(k)
    • Kp:P比例系数,可以理解为放大倍数。
  • 单P算法中的缺陷:当系统不存在偏差(e(k)=0)时,执行部件便无输出,被控对象处于失控状态。
    在这里插入图片描述
    (每次系统输出,都会使得控制系统更加接近期望值,偏差ek不断变小,所以斜率不断变小)




3.2 I 环节(过去)

I(积分)环节:对过去所有时间的偏差进行积分。

  • 偏差序列e(k)=Expect — Xk
  • e1、e2、e3 … en-1、en
    ∑ei:对过去所有时间的偏差进行求和;
    • ∑ei<0 : 控制系统在 过去大部分时间段还未达到期望值;
    • ∑ei=0 : 控制系统在 过去大部分时间段已经达到期望值;
    • ∑ei>0 : 控制系统在 过去大部分时间段已经超过期望值;


  • I环节的第k时刻的输出u(k)=Ki * ∑ei 。(Ki:i比例系数)
    在控制系统刚启动时,由于I环节的 偏差累积效应,可以 更快的达到期望值。但同时也由于偏差的累积效应,使得系统第一次达到期望值时,过去所有时刻都未达标,即∑ei很大,所以曲线其实会超过期望的那条虚线并持续增长,所以,我们通常会在I环节中除以积分时间Ti,即u(k)=Ki * ∑ei/Ti
    另一个解决办法 我们后面在增量式算法中再进行讨论。




在这里插入图片描述

3.3 D环节(将来)

D(微分)环节:通过偏差的偏差,对控制系统的输出走向进行预判,起超前调节的作用。

  • 偏差的偏差序列:△ek=ek-ek-1
  • △e1、△e2、△e3 … △en-1、△en
    • △e(k)很大时,表示控制系统上一刻的输出很“陡峭”,表明控制系统离目标相差很远,所以D环节的输出也很大。
  • D环节的第k时刻的输出u(k)=Kd * △e(k)
    • Kd:D积分系数,除了超前预判,还可理解为阻尼力。

在这里插入图片描述

四、增量式PID算法

位置式PID:u(k)=Kp * e(k)+Ki / T * ∫ e(k) dt+Kd*d e(k);
增量式PID:u(k)=Kp * e(k-1)+Ki *e(t) +Kd *(e(k)-2e(k-1)+e(k-2));


很显然,对位置式PID进行求导(dx = f(x) – f(x-1)),就得到了增量式PID。
对于前面谈到的,位置式PID的 I 环节,是对过去所有时间的偏差进行积分,其输出与过去所有时间都有关,而增量式的PID只于最近的三个时刻的偏差有关。
其实,增量式PID我觉得也没有很多需要理解的,自然而然的代入应用即可。






//电机控制 增量式 P I 算法 Err_speed=Expect_speed-actual_speed; Err_dev_speed=Err_speed-Err_speed_last; Err_speed_last=Err_speed; gradinets=(int) (PID_P*Err_dev_speed+PID_I*Err_speed); 
 float PID_Cal(float Speed) { pid.SetSpeed = Speed; pid.Err = pid.SetSpeed - pid.ActualSpeed;//误差的计算,即比例控制 pid.Integral += pid.Err;//误差相加,即积分控制 pid.Voltage = pid.Kp * pid.Err + pid.Ki * pid.Integral + pid.Kd * (pid.Err - pid.Err_last);//根据位置型PID控制的公式 pid.Err_last = pid.Err; pid.ActualSpeed = pid.Voltage * 1.0; //转换 return pid.ActualSpeed;//PID控制后的实际输出值 } 

五、几种增量式PID算法的变形

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224416.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午11:59
下一篇 2026年3月17日 上午11:59


相关推荐

  • 十:Java之泛型

    十:Java之泛型

    2022年1月26日
    48
  • 01_Claude_Skill是什么_10分钟快速入门指南

    01_Claude_Skill是什么_10分钟快速入门指南

    2026年3月14日
    2
  • vsphere vsan配置_快船队最新消息

    vsphere vsan配置_快船队最新消息一直想抽空写写vSAN这个产品,在15年的时候笔者第一次听说vSAN这个产品,当时VMware还以VDI最佳拍档的方式去推广vSAN,短短两年的时间,vSAN经过多个版本的更新迭代,无论从功能还是稳定性上均有很大提升,最广泛的应用也由VDI变为了承载核心业务。这篇文章总结一下笔者对vSAN的一些学习和使用经验,简单介绍下vSAN,希望可以用最少的文字介绍清楚…

    2025年6月2日
    4
  • java c socket通信 中文乱码解决「建议收藏」

    java c socket通信 中文乱码解决「建议收藏」前言(扯淡)作为一个一直从事Java的人来说,突然做C++很多地方都是乱撞墙,就发送的这个乱码就让人感到十分头秃,昨天跟老板对话,老板说不行咱就花钱找别人做。。。能力别质疑的感觉真是让人糟心啊–不扯太多,程序员节快乐,大家一起头秃吧。。虽然我并不想秃。问题言归正传,c++接收信息是gb2312,Java发数据是UTF-8,我Java接收数据没有问题,但是发给C++就遇到乱码问题…

    2022年7月13日
    21
  • frameset ajax,js控制frameSet示例

    frameset ajax,js控制frameSet示例js 控制 frameSet 示例 1 js 修改 frameset 的 cols 属性来达到修改各个页面所占的宽高 例如隐藏当前 frame 页 复制代码代码如下 window parent document getElementsB frameset 0 cols 0 2 js 调用其他 frame 页面的函数 例如复制代码代码如下 parent subMainFrame show

    2026年3月17日
    2
  • python时间格式转换为美式日期,Python中time日期、时间格式转换

    python时间格式转换为美式日期,Python中time日期、时间格式转换在我们日常的数据采集中 时间 time 的重要性毋庸置疑的 因为它是衡量采集到的信息是否具有正确时效性的唯一因素 如果我们采集到的信息对于客户来说已经是过期的信息 这对于客户没有使用的价值 影响客户使用 所以我们今天就来说说在日常采集中遇到的时间如何正确采集 保证信息的时效性 1 gt 首先我们要获取当前的时间 才能有效的判断信息的时效性 importdateti 获取当前时间 gtime

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号