`

PID调优——样本时间

阅读更多

 

问题

PID设计为无规则调用,存在2个问题:

  • 你不能从PID得到确定的行为,因为调用时可能是频繁的也可能不是。
  • 你需要做额外的微分和积分数学计算,因为它们都依赖于时间变化。

方案

确保PID在规律的时间间隔调用。通过指定每个调用PID循环,基于预定义的一个样本时间,PID决定计算还是立即返回。

当我们知道PID在固定的间隔被调用,微分和积分运算就可以简化。

代码

/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double errSum, lastErr;
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 dErr = (error - lastErr);
 
      /*Compute PID Output*/
      Output = kp * error + ki * errSum + kd * dErr;
 
      /*Remember some variables for next time*/
      lastErr = error;
      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;
   }
}
 

算法可以判断是否是计算的时间了。同样,我们现在知道算法使用相同的样本时间,我们不需要常常乘以时间变化。我们仅仅适当调整Ki和Kd,哪样在数学上是相等的,而且更加有效。

一个小缺陷是。如果用户决定修改样本时间,Ki和Kd需要重新调整以反应新的修改,SetSampleTimp就是做这个事的。

需要注意,我把样本时间的单位换算成秒。严格来说这不是必须的,但是这让用户可以输入Ki和Kd的单位是1/秒和秒,而不是1/毫秒和毫秒。

结果

上面的修改为我们做了三件事

  1. 不管Compute()的调用频率是多少,PID算法始终是固定的间隔调用。
  2. millis()为0时,时间相减不再是问题。
  3. 我们再也不需要去乘除时间变化。因为这是个常数,我们将它从计算代码中移除,整合进调整常数中。从数学上来说是等价的,但是节约了每一次乘除带来的成本。

Side note about interrupts

如果这个PID运行在单片机中,一个非常好的想法是使用一个中断。SetSampleTime设置中断频率,然后到时调用Compute。在这种情况下时间计算和判断就不会有需要。
这里有三个原因我没有使用中断:

  1. 不是每个人都能用中断。
  2. 同一时间实现多个PID控制器将变得棘手。
  3. 我将在以后的PID实现中使用终端。
3
8
分享到:
评论

相关推荐

    PID学习——PID源码

    在这个"PID学习——PID源码"的资源包中,我们可以深入理解PID控制器的工作原理及其在实际工程中的应用。 首先,PID控制器的核心在于它对误差的处理方式。比例项(P)直接反映了当前误差的大小,可以迅速改变系统的...

    淘宝客劫持PID插件——收入到爆

    淘宝客劫持PID插件——收入到爆

    PID学习——平衡小车PDF介绍到入门

    在这个"PID学习——平衡小车PDF介绍到入门"的资源包中,我们将深入探讨PID控制器的原理、应用以及调试方法。 首先,PID控制器的核心在于其三个组成部分:比例项(P)、积分项(I)和微分项(D)。比例项是当前误差的直接...

    经典pid设计——基于C++语言

    **PID控制器设计基础** PID(比例-积分-微分)控制器是工业自动化领域最常见的一种控制器,其原理简单,但效果显著。它通过综合比例、积分和微分三个部分的控制作用来调整系统的响应,以达到期望的控制效果。在C++...

    PID控制——比例控制、积分控制、微分控制

    PID 控制——比例控制、积分控制、微分控制 PID 控制是一种常用的自动控制方法,它通过比例控制、积分控制和微分控制三个部分来实现对系统的控制。下面将对这三个部分进行详细的解释: 比例控制(P) 比例控制是...

    PID_电机PID控制arduino_pid采样时间_pid马达时间_

    标题中的“PID_电机PID控制arduino_pid采样时间_pid马达时间_”表明这是一个关于使用Arduino进行电机PID(比例-积分-微分)控制的项目,重点在于PID控制器的采样时间和对马达的控制时间。描述中提到的“电机PID速度...

    博文PID控制器——MATLAB/Simulink仿真以及性能分析附件

    《PID控制器MATLAB/Simulink仿真与性能分析详解》 PID控制器,即比例-积分-微分控制器,是工业自动化领域最常用的控制算法之一。它通过调整比例(P)、积分(I)和微分(D)三个参数,实现对系统响应的精确控制。在...

    PID采样时间精准控制——基于stm32主控

     我们在用到PID算法时,有时候会使用积分分离的抗饱和算法,或是另一类属于增量式的PID算法。这时,需要提供一个PID采样间隔来控制采样率,大部分无人机类工程用到的采样为10ms,视具体情况而定。  本文提供一个...

    连续和离散两种情况下编写的pid——s函数

    S函数同样适用于构建离散状态的PID控制器,但需考虑采样时间和零阶保持器(ZOH)等离散化处理。 在MATLAB Simulink中,我们可以创建一个自定义的S函数来实现连续和离散的PID控制器。S函数可以通过C代码、MATLAB脚本...

    炉温系统的PID控制器设计——MATLAB程序

    本文主要研究的课题是:炉温系统的PID控制器设计...常规PID控制算法、Smith控制算法、带死区修正后的Smith控制算法、模糊控制算法和模糊PID控制控制算法,我们可以通过比较最终得出最优控制算法——模糊PID控制算法。

    常用PID算法_变积分pid_抗积分饱和_pid_pid控制算法_PID算法_

    1. 设计合适的采样时间,以确保控制周期与实际系统匹配。 2. 积分项需考虑防溢出处理,如采用双积分器或限幅。 3. 微分项计算可能需要滤波处理,防止高频噪声影响。 4. 参数整定是关键,可以通过Ziegler-Nichols法则...

    PID 算法C语言实现

    - **离散化**:将连续时间域的PID公式转换为适合计算机执行的离散时间域公式。 - **采样**:定期采集系统状态,计算偏差。 - **计算控制量**:根据采样数据,计算出比例、积分、微分项的值。 - **输出控制信号**:将...

    一种新颖优化的算法PID算法

    【PID算法】是一种广泛应用的控制算法,特别是在自动化和控制系统中。PID代表比例-积分-微分,通过结合这三个部分来调整系统的输出,以使系统的行为更接近于理想的设定点(set point)。在给出的代码中,可以看到一...

    抗积分饱和的PID控制算法及其C语言实现

    这段代码展示了如何初始化PID控制器参数,并实现了一种抗积分饱和的方法——积分分离。具体来说,当偏差绝对值大于200时,停止积分作用;当偏差小于0时,应该有一些额外的逻辑来处理积分项的减少。 #### 四、总结 ...

    PID Tunner Examples and Code.rar

    《PID控制器调优工具——MATLAB/Simulink PIDTuner深度解析》 PID控制器作为自动控制领域最常用的控制算法之一,广泛应用于各种系统中,如工业自动化、机器人控制、航空航天等。MATLAB/Simulink提供的PIDTuner工具...

    数字PID控制器的设计——毕业设计论文.doc

    "数字PID控制器的设计——毕业设计论文" 本文主要论述了基于FPGA的数字PID控制器的设计,旨在实现直流电机的调速控制。下面是从该论文中总结的相关知识点: 1. 直流电机的调速控制:直流电机具有良好的启动和调速...

    EDA课程设计——基于FPGA的PID实现

    EDA 课程设计——基于 FPGA 的 PID 实现 本设计主要是基于 FPGA 的 PID 算法实现,旨在实现电机转速的稳定控制。该设计中,主要使用了 FPGA 芯片、直流电机调速模块、数码管显示模块等器件。其中,FPGA 芯片主要...

    Java性能调优命令

    - GCOverheadLimitExceeded表示JVM在GC过程中消耗了98%以上的时间,但只释放了不到2%的堆空间。这通常提示系统中存在大内存使用的代码或死循环。通过限制内存使用或增加JVM参数来解决问题。 - PermGenSpace错误指的...

    S7-1200 PLC PID功能 _调节PID参数.docx

    在S7-1200 PLC中,PID(比例-积分-微分)控制器是一种内置的功能块,它通过调整三个主要参数——比例增益(P),积分时间(I)和微分时间(D)来实现对系统响应的优化。 1. **PID参数设置**: - **比例增益(P)**:决定了...

    模糊PID控制仿真——Matlab

    使用Matlab中的Simulink来建立的模糊控制仿真,通过大偏差来利用模糊推理调整控制量,小偏差使用PID控制,根据误差E和误差的变化率EC及输出量U,设计模糊控制规则。其中压缩包里有模糊9条,25条以及49条的控制规则,...

Global site tag (gtag.js) - Google Analytics