增量式PID计算公式4个疑问与理解
一开始见到PID计算公式时总是疑问为什么是那样子?为了理解那几道公式,当时将其未简化前的公式“活生生”地算了一遍,现在想来,这样的演算过程固然有助于理解,但假如一开始就带着对疑问的答案已有一定看法后再进行演算则会理解的更快!
首先推荐白志刚的《由入门到精通—吃透PID 2.0版》看完一、二章之后,建议你先通过实践练习然后再回来看接下来的所有章节,这样你对这本书的掌握会更加牢固、节省时间。
PID就是对输入偏差进行比例积分微分运算,运算的叠加结果去控制执行机构。实践练习中,如何把这一原理转化为程序?为什么是用那几个error进行计算?
以下是我摘录的一段PID程序,我曾用其对智能车的速度进行闭环控制:
P:Proportional 比例
I:Integrating 积分
D:Differentiation 微分
Pwm_value:输出Pwm暂空比的值
Current_error:当前偏差 last_error:上次偏差 prev_error:上上次偏差
增量式PID计算公式:
P=Kp*(current_error﹣last_error);
D=Kd*(current_error﹣2*last_error﹢prev_error);
I=Ki*current_error;
PID_add=Pwm_value+P﹢I﹢D;
一、为什么是PID_add=Pwm_value+(P﹢I﹢D)而不是PID_add=P+I+D?
如左图,有一个人前往目的地A,他用眼睛视觉传感器目测到距离目的地还有100m,即当前与目的地的偏差为100,他向双脚输出Δ=100J的能量,跑呀跑,10s之后,他又目测了一次,此时距离为40m,即current_error=40,他与10s前的偏差last_error=10对比,即current_error—last_error=—60,这是个负数,他意识到自己已经比较接近目的地,可以不用跑那么快,于是输出Δ=100+(—60)=40J的能量,40J的能量他刚好以4m/s的速度跑呀跑,10s之后,他发现已经到达目的点,此时current_error=0,大脑经过思考得出current_error—last_error=0—40=—40,两脚获得的能量Δ=40+(—40)=0,即他已经达到目的地,无需再跑。在刚才的叙述中,可知增量式P+I+D输出的是一个增量,将该增量与调节量相加后的到的才是最终输出量,P+I+D反应的是之前的输出量是在当前的状态中是该增加还是该减少。
二、纯比例控制P=Kp*(current_error﹣last_error),怎样理解﹙current_error﹣last_error ﹚?
PID中纯比例控制就是把被控制量的偏差乘以一个系数作为调节器的输出,在增量式PID中,反映在程序上的,我们被控制量就是error,而实际上,例如在速度控制中error=目标速度﹣当前速度,所以明确目的:我们通过控制error趋近于0,最终使得当前速度趋近于目标速度。
如右图,假如考试时有这么一种题:函数经过时间Δt,由y1变化为y2时,问y增长的比例为多少?你很容易地得出答案:K=﹙y2-y1﹚/Δt;
以速度控制为例,若y为error,得右图,在时间t1到t2的过程中,我们可以得到输出控制量error变化的趋势为(current_error—last_error)/Δt。得到偏差的变化趋势后,乘以Kp使输出量与error相对变化。这个道理犹如模拟电子电路中,声音信号经过功放管放大输出的信号与输入信号相对应变化。
三、微分控制:
然而,通常情况下,我们的被控制量并非纯比例式地变化,如下图:
比例表示变化趋势,微分则表示变化趋势的变化率,映射到一个图像曲线中即为导数的变化!图3中若求曲线中x2至x1某点的斜率,当Δt足够小时,则可近似为(y2—y1)/Δt ,可知x3到x1导数的变化为﹛﹙y3—y2﹚—(y2—y1﹚﹜/Δt =﹙y3—2*y2﹢y1﹚/Δt 。将不同时间的y1、y2、y3映射为prev_error、last_error、current_error;则error变化趋势的变化为﹛﹙current_error—last_error﹚﹣﹙last_error—prev_error﹚﹜/Δt=﹛﹙current_error—2*last_error﹢prev_error﹚﹜/Δt,可得微分D=Kd*(current_error﹣2*last_error﹢prev_error)。 在系统中加入微分放映系统偏差信号的变化率,能预知偏差变化的趋势,具有超前控制作用,提前处理偏差。
四、积分控制:
积分控制可以消除偏差,体现在公式中较容易理解,当前的偏差差经过系数Ki的放大后映射为输出控制量,即I=Ki*current_error。P只要前后偏差之差为0,即current_error—last_current=0,则不进行调节,D只要前后偏差变化率为0,即(current_error﹣2*last_error﹢prev_error)=0,则不进行调节。而对于积分只要偏差存在,调节就始终进行,因此积分可以消除误差度,但在在某些情况下,一定范围内的误差是允许的,而如果此时积分调节始终存在,可能会导致系统稳定性下降,如右图,此时可通过弱化积分系数Ki使系统稳定。
增量式PID计算公式4个疑问与理解的更多相关文章
- C 语言实现增量式PID
一直以来,pid都是控制领域的经典算法,之前尝试理解了很久,但还是一知半解,总是不得要领,昨天模仿着别人的代码写了一个增量式pid的代码. 我的理解就是pid其实就是对你设置的预定参数进行跟踪.在控制 ...
- 增量式PID的stm32实现(转)
源:增量式PID的stm32实现,整定过程 首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异. 资料上比较多的是: 还有一种是: ...
- 增量式PID简单翻板角度控制
1.研究背景 随着电子技术.信息技术和自动控制理论技术的完善与发展,近来微型处理器在控制方面的应用也越来越多.随之逐渐渗透到我们生活的各个领域.如导弹导航装置,飞机上仪表的控制,网络通讯与数据传输,工 ...
- 位置式PID与增量式PID算法
位置式PID与增量式PID算法 PID控制是一个二阶线性控制器 定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能. 优点 ...
- 位置式PID与增量式PID
//位置式PID float Kp; float Ki; float Kd; float eSum,e0,e1; float pid_control(float now,float target) { ...
- 【转】位置式、增量式PID算法C语言实现
位置式.增量式PID算法C语言实现 芯片:STM32F107VC 编译器:KEIL4 作者:SY 日期:2017-9-21 15:29:19 概述 PID 算法是一种工控领域常见的控制算法,用于闭环反 ...
- 增量式pid和位置式PID参数整定过程对比
//增量式PID float IncPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue)//err»ý·Ö·ÖÀë³£Êý { PIDx-& ...
- 增量式PID的matlab实现
首先,增量式PID的实现公式: 式中 Δe(k)=e(k)-e(k-1) 进一步可以改写成 式中 . . 为了便于理解,也可写成: 式中e(k)为第k次采样时的设定值与实际值的差,e(k-1 ...
- 外置式与增量式PID模板程序(51单片机c语言)
外置式PID模板 #define MuBiaoCS 0 //目标常数 #define CHang_aCS 0 //比例常数 #define CHang_bCS 0 //积分常数 #define CHa ...
随机推荐
- 对jQuery选择器的总结
jQuery基础选择器 $("div*")获取div下面的所有元素 $(".red,.green").html("怎么") // 需要注意的 ...
- Snabbt.js – 极简的 JavaScript 动画库
Snabbt.js 是一个简约的 JavaScript 动画库.它会平移,旋转,缩放,倾斜和调整你的元素.通过矩阵乘法运算,变换等可以任何你想要的方式进行组合.最终的结果通过 CSS3 变换矩阵设置. ...
- 闭包和this
一.闭包 最开始理解闭包是在一个函数内部定义一个函数,可以在外面的环境里进行调用.现在对于闭包的理解是利用函数来保存作用域内的对象. 理解闭包首先要理解执行上下文,变量对象,活动对象,作用域链.因为执 ...
- Delphi 获取系统时间后格式化输出
问题:客户现场程序运行提示时间格式不对导致的错误,原因是与开发环境及公司内部测试环境的日期格式不一致: 解决:统一强制转换: //引用单元:SysUtils //目的:实现跨环境兼容不同日期格式,如果 ...
- SAP用户权限解剖及自修改
通常BASIS会使用PFCG做权限管理,时你保存时会产生一个系统外的profile name,记得SU01时用户有profile 和role两栏位吗?它们的关系如何呢? 首先明白几个概念.1.acti ...
- ArcPy之Python介绍
1.Python简介 Python是一种面向对象.解释型计算机程序设计语言;Python是一种简单易学,功能强大的编程语言.它有高效率的高层数据结构,简单而有效地实现面向对象编程.Python简洁的语 ...
- iis7.5安装配置php环境
前言 iis7.5是安装在win7.win8里的web服务器,win2003.win2000的web服务器使用的是iis6.0,由于win7.win8系统相比win2003.win2000有了改新革面 ...
- JavaScript学习09 函数本质及Function对象深入探索
JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...
- 操作系统开发系列—12.a.从Loader到内核 ●
Loader要做两项工作,我们先来做第一项,把内核加载到内存: 1.加载内核到内存. 2.跳入保护模式. 首先编译无内核时: nasm boot.asm -o boot.bin nasm loader ...
- linux 系统权限 数字含义
摘抄: sudo chmod XXX dir_name XXX是你要设置的权限代号,第一位代表Owner,第二位代表Group,第三位代表Others XXX中0代表什么都不可以,1代表可执行,2代表 ...