精华内容
下载资源
问答
  • PID算法

    千次阅读 多人点赞 2017-12-24 16:10:55
    PID算法

    PID算法网上不少,往往都是基于数学模型,在实际中导致使用难的问题,而数学模型属于理想的,没有深入本质讲解,本文从控制学的基础讲解。

    我们看一个生活例子,冬天洗热水澡,需要先放掉一段时间的冷水,因为水管里有一段冷水,热水器也需要一个加热过程,等过了这段时间之后水温有些接近目标值后,开始调节水龙头来调节冷、热水之间的比例及出水量,之后再慢慢的微调,在洗浴过程中感觉温度不合适,再一点点的调节。这个过程,其实就是PID算法过程。我们之所以微调,是因为水温的变化速度与我调节的速度不相匹配,存在一个滞后效应,我们需要调节一点点,等一下再感觉一下温度,不够再条件一点点,再感觉,这个过程就叫PID算法,也可以说,滞后效应是引入PID的原因。

    失去的能否找回来?能、只是我找回了纽扣,却发现衣服已经不再了。这个就是滞后效应。

    负反馈系统,都有滞后效应,但为什么运放、电源这类的却从来不提PID算法呢?这是因为这类系统的滞后延时时间非常短,若考虑这个延时,负反馈引入180度相位,延时恰好引入180度相位,则完全可能引起振荡。问题在于这个延时时间足够短,它的谐振频率点比较高,以运放为例,加入延时加上负反馈引起的谐振点为10MHz,但这颗运放的频率响应是1MHz,则在10MHz下完全不可能导致振荡,因为这个芯片的频响特性只有1MHz。我们常用的线性电源IC,比如SOT23封装的LDO,假如输出不加电容,就会输出一个振荡的波形,相对来说电源IC的滞后效应比运放要大,但是,因为电源一般后面都要接大电容的,它的频响特性很低,接近直流0Hz,所以当有电容时候,就无法振荡了。

    而工业控制领域,比如温度等,都是滞后效应很严重的,往往都是mS,甚至是10mS级别的,若直接用负反馈,因为激励与反馈的不同步,必然导致强烈的振荡,所以为了解决这个问题,我们需要引入PID算法,来实现这类滞后效应严重系统的负反馈控制,我们以高频感应加热设备加热工件,从常温25度加热到700度为例做说明:

    1、25~600度,100%的全功率加热工件,这是因为温差太大,前期要全功率,先加热到靠近目标温度。之所以考虑在600度,是因为滞后效应,若设定太高,当发现接近700度再停下来,但实际上,温度会冲过700度。当然,600度是一个经验值,以下几个温度点都是经验值,根据实际情况而来。

    2、600以上,开启P算法,P就是根据测量值与目标值的误差来决定负反馈的大小。P算法公式:反馈 = P *
    (当前温度-目标温度)。但因为负反馈是基于存在误差为前提的,所以P算法导致一个问题,永远到不了想要的值:700度。因为到了700度,反馈值就没有了。P算法的开启,进一步逼近了目标温度,假设稳态下可以达到650度,这样就算因为滞后效应导致的延时,也不会超过700度太多。

    3、当达到P算法的稳态极限650度附近的时候,比如640度,就应该开启另外一个算法解决P算法引起的极限误差,那就是I算法。I算法就是为了消除这个P算法导致的误差值,毕竟我们想要的是700度,而不是650度。I算法,本质上讲就是获取一个700度下对应的一个驱动值,之后用这个驱动值来取代P算法,那么我们怎么得到这个驱动值呢,唯一的手段就是把之前的误差都累加起来,最后得到一个期望值,这个期望值就是我们想要的驱动值。因为只要与目标值存在误差,那么把这些误差值积累起来再去反馈控制,就能一步步的逼近目标值,这如同水温不够高,再加一点点热水,不够高再加,这样总能达到想要的水温。值得注意的是,I算法不能接入太高,必须要在P算法的后期介入,不然很容易积累过大。这个时候可以引入一个误差门限,比如误差为60,当作6来处理,误差为50,当作5来处理,消除大的误差值,具体根据项目情况决定。

    4、当I算法把工件温度加热到很接近目标温度后,那么可以调节的范围就很小了,最后一点点的微动,让调节的每一次的变化,不要太大,这就是D算法。D算法本质上讲就是反对剧烈的变化,所以适用于达到目标温度的时候。

    PID算法其实不复杂,但从目前看,很多人都是因为对这三者的使用条件不了解导致的问题,都是从加热一开始,三个要素都上,结果可想而知。P算法是温度接近目标值的时候用,I算法是在P算法到稳态极限的时候用,D算法是达到目标值附近的时候用。实际项目中,D算法一般不用,效果不大。假如非要找一个现实中对应的实物,那么以开关电源为例,TL431基准电源比较器可以认为是P,输出滤波电容C是I,输出滤波电感是D,两者完全等价。它们各自的应用工作点可以认为:假设目标温度700度,600~800度:P算法;640~760度:I算法;690~710度:D算法。具体值,以实验为准,数据仅供参考。

    最后给出一个PID最通俗的解读:我们设计一样东西,一般都是先打个样,这个样跟我们想要的接近,但细节没到位,这就是P,样有差异,所以就要修改,拟合逼近,这就是I,到了定稿,就不允许随便修改了,就算要修改,也是有限制的修改,这就是D。

    展开全文
  • pid算法

    2014-10-11 23:04:44
    pid算法经常利用与电机、温度的调控!对于PID一般先调P、然后调I、在调D,这样就可以比较快和比较准确的调节PID
  • PID算法 PID算法 PID算法 PID算法 PID算法 PID算法
  • PID算法PID算法PID算法

    2010-10-29 22:36:33
    PID算法研究PID算法PID算法PID算法PID算法PID算法PID算法
  • 目录:一、简介二、二位式控制算法三、位置式PID算法1. P算法2. I 算法3. D算法四、增量式PID算法五、几种增量式PID算法的变形 一、简介 将偏差的 比例(Proportion)、积分(Integral) 和 微分(Differential) ...

    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.2.0开始烧水加热丝发热是否达到用户期望?停止加热yesno

    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算法的变形

    (ノ´▽`)ノ♪ 终于写到了这里了
    (╬ ̄皿 ̄)=○ 实不相瞒,这篇陆陆续续写十天了,要写疯了💢
    ಠ_ಠ 不想写了,我觉得没人有耐心看到这里了
    ▄█▀█● 不写了直接放文档吧,以后有心情了再更一篇[我鸽了,时隔这么久我还是没写🙅,要比较全面的了解一个东西,写一篇文章太难了]
    (╬◣д◢) 我不会放文档进来啊啊啊啊
    (づ ̄3 ̄)づ╭❤~ 别忘了一件三连鸭👍

    大家可以不用给我打评论发邮箱了,不如点点赞关注鸭。
    文档上传至【CSDN:https://download.csdn.net/download/weixin_42881419/11457239】 或者【Github:https://github.com/Hyf338/13th-NXP-Smart-car/tree/master/Docs/PID_docs】上,自行下载。

    展开全文
  • PID算法大全

    2017-03-19 21:10:14
    PID算法
  • 全场定位pid算法全场定位pid算法全场定位pid算法全场定位pid算法全场定位pid算法全场定位pid算法全场定位pid算法全场定位pid算法全场定位pid算法全场定位pid算法全场定位pid算法全场定位pid算法全场定位pid算法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,100
精华内容 3,640
关键字:

PID算法