PID控制算法学习笔记分享

目录

一、参数设定

二、PID计算公式

三、位置式PID代码实现

四、增量式PID代码实现

五、两种控制算法的优缺点

六、PID算法的改进


一、参数设定

  1. 比例系数(kp):P项的作用是根据当前误差的大小来产生一个控制量。它直接与误差成正比,误差越大,控制量的变化越大。P项可以提高系统的响应速度,但可能会导致系统的超调和稳态误差

  2. 积分时间(Ti):I项的作用是累积误差并产生一个控制量。它可以消除系统的稳态误差,因为它会积累误差并持续地调整控制量,直到误差为零。然而,I项可能会导致系统的超调和振荡。

  3. 微分常数(Td):D项的作用是根据误差变化的速度来产生一个控制量。它可以提高系统的稳定性,因为它可以减小误差的快速变化。D项可以抑制超调和减小振荡,但可能会增加系统的灵敏度

PD算法:适用于惯性较大的设备,比如舵机。

PI算法:适用于不允许有静差的设备。

二、PID计算公式

1)位置式PID

2)增量式PID

三、位置式PID代码实现

#define IntegralMAX 2000//pid结构体
typedef struct{float target_val;               //目标值float temp_val;                 //当前值float actual_val;                       //输出控制值float err;                              //定义偏差值float err_last;                         //定义上一个偏差值float Kp,Ki,Kd;                         //定义比例、积分、微分系数float sum;                              //定义历史偏差}pid_t; 
//pid算法实现void PID_realize(pid_t *pid)
{/*目标值只在这里参与计算,计算目标值与实际值的误差*/pid->err=pid->target_val - pid->temp_val;/*误差累积*/pid->sum+=pid.err;//此处可以进行误差限幅//*if(pid->integral > IntegralMAX) pid->integral = IntegralMAX;// else if(pid->integral < -IntegralMAX) pid->integral = -IntegralMAX;//*/*PID算法实现*/pid->actual_val = pid->Kp*pid->err + pid->Ki*pid->sum+ pid->Kd*(pid->err - pid->err_last);/*误差传递*/pid->err_last=pid->err;}

位置式 PID 适用于执行机构不带积分部件的对象,如舵机和平衡小车的直立和温控系统的控制。

四、增量式PID代码实现

 /*pid*/typedef struct{float target_val;     //目标值float actual_val;     //实际输出值float temp_val;       //当前值float err;            //定义当前偏差值float err_next;       //定义下一个偏差值float err_last;       //定义最后一个偏差值float Kp, Ki, Kd;     //定义比例、积分、微分系数}_pid;
//增量式PID算法实现
void PID_realize(pid_t *pid){/*目标值只在这里参与计算,计算目标值与实际值的误差*/pid->err = pid->target_val - pid->temp_val;/*PID算法实现*/float increment_val = pid->Kp*(pid->err - pid->err_next) + pid->Ki*pid->err + pid->Kd*(pid->err - 2 * pid->err_next + pid->err_last);/*累加*/pid->actual_val += increment_val;/*传递误差*/pid->err_last = pid->err_next;pid->err_next = pid->err;}

可见,增量式PID不需要进行累加,能对其产生影响的只有最近的三次的采样,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作。

增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等。

五、两种控制算法的优缺点

1)位置式PID的优缺点

优点:

①位置式PID是一种非递推式算法,可直接控制执行机构(如平衡小车),u(k)的值和执行机构的实际位置(如小车当前角度)是一一对应的,因此在执行机构不带积分部件的对象中可以很好应用

缺点:

①每次输出均与过去的状态有关,计算时要对e(k)进行累加,运算工作量大。

2)增量式PID优缺点:

优点:

①误动作时影响小,必要时可用逻辑判断的方法去掉出错数据。

②手动/自动切换时冲击小,便于实现无扰动切换。当计算机故障时,仍能保持原值。

③算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关。

缺点:

①积分截断效应大,有稳态误差;

②溢出的影响大。有的被控对象用增量式则不太好;

六、PID算法的改进

1)积分饱和

位置式PID在积分项达到饱和时,误差仍然会在积分作用下继续累积,一旦误差开始反向变化,系统需要一定时间从饱和区退出。

解决方法:

1、积分限幅:在积分积累达到最大值时,停止积分的积累。

//积分限幅
if(pid->integral > IntegralMAX) pid->integral = IntegralMAX;
else if(pid->integral < -IntegralMAX) pid->integral = -IntegralMAX;

2、变速积分:

在系统误差较大时对积分进行积累会导致积分过饱和,此后需要很长的一段时间进行消除。所以我们希望在系统偏差大时积分作用应减弱甚至全无,而在偏差小时则应加强。变速积分可以根据系统偏差大小改变积分的速度。

使用变速积分后I项的表达式:

其中系数f 为:

当积分误差小于B时,对误差进行全积累;当误差大于A+B时,不积累;当误差处于两者之间时,积累量和误差值是线性关系

若A=0,f取值为0或1,此时为积分分离

3、抗积分饱和

是在计算输出的时候,先判断上一时刻的控制量U(k-1)是否已经超出了限制范围。若U(k-1)>Umax,则只累加负偏差;若U(k-1)<Umin,则只累加正偏差。从而避免控制量长时间停留在饱和区。

2)梯形积分

在积分项中,默认是按矩形方式来计算积分,将矩形积分改为梯形积分可以提高运算精度。即在每次计算积分时,积累的误差总是修改为当前误差与上一次误差的平均值。

3)不完全微分

从PID控制的基本原理我们知道,微分信号的引入可改善系统的动态特性,但也存在一个问题,那就是容易引进高频干扰,在偏差扰动突变时尤其显出微分项的不足。为了解决这个问题人们引入低通滤波方式来解决这一问题。

位置式PID的微分部分计算公式:

增量式PID的微分部分计算公式:

其中\alpha为不完全微分系数。

4)死区PID控制

在实际控制中可能总是存在微小的静差难以消除,导致系统频繁地不稳定,这时就可以引入带死区的PID算法,即在偏差达到一定程度时才进行调节,否则认为已经到达目标值。

5)步进式PID

所谓步进式PID算法,实际就是在设定值发生阶跃变化时,不直接对阶跃信号进行响应,而是在一定的时间内逐步改变设定值,直至使设定值达到目标值。这种逐步改变设定值的办法使得对象运行平稳。适用于高精度伺服系统的位置跟踪。

其基本思想是设定一个适当的步长,每次控制移动一个步长的值,直到达到目标值。

float StepInProcessing(pid_t *vPID)
{float stepIn=(vPID->maximum-vPID->minimum))*0.1;float kFactor=0.0;if(fabs(vPID->actual_val - vPID->target_val)<=stepIn){vPID->actual_val = vPID->target_val;}else{if(vPID->actual_val - vPID->target_val > 0){kFactor=-1.0;}else if(vPID->actual_val - vPID->target_val < 0){kFactor=1.0;}else{kFactor=0.0;}vPID->actual_val = vPID->actual_val + kFactor*stepIn;}return vPID->actual_val;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30393.shtml

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

相关文章

【机器学习300问】126、词嵌入(Word Embedding)是什么意思?

人类的文字&#xff0c;作为一种高度抽象化的符号系统&#xff0c;承载着丰富而复杂的信息。为了让电脑也能像人类一样理解并处理这些文字&#xff0c;科学家们不断探索各种方法&#xff0c;以期将人类的语言转化为计算机能够理解的格式。 一、One-Hot编码的不足 在自然语言处…

NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点

目录 [WUSTCTF 2020]朴实无华 [FSCTF 2023]源码&#xff01;启动! [LitCTF 2023]Flag点击就送&#xff01; 相关知识点 1.intval 绕过 绕过的方式&#xff1a; 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息&#xff0c;所以想到使用dis…

Spring MVC学习记录(基础)

目录 1.SpringMVC概述1.1 MVC介绍1.2 Spring MVC介绍1.3 Spring MVC 的核心组件1.4 SpringMVC 工作原理 2.Spring MVC入门2.1 入门案例2.2 总结 3.RequestMapping注解4.controller方法返回值4.1 返回ModelAndView4.2 返回字符串4.2.1 逻辑视图名4.2.2 Redirect重定向4.2.3 forw…

Shopee菲律宾本土店允许中途无理由退货,如何应对退货后库存混乱问题?

Shopee菲律宾本土店最近实施了一项新政策&#xff0c;自2024年6月10日起&#xff0c;允许买家在商品仍在运输途中申请退货与退款&#xff0c;此即“在途退货/退款”功能&#xff0c;主要的目的是为了提升买家的购物体验&#xff0c;增强市场竞争力。 图源&#xff1a;Shopee菲律…

一年前 LLM AGI 碎片化思考与回顾系列⑤ · 探索SystemⅡ复杂推理的未知之境

阅读提示&#xff1a; 本篇系列内容的是建立于自己过去一年在以LLM为代表的AIGC快速发展浪潮中结合学术界与产业界创新与进展的一些碎片化思考并记录最终沉淀完成&#xff0c;在内容上&#xff0c;与不久前刚刚完稿的那篇10万字文章 「融合RL与LLM思想&#xff0c;探寻世界模型…

vue3delete请求报403forbidden,前后端解决方式,cookie无效问题

在做开发时&#xff0c;前期已经在Controller类加上CrossOrigin(origins "*")&#xff0c;发送get和post请求都没问题&#xff0c;但遇到delete请求时&#xff0c;又报出跨域问题 一.前端添加proxy代理服务器&#xff08;未能解决&#xff09; 在vue.config.js中使…

连接Huggingface报requests.exceptions.SSLError错误

最近在学习使用 SHAP 算法解释 BERT 模型的输出结果&#xff0c;然而在从 Huggingface 上导入模型和数据集的过程中出现了网络连接相关的错误&#xff0c;本文用于记录错误类型和解决错误的方法。 1 代码示例 SHAP 官方展示的代码如下&#xff1a; import datasets import nu…

Linux screen命令使用

文章目录 1. 前言2. screen是什么?3. screen使用场景描述3. screen常用命令4. 小结5. 参考 1. 前言 实际开发中用到的云服务器&#xff0c;如果项目使用的是python&#xff0c;需要利用项目运行一些时间较长的项目程序脚本的话&#xff0c;由于我们通过ssh连接远端服务器&…

一文详解扩散模型

文章目录 1、常见的生成模型2、变分推断简介3、文生图的评价指标4、Diffusion Models5、其他技术交流群精选 节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地…

2024年通信安全员ABC证证考试题库及通信安全员ABC证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年通信安全员ABC证证考试题库及通信安全员ABC证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

项目3:从0开始的RPC框架(扩展版)-3

七. 负载均衡 1. 需求分析 目前我们的RPC框架仅允许消费者读取第一个服务提供者的服务节点&#xff0c;但在实际应用中&#xff0c;同一个服务会有多个服务提供者上传节点信息。如果消费者只读取第一个&#xff0c;势必会增大单个节点的压力&#xff0c;并且也浪费了其它节点…

Jenkins+K8s实现持续集成(一)

镜像仓库的搭建 docker run -d \--restartalways \--name registry \-p 5000:5000 \-v /root/devops/registry/data:/var/lib/registry \registry安装完之后&#xff0c;执行下面命令可以看到镜像仓库已经安装成功 docker ps 然后在浏览器上输入下面地址进行访问 http://ip:…

车牌号识别(低级版)

import cv2 from matplotlib import pyplot as plt import os import numpy as np from paddleocr import PaddleOCR, draw_ocr from PIL import Image, ImageDraw, ImageFont# 利用paddelOCR进行文字扫描&#xff0c;并输出结果 def text_scan(img_path):ocr PaddleOCR(use_a…

HTML(11)——CSS三大特性

CSS拥有三大特性&#xff0c;分别是&#xff1a;继承性&#xff0c;层叠性&#xff0c;优先级 继承性 说明&#xff1a;子级标签默认继承父级标签的文字控制属性。 如果子级自己有样式&#xff0c;则父级的属性不生效 例如&#xff1a; <style> body{ font-size:30px;…

ADS1220芯片写寄存器失败

1&#xff09;场景&#xff1a;最近调试ADS1220 的芯片&#xff0c;需要读取不同通道的AD值&#xff0c;修改寄存器0的值时一直失败 但是在单片机启动时&#xff0c;写寄存器0时&#xff0c;值能正确写入&#xff0c;并正确读出&#xff0c;之后写完读取出的都是FF或其他异常值…

CobaltStrike后渗透进阶篇

0x01 网络钓鱼攻击 钓鱼攻击简介 钓鱼攻击主要通过生成的木马诱使受害者运行后上线&#xff0c;其中木马一般都伪装成正常的程序。与此同时配合钓鱼网站可帮助攻击者模拟真实网站诱骗受害者访问&#xff0c;达到获取账号密码、上线木马等目的。接下来主要介绍后门程序的生成及…

利用Python爬取天气数据并实现数据可视化,一个完整的Python项目案例讲解

要使用Python爬取天气数据并进行制图分析分几个步骤进行&#xff1a; 选择数据源&#xff1a;首先&#xff0c;你需要找到一个提供天气数据的API或网站。一些常见的选择包括&#xff1a;OpenWeatherMap、Weatherbit、Weather Underground等。 安装必要的库&#xff1a;你需要安…

mamba模型原理解读

本文主要讲解我对于2023年提出的mamba模型的理解和解读&#xff0c;mamba模型的提出为transformer模型存在的计算效率低下&#xff0c;需要大量时间运行程序提出了解决方案。提高了模型的运行效率和计算效率。我主要是根据下面这篇文章入手&#xff1a; 1.mamba模型是通过堆叠多…

SpringBoot调用WebService的实践

作者所在公司的系统间的信息交互是通过webservice完成。如&#xff1a;MES与SAP的交互&#xff0c;MES与WMS的交换&#xff0c;MES与SRM的交互&#xff0c;MES与IOT的交互等。 MES是用.NET VS2008 C#写的&#xff0c;调用webservice很简单&#xff0c;这里不再赘述。如有想了解…

kotlin数组

1、kotlin中的数组与java数组比较&#xff1a; 2、创建 fun main() {// 值创建val a intArrayOf(1,2,3)// 表达式创建val b IntArray(3){println("it: ${it}")it1}println("a数组&#xff1a;${a.contentToString()}, 长度&#xff1a;${a.size}")prin…