PID算法

PID,就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很常见的控制算法。
需要将一个物理量保持在稳定状态(比如维持平衡,温度、转速的稳定),这些场景都需要PID
假设现在有一个场景:加热棒将一杯水加热到70℃
大多数情况下,我们只需要“开关量”来控制加热棒,当温度没达到时,打开开关,当温度达到时关闭开关。但是,我们发现,当温度达到70℃时断开开关后,水温还是会由于“余热”持续升高。传感器的采集都是需要时间的,所以为了精确控制,便有了PID算法:
  • 可以将控制量带到目标值附近
  • 可以“预见”该控制量的变化趋势
  • 可以消除因为余热,散热等因素引起的误差

P、I、D是三种不同的调节作用,既可以单独使用,也可以两两组合使用,也可以三个一起使用。

先来说说PID的三个参数:kP,kI,kD

①kP:比例系数

还是那个场景:

当水温差距很大时,狠狠加热一下;差距很小时,慢慢加热一下;

这就是P的作用

②kD:微分时间常数

有了上述P的控制,水温维持的晃晃悠悠,所以此时我们需要稳定一下,给它一个“阻尼”,让控制量的变化速度趋于0

③kI:积分时间常数

同样的场景,不同的地方,现在到北极了,需要加热到70℃,在P的作用下,加热到了66℃,此时水散热的速度和加热速度一样,P在慢慢加热,D觉得已经很稳定了,于是水温永远是66℃。

此时就需要I的作用:设置一个积分量,只要没达到目标,就一直积分。也就是增加加热功率

专业来讲:

PID控制其实就是对偏差的控制过程;如果偏差为 0, 则比例环节不起作用,只有存在偏差时,比例环节才起作用;积分环节主要是用来消除静差,所谓静差,就是系统稳定后输出值和设定值之间的差值,积分环节实际上就是偏差累计的过程,把累计的误差加到原有系统上以抵消系统造成的静差;而微分信号则反应了偏差信号的变化规律,也可以说是变化趋势,根据偏差信号的变化趋势来进行超前调节,从而增加了系统的预知性。

PID结构体初始化:

typedef struct
{float target_val;               //目标值float actual_val;        		//实际值float err;             			//定义偏差值float err_last;          		//定义上一个偏差值float Kp,Ki,Kd;          		//定义比例、积分、微分系数float integral;          		//定义积分值
}pid;

位置式PID算法:

在这里插入图片描述 

float PID_realize(float temp_val)
{/*计算目标值与实际值的误差*/pid.err=pid.target_val-temp_val;/*误差累积*/pid.integral+=pid.err;/*PID算法实现*/pid.actual_val=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);/*误差传递*/pid.err_last=pid.err;/*返回当前实际值*/return pid.actual_val;
}

增量式PID算法

在这里插入图片描述

float PID_realize(float temp_val) 
{/*传入目标值*/pid.target_val = temp_val;/*计算目标值与实际值的误差*/pid.err=pid.target_val-pid.actual_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;/*返回当前实际值*/return pid.actual_val;
}

 增量式与位置式区别:

1 增量式算法不需要做累加,控制量增量的确定仅与最近几次偏差采样值有关,计算误差对
控制 量计算的影响较小。而位置式算法要用到过去偏差的累加值,容易产生较大的累加误
差。
2 增量式算法得出的是控制量的增量,例如在阀门控制中,只输出阀门开度的变化部分,误
动作影响小,必要时还可通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作。
而位置式的输出直接对应对象的输出,因此对系统影响较大。
3 增量式 PID 控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分
部件的对象,如步进电机等,而位置式 PID 适用于执行机构不带积分部件的对象,如电液伺
服阀。
4 在进行 PID 控制时,位置式 PID 需要有积分限幅和输出限幅,而增量式 PID 只需输出限幅
位置式 PID 优缺点:
优点:
①位置式 PID 是一种非递推式算法,可直接控制执行机构(如平衡小车),u(k)的值和执行
机构的实际位置(如小车当前角度)是一一对应的,因此在执行机构不带积分部件的对象中
可以很好应用
缺点:
①每次输出均与过去的状态有关,计算时要对 e(k)进行累加,运算工作量大。
增量式 PID 优缺点:
优点:
①误动作时影响小,必要时可用逻辑判断的方法去掉出错数据。
②手动/自动切换时冲击小,便于实现无扰动切换。当计算机故障时,仍能保持原值。
③算式中不需要累加。控制增量Δu(k)的确定仅与最近 3 次的采样值有关。
缺点:
①积分截断效应大,有稳态误差;
②溢出的影响大。有的被控对象用增量式则不太好;

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

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

相关文章

C#图片处理

查找图片所在位置 原理:使用OpenCvSharp对比查找小图片在大图片上的位置 private static System.Drawing.Point Find(Mat BackGround, Mat Identify, double threshold 0.8) {using (Mat res new Mat(BackGround.Rows - Identify.Rows 1, BackGround.Cols - Iden…

【Matlab】基于BP神经网络的数据回归预测(Excel可直接替换数据)

【Matlab】基于BP神经网络的数据回归预测(Excel可直接替换数据) 1.模型原理2.文件结构3.Excel数据4.分块代码5.完整代码6.运行结果1.模型原理 BP(Backpropagation)回归模型是一种基于反向传播算法的神经网络模型,用于解决回归问题。它通过对输入和输出之间的非线性关系进…

GStreamer Basic tutorial 学习笔记(七)

多线程处理 目标:GStreamer可以自动处理多线程,但在某些情况下,可能需要手动分离线程。 介绍:GStreamer 是一个多线程框架。这意味着在内部,它根据需要创建和销毁线程,例如将流媒体与应用程序线程分离。此…

MongoDB的分布式ID

MongoDB ObjectID是MongoDB数据库中的一种数据类型,用于表示一个文档(document)在集合(collection)中的唯一标识符。每个ObjectID值是一个12字节的字符串,其中前四个字节表示时间戳,后三个字节表…

win10 开机自动启动pyqt做的exe文件,显示后端请求的信息做提醒

1 py 代码 import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel from PyQt5.QtCore import QTimer import osclass ReminderWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle(Reminder)self.setGeometry(100, 100, 300, 200)sel…

为什么项目可见性难以实现?该如何提高?

在项目和专业服务管理中,失败有时难以避免。沟通不足和需求定义不明确被认为是造成失败的最大原因,这意味着项目可见性和信息流动至关重要。 什么是项目可见性? 项目可见性是组织项目相关信息的方式,以便所有团队成员、项目经理…

【机器学习】KNN 算法介绍

KNN(K-Nearest Neighbors)算法是一种基本的机器学习算法,用于分类和回归问题。该算法根据样本之间的距离度量,在训练数据集中找到与待分类样本最近邻的K个样本,并基于这K个样本进行分类或回归。 KNN算法的核心思想是“…

spring-cloud-gateway版本和springboot版本不匹配

在搭建gateway服务的时候,启动出现以下问题: Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: org.springframework.cloud.gateway.config.GatewayAutoConfiguration$Netty…

LeetCode 75 第五题(345)反转字符串中的元音字母

题目: 示例: 分析: 给一个字符串,将里面的元音字母反转,并且保持非元音字母不变(包括顺序). 字符串反转类型的题,我们都可以使用双指针来解决:定义首尾指针,分别向中间靠拢,直到首尾指针都指向了元音字母,然后交换首尾指针所指的字母,如此不会影响到非元音字母,同时也将元音字…

2023“钉耙编程”中国大学生算法设计超级联赛(1)Hide-And-Seek Game

2023“钉耙编程”中国大学生算法设计超级联赛(1)Hide-And-Seek Game 题目大意 有一棵有 n n n个节点的树,小 S S S和小 R R R在树上各有一条链。小 S S S的链的起点为 S a S_a Sa​,终点为 T a T_a Ta​;小 R R R的链…

pytest实现用例间参数传递的方式

pytest实现用例间参数传递的方式 一、通过conftest创建全局变量二、使用tmpdir_factory方法 我们在做接口自动化测试的时候,会经常遇到这种场景:接口A的返回结果中的某个字段,是接口B的某个字段的入参。如果是使用postman,那我们可…

CSS:给子元素设置了浮动,页面缩放的时候,子元素往下掉

前言 给子元素设置了浮动&#xff0c;页面缩放的时候&#xff0c;子元素往下掉 html代码&#xff1a; <div class"father"><div class"child1"></div><div class"child2"></div> </div>css代码 .child1…

Spring Batch之读数据库——JdbcCursorItemReader之使用框架提供的BeanPropertyRowMapper(三十六)

一、BeanPropertyRowMapper介绍 参考我的另一篇博客&#xff1a; Spring Batch之读数据库——JdbcCursorItemReader&#xff08;三十五&#xff09;_人……杰的博客-CSDN博客 二、项目实例 1.项目框架 2.代码实现 BatchMain.java: package com.xj.demo27;import org.spri…

中金:龙湖基本面稳健,股价超跌具备配置价值

恒大2.4万亿元的天量债务爆出后&#xff0c;让本就信心不足的房地产行业&#xff0c;越发雪上加霜&#xff0c;房企股价遭遇集体下挫&#xff0c;业内公认的万科、龙湖、保利、中海等“优等生”也不免被波及。多家证券机构提醒&#xff0c;行业预期降至冰点的情况下&#xff0c…

oc基本控件2

// // ViewController.m // OcDemoTest // // Created by Mac on 2023/7/14. //#import "ViewController.h"interface ViewController () // label property (weak, nonatomic) IBOutlet UIImageView *imageView; // Use of undeclared identifier // 全局propert…

CentOS 7.9 使用rpm包安装MySQL-5.7.43

参考&#xff1a;refman-5.7.pdf: 2.5.5 Installing MySQL on Linux Using RPM Packages from Oracle 【前期准备】 1.防火墙端口检查与设置 检查防火墙状态&#xff1a;systemctl status firewalld 启动防火墙&#xff1a;systemctl start firewalld 关闭防火墙&#xff1a…

6. Docker之使用第三方镜像

第三方镜像是在Docker Hub或其他容器注册表上提供的预构建Docker容器镜像。这些镜像由个人或组织创建和维护&#xff0c;可以作为您容器化应用程序的起点。 查找第三方镜像 Docker Hub 是最大和最受欢迎的容器镜像注册表&#xff0c;包含官方和社区维护的镜像。您可以根据名称…

创建型模式

创建型模式&#xff08;Creational Pattern&#xff09;关注对象的创建过程&#xff0c;是一类最常用的设计模式&#xff0c;在软件开发中应用非常广泛。创建型模式将对象的创建和使用分离&#xff0c;在使用对象时无须关心对象的创建细节&#xff0c;从而降低系统的耦合度&…

学堂在线数据结构(上)(2023春)邓俊辉 课后题

The reverse number of a sequence is defined as the total number of reversed pairs in the sequence, and the total number of element comparisons performed by the insertion sort in the list of size n is: 一个序列的逆序数定义为该序列中的逆序对总数&#xff0c;…

pandas 笔记:pivot_table 数据透视表\pivot

1 基本使用方法 pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean, fill_valueNone, marginsFalse, dropnaTrue, margins_nameAll, observedFalse, sortTrue)2 主要参数 dataDataFramevalues要进行聚合的列index在数据透视表索引&#xff08;index…