PID控制算法:2、Derivative Kick(微分冲击)

news/2024/11/14 13:40:11/

什么是微分冲击Derivative Kick

引入微分,就是为了减少超调量的,但是根据PID的经典公式

Output = K_{p}*e(t) + K_{i}*\int e(t)d_{t} + K_{d}*\frac{de(t)}{d_{t}}

就看微分部分

K_{d}*\frac{de(t)}{d_{t}}

在PID刚开始时,误差值肯定是存在的,但是PID启动的瞬间,这个dt是很小的,这就导致\frac{de(t)}{d_{t}}是一个很大的值,因为误差是在瞬间变化的,那误差的微分当然就比较大,那输出Output就会有一个比较大的波动。同理,在重新设置目标值的时候也会有同样的情况,这种显现就叫微分冲击(Derivative Kick)

这个微分冲击对控制系统肯定是不友好的,比如车速调节系统,会导致车速的顿挫。肯定有方法来解决这个问题。

解决方案

还是从本质入手,误差的微分dErr是怎么得来的

dErr = \frac{dError}{d_{t}} = \frac{d(Setpoint-Input)}{d_{t}} = \frac{dSetpoint}{d_{t}} - \frac{dInput}{d_{t}}

如果目标值Setpoint是一个固定不变的,dSetpoint = 0;

dErr = \frac{dError}{d_{t}} = \frac{d(Setpoint-Input)}{d_{t}} = - \frac{dInput}{d_{t}}

这就说明,只要目标值Setpoint不变化,偏差(Error)的导数等于输入(Input)的负导数。

那管你目标值变不变,都把输入的负倒数等价于误差的倒数,问题解决了,再也没有Setpoint来影响输出了。

实现代码如下:

/*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;}
}

这里的修改相当容易。在前面一章代码的基础上,将+dError替代为-dInput。那记录的变量也就是上一次的输入lastInput,而不是上一次的误差lastError。

结果

结果就如上图所示,突变没有了。即使有的控制系统对这个突变不敏感,但是就改这么点代码能完美的解决这个隐患,何乐不为呢,写代码还是尽量追求完美吧,少给自己和他人埋雷。


http://www.ppmy.cn/news/532421.html

相关文章

vue+leaflet笔记之地图放大镜

vueleaflet笔记之地图放大镜 文章目录 vueleaflet笔记之地图放大镜开发环境使用教程安装依赖库使用简介 详细源码(Vue3) 本文介绍了Web端使用 Leaflet开发库显示地图放大镜的方法 (底图来源:中科星图),结合 leaflet.magnifyingglass插件可以为Leaflet图层添加“放…

2021年煤气新版试题及煤气免费试题

题库来源:安全生产模拟考试一点通公众号小程序 2021年煤气新版试题及煤气免费试题,包含煤气新版试题答案和解析及煤气免费试题练习。由安全生产模拟考试一点通公众号结合国家煤气考试最新大纲及煤气考试真题汇总,有助于煤气证考试考前练习。…

2021年煤气最新解析及煤气考试试卷

题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:煤气最新解析根据新煤气考试大纲要求,安全生产模拟考试一点通将煤气模拟考试试题进行汇编,组成一套煤气全真模拟考试试题,学员可通过煤气考试试…

如何根据煤气成分分析来调整煤气发生炉操作?

如何才能根据煤气成分分析数据调整煤气发生炉的操作呢? 武汉天禹智控,煤制气行业首选,10年煤气分析行业研制经验,为您详细解答怎样根据煤气成分分析数据来操作煤气发生炉。 不一定每个数据都作为调整操作的依据,而是…

深入理解深度学习——BERT(Bidirectional Encoder Representations from Transformers):输入表示

分类目录:《深入理解深度学习》总目录 相关文章: BERT(Bidirectional Encoder Representations from Transformers):基础知识 BERT(Bidirectional Encoder Representations from Transformers&#xff09…

5.5.2 IPv6数据报格式

5.5.2 IPv6数据报格式 首先我们来回忆一下IPv4数据报首部格式(5.2.3 IP数据报(一)IP数据报的格式),包括20个字节的固定部分和长度可变的选项部分,如图 红色方框标注的是在IPv6中会消失的字段,椭…

面试题:mybatis中# 和 $ 的区别

面试题:mybatis中# 和 $ 的区别 一、主要区别如下: 1、#{}可以理解为预处理,而${}是直接替换。 #传入的参数在SQL中显示为字符串,会对自动传入的数据加上双引号。 $传入的参数在SQL中直接显示为传入的值 2、#{}试用于所有类型…

分片和一致性哈希

在设计大规模分布式系统时,你可能会遇到两个概念——分片(sharding)和一致性哈希(consistent hashing)。虽然我在网上找到了很多关于这些术语的解释,但它们让我感到有些困惑。我觉得分片和一致性哈希本质上…