初识PID

PID算法是连续系统中技术最为成熟、应用最为广泛的一种控制算法。该控制算法出现于20世纪30至40年代,PID 控制器以各种形式使用超过了 1 世纪,广泛应用在机械设备、气动设备 和电子设备。在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法

PID简介

Proportional(比例)、Integral(积分)、Differential(微分)的缩写。顾名思义,PID控制算法是结合比例、积分和微分三种环节于一体的控制算法


U(t):控制器的输出量
kp:比例系数
Ti:积分系数
Td:微分系数
err(t):误差

PID分为位置式PID增量式PID

位置式PID:

举一个究极经典的例子:水箱储水

比例控制:

一个水箱,我现在希望水箱的水位永远维持在1米
目前的水位是0.2米,我设P=0.5,此时误差err=(1-0.2)=0.8

t = 1:
U = P * err = 0.5 * 0.8 = 0.4
此时输出量为0.4,即水箱水位上涨0.4米,即此时水位0.6米,此时误差err=(1-0.6)=0.4

t = 2:
U = P * err = 0.5 * 0.4 = 0.2
此时输出量为0.2,即水箱水位上涨0.2米,即此时水位0.8米

P * err(比例项)

以此类推,最终水位会接近极限1米,根据P取值不同,系统最后都会达到1米
只不过P大了到达的快,P小了到达的慢一些,这就是最简单的比例控制

积分控制:

但但但但但是,纯比例控制是极其理想的情况,如果我每次加水都会漏0.1米高度的水,还是同样的目前的水位是0.2米,我设P=0.5,此时误差err=(1-0.2)=0.8

t = 1:
U = P * err = 0.5 * 0.8 = 0.4
此时输出量为0.4,即水箱水位上涨0.4米,再漏0.1米水位,即此时水位0.5米,此时误差err=(1-0.5)=0.5

t = 2:
U = P * err = 0.5 * 0.5 = 0.25
此时输出量为0.25,即水箱水位上涨0.25米,再漏0.1米水位,即此时水位0.65米,此时误差err=(1-0.65)=0.35

t = 3:
U = P * err = 0.5 * 0.35 ≈ 0.17
此时输出量为0.17,即水箱水位上涨0.17米,再漏0.1米水位,即此时水位0.72米

以此类推…当水位接近于0.8米的时候,err = 0.2U = 0.5 * 0.2 = 0.1 , 输出量于漏水量一致的时候,水位便不再继续增加,这就是静态误差
静态误差无可避免,只能减小。例如运动物体的摩擦阻力,灯泡发光产生的热能等等…

所以此时引入积分项 I
何为积分? 数学中对离散的量进行积分就是累加
∫err = 0.8 + 0.4 = 1.2 (假如只用两次就达到1米)

U = P * err + I ∗ ∫ error (比例+积分)
I ∗ ∫ error (积分项)

当水位为0.8米不动了的时候,且 I 取一个合适的值时,对前面的误差进行积分累加,积分项就可以打破这个“僵持”的局面,即 U > 0.1 ,水位会逐渐增加,最终到达1米的水位。把过去的误差纠正

微分控制:

P取的过大时,加水非常快,快接近1米的时候,如果不放缓速度,那么很有可能溢出1米的水位,此时我们需要回调一下接近速度

何为微分?数学中对离散的量进行微分就是对error 做差值

U = P * err(t) + I ∗ ∫ error + D ∗ ( err(t) − err(t−1) ) (比例+积分+微分)
D ∗ ( err(t) − err(t−1) ) (微分项)

水位在接近1米的变化中,err误差是越来越小的,所以微分项是越来越小直至变成负数。当D取合适的值时,对快接近一米时候的水位变化进行了有效缓冲,防止过度溢出1米水位
减小控制过程的震荡

C语言代码实现位置式PID:

int OUT,P_OUT,I_OUT,D_OUT,Error,Last_Error; //总输出、P输出、I输出、D输出、本次误差、上次误差
float P = 100.0 ; //随便写的值
float I = 100.0 ;
float D = 100.0 ;
int Target_value = 500 ; //希望系统达到的值
int value ;  //系统当前的值void PID
{Error = Target_value - value ;   //计算当前误差 P_OUT = P * Error ;              //比例项 I_OUT += I * Error ;             //积分项 D_OUT = D * (Error - Last_Error) ;    //微分项 OUT = P_OUT + I_OUT + D_OUT ;     //各项相加计算输出值 Last_Error = Error               //本次误差赋给上次误差
}

增量式PID:


比例P : e(k)-e(k-1) 这次误差-上次误差

积分I : e(i) 误差

微分D : e(k) - 2e(k-1)+e(k-2) 这次误差-2*上次误差+上上次误差

此公式可以看出,一旦确定了 Kp、Ki 、Kd,使用前后三次测量值的偏差, 即可由公式求出输出量增量,而不是对应与实际位置的偏差 ,也就是说不存在静态误差,与系统的实时运行状态及增量密切相关

C语言代码实现增量式PID:

int OUT,P_OUT,I_OUT,D_OUT,Error,Last_Error,Last_Error2; //总输出、P输出、I输出、D输出、本次误差、上次误差、上上次误差
float P = 100.0 ; //随便写的值
float I = 100.0 ;
float D = 100.0 ;
int Target_value = 500 ; //希望系统达到的值
int value ;  //系统当前的值void PID
{Error = Target_value - value ;         //计算当前误差 P_OUT = P * (Error - Last_Error) ;                    //比例项 I_OUT += I * Error ;    //积分项 D_OUT = D * (Error - 2*Last_Error + Last_Error2) ;     //微分项 OUT = Last_OUT + P_OUT + I_OUT + D_OUT ;     //各项相加计算输出值 Last_Error = Error ;         //本次误差赋给上次误差
} 

总结

位置式PID:

  • 通过目标值对当前值的误差比较进行公式运算,使其不断输出达到目标值
  • 每次输出均与过去的状态有关,计算时要对误差进行累加,运算工作量大
  • 非递推式算法,在执行机构不带积分部件的对象中可以很好应用

增量式PID:

  • 增量的确定仅与最近几次偏差采样值有关,容易通过加权处理获得比较好的控制效果
  • 误动作时影响小,高强度干扰时冲击小,便于实现无扰动切换
  • 积分截断效应大,有稳态误差

【算法】通俗易懂的PID算法相关推荐

  1. c语言程序位置式pid算法,位置式PID算法的C语言代码

    描述 位置式PID的C语言写法详解 PID调节口诀: 参数整定找最佳,从小到大顺序查 先是比例后积分,最后再把微分加 曲线振荡很频繁,比例度盘要放大 曲线漂浮绕大湾,比例度盘往小扳 曲线偏离回复慢,积 ...

  2. OCPC系列 - PID算法(理解PID算法)-比例控制算法、积分控制算法、微分控制算法

    OCPC中PID算法应用场景 任何一个广告投放体系在商业化的过程中必须考虑的两个因素就是,投放成本.投放量. 只有投放成本低于整个商业链条中可接受的成本,这个商业模式才能够成立,而投放量决定了这个模式 ...

  3. 智能小车c语言pid算法,智能小车pid算法

    3.1寻迹算法 采用PID(PD)控制算法,如果某时刻检测到黑线偏左,就要向左转弯:如果检测到黑线偏右,就要向右转.偏得越多,就要向黑线方向打越大的转角.这就是比例控制(P). 遗憾的是,因为小车有惯 ...

  4. arduino uno四路红外2轮循线小车(含PID算法)

    电机驱动采用的是DRV8833直流驱动模块,可以直接替换TB6612驱动模块,管脚基本完全兼容. 我把4路红外循线模块的高低电平分别对应1和0,然后有轻度偏离(0010,0100).中度偏离(1100 ...

  5. stm32直流电机控制—PID算法篇

    stm32直流电机控制-PID算法篇 一.常用的控制算法 1.控制系统的基本结构: 2.常用控制算法:位式控制 ①二位式控制算法 ②.具有回差的二位式控制算法 ③三位式控制算法 ④小结 二.PID控制 ...

  6. PID算法在STM32上的实现

    PID调节算法在STM32上的实现 (一)PID控制算法(P:比例    I:积分 D:微分) (二)首先先说明原理,使用的是数字PID算法,模拟PID算法在计算机这样的系统中是不能够直接使用的,数字 ...

  7. pid算法的MATLAB仿真 - 用MATLAB进行pid算法仿真实验

    算法理论知识 PID算法是工业应用中最广泛算法之一,在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正.PID算法已经有100多年历史,在四轴飞行器,平衡小车.汽车定速巡航.温度控制器等场景均有 ...

  8. PID算法优化(以平衡小车代码为例)

    PID控制 这篇文章是PID控制的进阶说明,如果没有看过PID控制(上)的读者,请先看看PID控制(上),以便更容易看懂这篇文章.关注微信公众号"电子搬砖师"即可阅读PID控制(上 ...

  9. PID算法的数字离散化

    PID算法的数字化 ​   PID算法的表达式: P(t)=Kp[e(t)+1TI∫e(t)dt+TDde(t)dt](1)P(t)=K_p[e(t)+\frac{1}{T_I}\int{e(t)dt ...

最新文章

  1. 一个框架解决机器学习大部分问题!
  2. 原始套接字SOCK_RAW
  3. 淺談Raid Cache Memory上應用的問題和實踐
  4. LeetCode-数组-35. 搜索插入位置
  5. IDEA中安装MyBatis Log Plugin插件完整显示执行的mybatis的sql语句
  6. 常用的 Http ContentType 对照表
  7. UI Configuration类型的determination 逻辑
  8. opencv python 生成画布_第16章 坚持一百秒(《Python趣味创意编程》教学视频)
  9. 如何成为一名网络工程师
  10. 2020 年 9 月程序员工资统计,新出炉!
  11. linux环境c语言实现who,Linux下C语言编程环境的搭建1
  12. 中企动力助天正生物争夺破伤风抗毒素全球话语权
  13. matlab数学实验报告面积,MATLAB插值实验报告数学实验
  14. python50图_菊安酱和菜菜的Python可视化50图
  15. 全国计算机互联网城市排名,中国互联网+城市排名:杭州第一 北京仅排第八
  16. NodeJs C++ addon(插件nan方式)
  17. 微信小程序按钮添加背景
  18. HTML+CSS+JAVASCRIPT 高仿低配网页版网易云音乐播放器 1
  19. module_init源码分析
  20. Unable to preventDefault inside passive event listener due to target being treated as passive 怎么办?

热门文章

  1. 【mac】「终端查看完整命令记录」「提示软件已损坏,无法打开」「sip~」「Vcsa安装」「errno 30」「E325」
  2. cookie和session的学习
  3. 小于三位的正整数 正则式_蓝调解码|样板文章,投稿必读:计算思维培养的“递进式”活动设计研究...
  4. 拉勾网许单单:没有一条通往远方的路不充满误解与委屈
  5. amazeui学习笔记一(开始使用3)--兼容性列表compatibility
  6. 关于计算机的英语笑话,双语笑话 假如生活是一台电脑
  7. 多个服务器数据互通_2020年4月7日部分服务器数据互通公告
  8. DELL戴尔外星人笔记本电脑Alienware m18 R1原装出厂Win11系统恢复原厂OEM系统
  9. hadoop虚拟机没有ens33
  10. 面向对象-理解多态看这一篇博客就行了