文档章节

手把手教你看懂并理解Arduino PID控制库——微分冲击

欧阳天华
 欧阳天华
发布于 2016/12/21 16:42
字数 962
阅读 1473
收藏 0
点赞 1
评论 1

引子

本文将分析《手把手教你看懂并理解Arduino PID控制库》中第二个问题:设定值改变对微分项的影响。语文不好,原文中叫做Derivative Kick,实在是想不出好的名字,暂且称为微分冲击。

问题定义

既然叫做微分冲击,那么这个问题肯定和微分项有关,并且是微分项会受到一个突发状况的影响,产生一个较大的冲击,详见下图。

从第一张图看出,当设定值产生一个阶跃后,被控量Input随着时间慢慢向设定值靠近,第二张图反应的是设定值产生阶跃后控制量Output的变化,可以发现,Output会突然产生一个较大的阶跃,具体原因可以参考“万恶”的PID经典控制方程。第三张图描述的是Output的梯度(也就是变化率:值变化:时间变化),同样可以发现一个脉冲,并且这个脉冲可能会非常的大(dt非常小),远远超过Output变化量。同理,图中页描述了当设定值突然减小,Output及其对应的梯度变化情况。对于一般的系统来说,我们不希望这样的突变发生(可以想象如果采样周期很长,那么这个冲击会持续很长时间,系统估计就飞起来了)。当然如果你的系统需要这个冲击,那么这个问题就可以忽略,下面的解决方案也就不需要浏览。

解决方案

首先,感谢我们伟大的数学家,结合经典PID控制方程,来看一个公式:

Setpoint这一项就会产生一个巨大的冲击,而且仅会产生一次,在下一个计算周期就会消失。处理的方法很多,最简单的就是讲Serpoint这一项移除,也就是认为对于微分项来说不存在设定值的改变。如果这么处理,系统会不会失控呢?这种玩法已经和我们根深蒂固的经典PID理论不一样了啊!!这怎么整!

上述问题的答案是不会,我们将上述过程写成数学表达式:

 

用Input变化量取反来代表Error的变化(其实就是忽略Setpoint的变化)。这里不讨论经典的PID控制方程,我们的目标是使Input根据Setpoint往我们预计的方向靠拢,上述做法无可否认,与经典PID方程不一致,但核心思想是一致的。由于Setpoint变化仅对Output产生一次影响(也就是产生了那个尖峰),一旦步入一下个计算周期,Output就不在收到Setpoint变化的影响,回归正常,不影响PID调节(具体影响图示,请参照文末)。

代码

/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double errSum, lastInput;
double kp, ki, kd;
int SampleTime = 1000; //1 sec
void Compute()
{
   unsigned long now = millis();
   int timeChange = (now - lastTime);
   if(timeChange>=SampleTime)
   {
      /*Compute all the working error variables*/
      double error = Setpoint - Input;
      errSum += error;
      double dInput = (Input - lastInput);
 
      /*Compute PID Output*/
      Output = kp * error + ki * errSum - kd * dInput;
 
      /*Remember some variables for next time*/
      lastInput = Input;
      lastTime = now;
   }
}
 
void SetTunings(double Kp, double Ki, double Kd)
{
  double SampleTimeInSec = ((double)SampleTime)/1000;
   kp = Kp;
   ki = Ki * SampleTimeInSec;
   kd = Kd / SampleTimeInSec;
}
 
void SetSampleTime(int NewSampleTime)
{
   if (NewSampleTime > 0)
   {
      double ratio  = (double)NewSampleTime
                      / (double)SampleTime;
      ki *= ratio;
      kd /= ratio;
      SampleTime = (unsigned long)NewSampleTime;
   }
}

代码用Input的变化取代了Error的变化。

结论

  1. Output梯度尖峰被去除
  2. 控制量原来存在一个尖峰被消除
  3. 被控量的微分变得较为平坦

NOTE:如有不足之处请告知。^.^

下一章将介绍如果在系统运行过程中,突然改变PID控制参数对系统的影响

NEXT

PS:转载请注明出处:欧阳天华

© 著作权归作者所有

共有 人打赏支持
欧阳天华
粉丝 11
博文 8
码字总数 8615
作品 0
松江
程序员
加载中

评论(1)

G
Gioray
写的非常好!希望博主继续更新。
手把手教你看懂并理解Arduino PID控制库——引子

介绍 本文主要依托于Brett Beauregard大神针对Arduino平台撰写的PID控制库Arduino PID Library及其对应的帮助博客Improving the Beginner’s PID。在没有Brett Beauregard帮助之前,也尝试过...

欧阳天华
2016/12/21
2.7K
3
手把手教你看懂并理解Arduino PID控制库——采样时间

引子 在《手把手教你看懂并理解Arduino PID控制库》中已经简单介绍过Brett Beauregard大神所提供的ArduinoPID控制库,此库不仅仅可以在Arduino使用,稍作简单的修改即可移植到别的平台。那么...

欧阳天华
2016/12/21
1K
1
A quarterly publication brought to you by Motion Designs Inc. August 2009

尽管伺服电机有好的性能,但最终性能仍取决于伺服环的调整。 反馈系统和闭环控制 PID: P:输出信号正比与输入信号 I:输出信号是输入信号的积分(某一时间内输入信号的总和) D:输出信号是输入信...

cjs520
06/28
0
0
手把手教你做智能LED灯(二) 硬件端的开发

第2节 硬件端的开发 现在,我们开始实现智能LED灯硬件相关部分的设计。 2.1 硬件连接 选择了Arduino MEGA 、HC-06蓝牙模块、LED灯模块和三引脚按钮开关以后,我们就需要把它们组合起来,为我...

anddlecn
2016/09/13
0
0
CSDN日报180514——《我是如何主导第三方支付平台架构设计评审的?》

好久不见,CSDN日报回归啦~ 这次将开始新的尝试,文章中我会将推荐的文章添加上作者的提问码,如果你看完文章,还有困惑,可以向作者付费提问,进行交流。优质的内容值得付费,优质的博主值得...

blogdevteam
05/14
0
0
手把手教你智能硬件开发(四) 蓝牙传输

第4节 蓝牙传输 智能硬件基本上都需要和手机相连,然后让手机控制这些硬件的工作。相连的方式不外乎以下三种, 数据线有线连接,通过一根数据线把智能硬件和手机连接起来。采用这种方式,需要...

anddlecn
2016/09/07
0
0
手把手教你智能硬件开发(三) 控制LED灯

第3节 控制LED灯 现在我们开始尝试用代码控制一个真正的直观的硬件设备。 第一个例子:让Arduino开发板上的一个LED小灯周期性的打开、关闭。 第二个例子:让LED灯亮度逐渐的变亮变暗。 3.1 ...

anddlecn
2016/09/06
0
0
Arduino教程汇总

原始链接:Arduino教程汇总贴 (有更新) 初识arduino http://www.arduino.cn/thread-1083-1-1.html 常见arduino版本比较 http://www.arduino.cn/thread-1192-1-1.html arduino驱动安装方法 ht......

小堤
2013/05/26
23K
15
手把手教你玩转直流电机PID双环控制

原文地址: http://bbs.elecfans.com/jishu5453201_1.html 1.速度闭环控制 我们一般在速度闭环控制系统里面,使用增量式PI控制。而在我们的微处理器里面,因为控制器是通过软件实现其控制算法...

Iammalt
2017/08/07
0
0
CSDN日报20170825——《迷茫的程序员》

程序人生 | 迷茫的程序员 作者:任玉刚 程序员是一个特殊的群体,我们不知道为什么加入这个行业,也不知道这个行业还能做多久,不同人有着不同的故事、有着不同的迷茫。 点击阅读全文 Python...

blogdevteam
2017/08/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
15分钟前
0
0
Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
1
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
今天
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
今天
1
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
今天
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
今天
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部