文档章节

手把手教你看懂并理解Arduino PID控制库——调参改变

欧阳天华
 欧阳天华
发布于 2017/01/19 08:23
字数 804
阅读 1959
收藏 1

引子

本文将分析《手把手教你看懂并理解Arduino PID控制库》中第三个问题:PID控制参数突变对系统的影响。

问题定义

在PID控制实际的应用过程中,可能会存在需要突然改变PID调谐参数Kp、Ki、Kd的情形,那么如果突然改变调谐参数,会有什么影响呢?首先先看一张图:

如果在系统运行的过程中,对调谐参数进行较大的改变,那么Output会产生一个突变,有点略微像“坑”。下图给出了一个改变PID参数对输出影响的量化分析:

上述现象描述了在系统进入稳态后,突然改变PID参数导致的变化,起主要引起输出较大变化的因子为I参数,由于进入稳态P参数相乘因子E变化不大,D参数同样不大,但是I参数相乘因子是关于时间的积分(可以想象如果一开始被控量与设定值相距较远,而积分表示的是带方向的面积和,所以必然存在一个方向会有较大面积,见下图),所以,会引起较大的变化。

解决方案

先看一组算式,又要感谢伟大的数学家了。

第一个等式在KI是常数的时候没问题,不是常数的时候需要评估,尽管不完全成立,但如果在稳态时E非常小,那么,也是可以接受。这似乎和经典的PID等式不一样。换个角度,经典的PID控制I项,也仅仅是为了消除静态误差而确定的,如果在这个大前提下,换一种方式消除静态误差也是可以的,仅仅是牺牲了”力度”。

代码

/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double ITerm, 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;
      ITerm += (ki * error);
      double dInput = (Input - lastInput);
 
      /*Compute PID Output*/
      Output = kp * error + ITerm - 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;
   }
}

变量Iterm用于完成上述算法。

结果

图示

量化结果

从图表中可以看出,尽管PID参数发生了较大的改变,但输出仍然变得连续。在上述过程中,牺牲了系统的响应的“灵敏度”增加了控制的稳定性,系统的灵敏度往往可以通过增加计算频率来改善,大幅提高采样频率可以起到较快的更新积分项的作用。

目前这种做法在温度控制中,有较好的控制效果。

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

下一章将介绍如果在系统运行过程中,设定值突然改变对系统的影响

NEXT

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

 

© 著作权归作者所有

欧阳天华
粉丝 11
博文 9
码字总数 9812
作品 0
松江
程序员
私信 提问
手把手教你看懂并理解Arduino PID控制库——引子

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

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

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

欧阳天华
2016/12/21
3.2K
1
手把手教你看懂并理解Arduino PID控制库——微分冲击

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

欧阳天华
2016/12/21
1K
1
手把手教你做智能LED灯(二) 硬件端的开发

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

anddlecn
2016/09/13
0
0
手把手教你智能硬件开发(六)直流马达

第6节 直流马达 马达是我们经常使用到的电动装置,它可以将电能转化成动能,驱动其他东西的运动。听起来很抽象,举几个例子吧。 我们小时候玩的四驱车,带动轮子转动的那个小装置就是马达;夏...

anddlecn
2016/09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用TensorFlow的AI程序运行报错AttributeError: module 'tensorflow' has no attribute 'xxx'

使用TensorFlow的AI程序,在运行时报错AttributeError: module 'tensorflow' has no attribute 'xxx',首先检查是否是包路径不对,一般是版本变化所致。...

织梦之魂
38分钟前
2
0
提示浏览器版本低

本文转载于:专业的前端网站➭提示浏览器版本低 网站网页在遇到浏览器低版本(尤其是IE浏览器)时,提示浏览器版本低(如IE8以及以下),建议用户升级浏览器以获得最好体验。以下是代码: 1...

前端老手
40分钟前
5
0
CentOS 7系统增加swap

转载请注明文章出处:CentOS 7系统增加swap swap是位于磁盘上的特殊文件(或分区),属于“虚拟内存”的一部分。通俗点就是内存的备胎,内存充足的情况下,基本上没swap什么事(和设置有关)...

tlanyan
今天
6
0
基于Prometheus和Grafana的监控平台 - 环境搭建

相关概念 微服务中的监控分根据作用领域分为三大类,Logging,Tracing,Metrics。 Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。比如我们说...

JAVA日知录
今天
6
0
PHP运行时全局构造体

struct _php_core_globals { zend_bool magic_quotes_gpc; // 是否对输入的GET/POST/Cookie数据使用自动字符串转义。 zend_bool magic_quotes_runtime; //是否对运行时从外部资源产生的数据使...

冻结not
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部