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

news2024/11/19 17:34:53

什么是微分冲击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.coloradmin.cn/o/681053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件开发实习个人总结

软件开发实习个人总结篇1 一、实习目的 随着时代发展和社会进步,用人单位对游戏软件专业大学生的要求越来越高,对于即将毕业的游戏软件专业在校生而言,为了能更好的适应游戏软件专业严峻的就业形势,毕业后能够尽快的融入到社会&am…

Golang学习日志 ━━ 通过将gin-vue-admin项目上传到自己的仓库并且与原版保持更新来学习github操作

gin-vue-admin是一套国人用golang开发的后台管理系统,本文是从作者早期原文中截取的一部分,后期会以本文为框架进行扩展说明。 官网:https://www.gin-vue-admin.com/ 学习视频:https://www.bilibili.com/video/BV1kv4y1g7nT/?p6 …

Redis 2023面试5题(七)

一、Redis redlock 实现原理 Redlock是一种基于Redis的分布式锁实现,它可以解决在分布式系统中由于主从切换、网络延迟等导致的锁竞争问题。 Redlock的实现原理如下: 创建多个Redis实例,每个实例都有相同的锁名称。使用Redis的SETNX命令尝试…

如何选择消息中间件

一、 分布式系统消息通信技术简介 分布式系统消息通信技术主要包括以下几种: 1. RPC(Remote Procedure Call Protocol). 一般是C/S方式,同步的,跨语言跨平台,面向过程 2. CORBA(Common Object Request Broker Architecture). CO…

Vlan与ARP讲解

目录 Vlan讲解 Vlan标签 二层接口类型 ARP ARP的作用 ARP地址解析报文讲解 免费ARP报文讲解 ARP缓存表 Vlan讲解 Vlan(Virtual Local Area Network)虚拟局域网,将一个物理的LAN在逻辑上划分为多个广播域;可以理解为一个V…

RT-Thread-11-事件集

事件集 举例说明事件集: 1、A坐公交车去某地,只有一趟公交车去该地,等此公交车即可出发; 2、A坐公交车去某地,有三趟公交车去该地,等其中任意一辆公交车即可出发; 3、A约B一起去某地&#xff0…

点亮你的创意,使用Python与树莓派制作呼吸灯的详细教程

文章目录 前言PWM的介绍实现PWM控制LED亮度结果与分析 前言 在上一篇文章中,我们介绍了如何在树莓派上点亮一个LED灯,并让它以时间间隔为1秒进行闪烁。闪亮登场!在树莓派上点亮LED灯的简单详细方法_☞黑心萝卜三条杠☜的博客-CSDN博客。现在&…

【剑指offer刷题记录 java版】数组双指针 之 其它题目

本系列文章记录labuladong的算法小抄中剑指offer题目 【剑指offer刷题记录 java版】数组双指针 之 其它题目 剑指 Offer II 018. 有效的回⽂剑指 Offer 58 - I. 翻转单词顺序剑指 Offer 21. 调整数组顺序使奇数位于偶数前⾯剑指 Offer 57. 和为s的两个数字剑指 Offer II 007. 数…

【裸机开发】IRQ 中断服务函数(三)—— 中断处理逻辑实现

实现了 IRQ 中断服务函数的汇编部分以后,接下来我们要使用C代码实现IRQ中断服务函数的具体逻辑,主要包含初始化和中断处理两部分。 全局中断初始化(全局中断使能、IRQ中断使能)具体中断处理逻辑实现 我们这里的中断是由按键产生…

springboot+mybatisplus复习笔记

1.环境搭建 依赖配置 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifa…

【Twitter爬虫】Twitter网络爬虫

利用selenium爬取Twitter 从2月9日起&#xff0c;Twitter不再支持免费访问Twitter API&#xff0c;继续使用Twitter API支付较高的费用。下面将介绍一种绕过Twitter API爬取推文的方式 Selenium Webdriver框架 首先介绍一下Selenium Webdriver&#xff0c;这是一款web自动化…

软件工程实践总结

前言 这次我们学校花了很多心血在这次的课设上&#xff0c;真的是特别感动和感谢&#xff0c;当你遇到真心为你好对你好的老师的时候&#xff0c;真的是会觉得人间值得&#xff01; 之前在学软件工程的时候我就会觉得这些理论的东西有什么用啊&#xff0c;什么UML&#xff0c;…

冒泡排序、选择排序、插入排序

冒泡排序 思路&#xff1a; 每次循环比较相邻两个元素&#xff0c;如果左边元素>右边元素&#xff0c;则交换位置。结果&#xff1a;将最大值放到最右边&#xff1b;一次循环过后&#xff0c;左边无序区域减少一个数&#xff0c;右边有序取增加一个数&#xff1b;序列长度…

【C++】AVL树的插入实现

目录 AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转左单旋(parent->_bf 2 && cur->_bf 1)a,b,c当高度为0a,b,c当高度为1a,b,c当高度为2a,b,c当高度为...... 右单旋(parent->_bf -2 && cur->_bf -1)a,b,c当高度为0a,b,c当高度为1a,b,c当高…

【群智能算法】基于浣熊优化算法的工程应用问题优化【Matlab代码#43】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 原始COA算法1.1 开发阶段1.2 探索阶段 2. 工程应用问题优化2.1 压力容器设计2.2 拉压弹簧设计 3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章…

Spring事件机制让你的代码更优雅

今天为大家分享一下Spring的事件机制的使用&#xff0c;它是spring中一个非常好用也很实用的机制。 1. spring事件机制的概念 Spring的事件机制是基于观察者模式实现的&#xff0c;它可以在我们的实际应用程序中实现代码之间的解耦&#xff0c;提高代码的可维护性和可扩展性。…

ShardingSphere-Proxy 分库分表

安装ShardingSphere-Proxy 中间件封装 定位为透明化的数据库代理端&#xff0c;提供封装了数据库二进制协议的服务端版本&#xff0c;用于完成对异构语言的支持。 目前提供 MySQL 和 PostgreSQL版本&#xff0c;它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端&#x…

面试必问:四种经典限流算法

今天给大家分享一下限流方面的&#xff0c;大家都知道&#xff0c;在分布式系统中&#xff0c;高并发场景下&#xff0c;为了防止系统因突然的流量激增而导致的崩溃&#xff0c;同时保证服务的高可用性和稳定性&#xff0c;限流是最常用的手段。希望能够给大家带来帮助&#xf…

STM32常见面试题

一、STM32F1和F4的区别&#xff1f; 内核不同&#xff1a;F1是Cortex-M3内核&#xff0c;F4是Cortex-M4内核&#xff1b; 主频不同&#xff1a;F1主频72MHz&#xff0c;F4主频168MHz&#xff1b; 浮点运算&#xff1a;F1无浮点运算单位&#xff0c;F4有&#xff1b; 功能性能&…