文档章节

手把手教你看懂并理解Arduino PID控制库——方向

欧阳天华
 欧阳天华
发布于 2017/01/20 09:24
字数 892
阅读 1115
收藏 2

引子

本文将分析《手把手教你看懂并理解Arduino PID控制库》中:调节方向的问题

问题定义

一个完善的PID控制器的调节方式,应该有两种:

1、正向调节,也就是输出增大,那么被控量也会增大

2、反向调节,与正向调节相对应,输出增大,被控量却减小

上述两种方式很容易理解,举个例子,例如在温度控制的加热控制中,加热输出增大,那么温度随之上升(正向调节),而在对应的制冷控制中,如果制冷输出增大,那么温度应该是随之下降的(方向调节)。

解决方案

这个问题很容易解决,在代码中,仅需要将Kp、Ki、Kd设定为负的即可,在代码中,提供了一个函数SetControllerDirection和两个宏DIRECT和REVERSE用于控制输出的方向,如果需要正向输出,在构造PID之后,调用SetControllerDirection(DIRECT)即可将输出设为正向(正向是默认的,构造PID的时候,默认是正向调节),反之亦然。

代码

/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double ITerm, lastInput;
double kp, ki, kd;
int SampleTime = 1000; //1 sec
double outMin, outMax;
bool inAuto = false;
 
#define MANUAL 0
#define AUTOMATIC 1
 
#define DIRECT 0
#define REVERSE 1
int controllerDirection = DIRECT;
 
void Compute()
{
   if(!inAuto) return;
   unsigned long now = millis();
   int timeChange = (now - lastTime);
   if(timeChange>=SampleTime)
   {
      /*Compute all the working error variables*/
      double error = Setpoint - Input;
      ITerm+= (ki * error);
      if(ITerm > outMax) ITerm= outMax;
      else if(ITerm < outMin) ITerm= outMin;
      double dInput = (Input - lastInput);
 
      /*Compute PID Output*/
      Output = kp * error + ITerm- kd * dInput;
      if(Output > outMax) Output = outMax;
      else if(Output < outMin) Output = outMin;
 
      /*Remember some variables for next time*/
      lastInput = Input;
      lastTime = now;
   }
}
 
void SetTunings(double Kp, double Ki, double Kd)
{
   if (Kp<0 || Ki<0|| Kd<0) return;
 
  double SampleTimeInSec = ((double)SampleTime)/1000;
   kp = Kp;
   ki = Ki * SampleTimeInSec;
   kd = Kd / SampleTimeInSec;
 
  if(controllerDirection ==REVERSE)
   {
      kp = (0 - kp);
      ki = (0 - ki);
      kd = (0 - kd);
   }
}
 
void SetSampleTime(int NewSampleTime)
{
   if (NewSampleTime > 0)
   {
      double ratio  = (double)NewSampleTime
                      / (double)SampleTime;
      ki *= ratio;
      kd /= ratio;
      SampleTime = (unsigned long)NewSampleTime;
   }
}
 
void SetOutputLimits(double Min, double Max)
{
   if(Min > Max) return;
   outMin = Min;
   outMax = Max;
 
   if(Output > outMax) Output = outMax;
   else if(Output < outMin) Output = outMin;
 
   if(ITerm > outMax) ITerm= outMax;
   else if(ITerm < outMin) ITerm= outMin;
}
 
void SetMode(int Mode)
{
    bool newAuto = (Mode == AUTOMATIC);
    if(newAuto == !inAuto)
    {  /*we just went from manual to auto*/
        Initialize();
    }
    inAuto = newAuto;
}
 
void Initialize()
{
   lastInput = Input;
   ITerm = Output;
   if(ITerm > outMax) ITerm= outMax;
   else if(ITerm < outMin) ITerm= outMin;
}
 
void SetControllerDirection(int Direction)
{
   controllerDirection = Direction;
}

结语

至此,PID控制器的介绍已经完毕,这仅仅是一个很普通的PID控制器,具备了PID控制的基本要素,并且考虑了一切特殊的情况,大大增加了环境适应性。

然后PID控制的一个大大大大问题,就是如何选取合适的Kp、Ki、Kd参数用于满足千变万化的应用场景,目前调节PID参数主要还是靠经验和不断地试凑,人们也不断地在寻求如何选取合适的PID参数的方法。针对上述问题,应运而生了一个命题“自动调谐PID”控制器,即我们在做PID控制的时候,不需要给出非常精确的PID参数,系统会自动帮助我们找到一组“较为”合适的PID控制参数,这样既可大大减小了对经验和试凑的要求。

在后续的文章中,将介绍以下几个命题:

1、如何进行自动调参,目前主流的自动调参方式有哪些?

2、介绍RELAY METHOD方式的自动调参库是如何实现的

3、整合了PID及自动调参的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.1K
3
手把手教你看懂并理解Arduino PID控制库——采样时间

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

欧阳天华
2016/12/21
3.1K
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
CSDN日报20170825——《迷茫的程序员》

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

blogdevteam
2017/08/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一、docker 入坑(win10和Ubuntu 安装)

前言 终究还是绕不过去了,要学的知识真的是太多了,好在我们还有时间,docker 之前只闻其声,不曾真正的接触过,现在docker 越来越火,很多公司也都开始使用了。所以对于我们程序员而言,又...

quellanan2
28分钟前
4
0
AutoCompleteTextView

小技巧按菜单键 当菜单打开之前会调用onMenuOpened(int featereId,Menu menu),可以重写这个方法,弹出对话框或者Popmenu 再布局中添加控件AutoCompleteTextView. <AutoCompleteTextVie...

逆天游云
31分钟前
4
0
谷歌软件商店:推出5美元会员 可用数百个软件

腾讯科技讯,谷歌和苹果是全球两大智能手机操作系统的运营者,两家公司旗下分别拥有占据行业垄断地位的谷歌软件商店和苹果软件商店。据外媒最新消息,手机软件商店的商业模式正在发生一些变化...

linuxCool
53分钟前
3
0
RocketMQ 多副本前置篇:初探raft协议

Raft协议是分布式领域解决一致性的又一著名协议,主要包含Leader选举、日志复制两个部分。 温馨提示: 本文根据raft官方给出的raft动画进行学习,其动画展示地址:http://thesecretlivesofda...

中间件兴趣圈
53分钟前
3
0
elasticsearch 6.8.0 添加认证

1. 修改elasticsearch-6.8.0/config/elasticsearch.yml 最后添加一行:xpack.security.enabled: true 2. 初始化用户和密码 ./bin/elasticsearch-setup-passwords interactive 我这里初始化为......

coord
55分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部