自动控制之PID原理

2023-05-16

自动控制原理
从控制的方式看,自动控制系统有闭环和开环两种。

闭环控制:

闭环控制也就是(负)反馈控制,原理与人和动物的目的性行为相似,系统组成包括传感器(相当于感官),控制装置(相当于脑和神经),执行机构(相当于手腿和肌肉)。传感器检测被控对象的状态信息(输出量),并将其转变成物理(电)信号传给控制装置。控制装置比较被控对象当前状态(输出量)对希望状态(给定量)的偏差,产生一个控制信号,通过执行机构驱动被控对象运动,使其运动状态接近希望状态。在实际中,闭环(反馈)控制的方法多种多样,应用于不同领域和各个方面,当前广泛应用并快速发展的有:最优控制,自适应控制,专家控制(即以专家知识库为基础建立控制规则和程序),模糊控制,容错控制,智能控制等。

开环控制:

开环控制也叫程序控制,这是按照事先确定好的程序,依次发出信号去控制对象。按信号产生的条件,开环控制有时限控制,次序控制,条件控制。20世纪80年代以来,用微电子技术生产的可编程序控制器在工业控制(电梯,多工步机床,自来水厂)中得到广泛应用。当然,一些复杂系统或过程常常综合运用多种控制类型和多类控制程序。

在实际情况当中,绝大多数都是使用的闭环控制,闭环控制有反馈调节环节,这样可以实时的监测系统的状态,如果当前的系统状态没有达到预设的情况,则会根据偏差进行调整,直到达到预设状态为止。

在这里插入图片描述

PID控制器原理
PID控制算法作为闭环控制算法的基础,在工程实际中得到了广泛的应用。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。在单回路控制系统中,由于扰动作用使被控参数偏离给定值,从而产生偏差。自动控制系统的调节单元将来自变送器的测量值与给定值相比较之后产生的偏差进行比例、微分、积分运算,并输出统一标准信号,去控制执行机构的动作。PID控制器就是根据系统的误差,利用比例、积分、微分计算出控制量进行控制的。PID控制算法的核心就是:比例§、积分(I)、微分(D)。

在这里插入图片描述
在这里插入图片描述
①比例(P)控制 :

比例控制是一种最简单的控制方式。是按比例反应系统的的偏差,系统一旦出现了偏差,比例调节立即产生调节作用,减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,是系统的稳定性下降,甚至造成系统的不稳定。但当仅有比例控制时系统输出存在稳态误差。

②积分(I)控制 :

在积分控制中,控制器的输出与输入误差信号的积分成正比关系。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。由于积分作用输出随时间积累而逐渐增大,故调节动作缓慢,这样会造成调节不及时,使系统稳定裕度下降。因此积分作用一般不单独使用,而是与比例作用组合起来构成PI调节器,用于控制系统中减小稳态误差。

③微分(D)控制 :

在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。 自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳,其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。而微分项能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。比例P只与偏差成正比,积分作用I是偏差对时间的积累,微分作用D是偏差的变化率。自动调节系统中当干扰出现时微分D立即起作用,P随偏差的增大而明显起来,两者首先起克服偏差的作用,使被控量在新值上稳定,此新稳定值与设定值之差叫余差,而I随时间增加逐渐增强,直至克服掉余差,使被控量重返到设定值上来。

常用的有两种PID控制算法,即位置式算法和增量算法。增量算法就是相对于标准算法的相邻两次运算之差,根据具体的应用适当选择使用哪一种算法,直接计算法得到的是当前需要的控制量,而相邻两次控制量的差就是增量。

1.标准的位置式计算法公式:

Pout(t)=Kpe(t)+Ki∑e(t)+Kd*(e(t)-e(t-1));

2.增量法计算公式:

Pdlt= Pout(t)- Pout(t-1);即Pdlt=Kp*(e(t)-e(t-1))+Kie(t)+Kd(e(t)-2*e(t-1)+e(t-2));

PID控制器的参数整定:

PID控制器的参数整定是控制系统设计的核心内容。PID控制器参数整定的方法很多,概括起来有两大类:一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数。这种方法所得到的计算数据未必可以直接用,还必须通过工程实际进行调整和修改。二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。PID控制器参数的整定方法,主要有临界比例法、反应曲线法和衰减法。三种方法各有其特点,其共同点都是通过试验,然后按照工程经验公式对控制器参数进行整定。但无论采用哪一种方法所得到的控制器参数,都需要在实际运行中进行最后调整与完善。

我个人经验,一般PID参数确定的步骤如下:

在这里插入图片描述

C语言实现PID控制算法

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动控制之PID原理 的相关文章

  • PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现

    对于一般的时滞系统来说 设定值的变动会产生较大的滞后才能反映在被控变量上 从而产生合理的调节 而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统 其特点是当扰动产生后 被控变量还未变化以前 根据扰动作用的大小进行控制 以补偿扰
  • 基于LabVIEW的PID算法解读

    记录一下 方便以后翻阅 下图是基本的PID算法实现方式 以及实现PID控制器所需的假设和转换 为实现PID控制器 LabVIEW要求算法对输入信号进行采样并离散积分和微分操作 一 误差计算 e k SP k PV k 上式中 e k 表示当
  • 深入浅出PID控制算法(二)————PID算法离散化和增量式PID算法原理及Matlab实现

    引言 上篇介绍了连续系统的PID算法 但是计算机控制是一种采样控制 他只能根据采样时刻的偏差来计算控制量 因此计算机控制系统中 必须对公式进行离散化 具体就是用求和代替积分 用向后差分来代替微分 使模拟PID离散化为数字形式的差分方程 准备
  • 单端反激——隔离型DC/DC变换器的设计及仿真

    单端反激 隔离型DC DC变换器的设计及仿真 技术指标 1 原理分析 2 参数设计 3 仿真验证 技术指标 输入电压 V s m i n
  • PID控制算法01

    PID控制算法 PID控制算法公式 原理 参数作用 PID算法及改进 两个基本类型 位置型PID控制 增量型PID控制 积分环节改进的PID控制 积分分离的PID控制 变速积分的PID控制 抗积分饱和的PID控制 微分环节改进的PID控制
  • 在Qt中fork后获取进程的PID

    我正在创建一个成功分叉的 Qt C 控制台应用程序 当我在 fork 之前调用 QCoreApplication applicationPid 然后在 fork 之后 在子进程中 调用 QCoreApplication applicatio
  • 什么是 .pid 文件以及它包含什么?

    我最近遇到了一个扩展名为 pid 的文件 并查看了它的内部 但没有找到太多内容 这文档 says Pid 文件是包含进程标识号 pid 的文件 该文件存储在文件系统的明确定义位置 从而允许其他程序找到正在运行的脚本的 pid 任何人都可以对
  • C++ 在 Windows 中发送简单信号

    Windows 上是否有相当于kill 的函数 int kill pid t pid int sig 如果没有 是否可以根据进程的 PID 来测试进程是否正在运行 Thanks Windows 没有 Unix 意义上的信号 您可以使用Ope
  • 如何在 OSX 10.9 中从 ProcessSerialNum 获取 PID?

    GetProcessPID在 OSX 10 9 中被标记为已弃用 并附有注释 使用适当的 processIdentifier 属性 NSRunningApplication 对象 问题是构造类方法NSRunningApplication没有
  • 子进程和父进程ID

    只是与子进程块中的父 pid 值混淆了 我的程序如下 int main int argc char argv pid t pid pid fork if pid 1 perror fork failure exit EXIT FAILURE
  • 如何确定 Linux 上是否使用 Java 或 JRuby 运行不同的进程 ID?

    我需要查看给定的进程 ID 是否正在运行 并且它必须在 Java 或 JRuby 中工作 最好是 Ruby 解决方案 它可能取决于 Linux 系统 特别是 Debian 和 或 Ubuntu 我已经有了我要找的PID 只需要看看它当前是否
  • 打印 pid_t 的正确 printf 说明符是什么

    我目前正在使用显式转换为 long 并使用 ld用于印刷pid t 是否有一个说明符 例如 z for size t for pid t 如果不是最好的打印方式是什么pid t 没有这样的说明符 我认为你在做什么 铸造pid t to lo
  • os.kill 没有引发 OSError,但是我没有看到给定的 pid 正在运行

    在我的 ubuntu 服务器上运行以下命令 python c import os os kill 5555 0 这样做是为了查看 pid 5555 是否正在运行 根据我的理解 如果 pid 没有运行 这应该会引发 OSError 这不会对我
  • 如何在shell脚本中从fork子进程获取PID

    我相信我可以从父进程派生出 10 个子进程 下面是我的代码 bin sh fpfunction n 1 while n lt 20 do echo Hello World n times sleep 2 echo Hello World2
  • 如何在Windows中通过端口查找PID并使用java杀死找到的任务

    我需要通过进程端口在java代码中杀死进程 我可以在 cmd 中手动执行此操作 例如 C gt netstat a n o findstr 6543 TCP 0 0 0 0 6543 0 0 0 0 0 LISTENING 1145 TCP
  • Mysql 连接到服务器:用户 root@localhost 的访问被拒绝

    edit9 是否有可能我只是缺少文件夹的一些权限 我真的非常非常感谢更多的建议 edit3 由于这篇文章没有得到足够的回复 而且这绝对是至关重要的 我尽快完成这件事 我重建了我的帖子以显示我认为到目前为止我已经扣除的内容 注意 通过许多不同
  • 如何在bash中列出所有后台pid

    要么我无法正确表达我的搜索 要么答案不容易找到 但我正在尝试找出如何列出我的所有后台任务 PID 例如 到目前为止 我发现要列出我们使用的最后一个 PID 但现在我想列出之前任务的 PID 如果存在 但我找不到如何做到这一点 最终我想列出我
  • docker 容器无法启动,因为现有的 pid 文件

    当我启动 docker 容器时 它会失败 因为现有的 pid 文件 root newhope sergio docker logs sharp shockley httpd pid 1 already running httpd pid 1
  • 如何在不使用adb shell的情况下获取android应用程序的pid?

    如何在不使用 adb shell 的情况下获取 Android 应用程序 pid 有没有API可以获取pid 任何帮助将不胜感激 由于每个应用程序都有自己的进程ID 因此可以通过 int pid android os Process myP
  • 如何从 Ruby 检查具有特定 pid 的进程是否正在运行?

    如果有多种方法 请列出 我只知道一个 但我想知道是否有一种更干净的 Ruby 方式 之间的区别Process getpgid and Process kill方法似乎是当 pid 存在但由另一个用户拥有时发生的情况 Process getp

随机推荐

  • ORB-SLAM2与OpenMVS对接实现三维重建

    详细介绍如何实现ORB SLAM2与OpenMVS的对接过程 xff0c 打通上下游实现三位重建 xff0c 二话不说先干图 对于学SLAM的同学对ORB SLAM2可能并不陌生 xff0c 系统框架清晰明了 xff0c 代码风格清新脱俗
  • 基于安卓AndroidStudio校园求职招聘app设计

    开发软件 xff1a Eclipse Idea 43 Android Studio 43 mysql 这是一个基于AndroidStudio前后端分离开发的校园大学生求职招聘app 后端使用java语言的Springboot框架开发 xff
  • 气压计MS5611

    经过几天的痛苦挣扎 终于搞定了 完成气压计的参数读写 xff0c 温度检测 xff0c 大气压计算 因为这款气压计精度高 xff0c 好多计算需要用到正负数 xff0c 整数小数 xff0c 浮点整形 xff0c 有的计算结果特别大 xff
  • Android 序列化Parcelable的使用详解

    背景 xff1a 在Java虚拟机中 xff0c 对象的传递称为数据传递不可或缺的一部分 xff0c 但如果一旦虚拟机停止工作 xff0c 该对象在内存中也就被释放 xff0c 地址空间不存在 xff0c 对象自然就不能再被重复利用 xff
  • 口袋云台拆机微型防抖云台硬件结构解析拆机硬件结构开源云台svpwm控制simple云台storm防抖原理陀螺仪多旋翼吊舱飞控无刷电机FOC

    口袋云台拆机微型防抖云台硬件结构 18大疆发布了众所周知的osmo packet xff0c 其微小的体积和卓越的性能让用户爱不释手 虽然现已是2020年 xff0c 各大厂商都争先推出相关竞品 xff0c 大疆凭借强大的技术后盾产品力自然
  • 开启Java8来启用Lambda表达式在Android Studio的一些配置

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来 xff0c 用它写博客 xff0c 将会带来全新的体验哦 xff1a Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传
  • IPQ4019/QCA9531/MT7628/MT7621系嵌入式无线双频AP核心模块选型探讨

    嵌入式双频无线AP核心模块 首先是核心模块 不是成品主板 也可以认为是成品的核心部分 xff0c 或者理解成只带方便延伸的接口功能 xff0c 不带外围实际接口的成品 xff0c 实际使用时 xff0c 可以根据所需要的接口灵活选择 未必要
  • nginx为什么是多进程单线程和多路IO复用模型

    Nginx现在是非常火爆的web服务器 xff0c 她使用更少的资源 xff0c 支持更多的并发连接数 xff0c 她实现了linux的epoll模型 xff0c 能够支持高达 50 000 个并发连接数的响应 Nginx采用的是多进程单线
  • python函数变量和内置函数

    一 函数的作用域 1 全局变量 xff1a 函数外部定义的变量 xff1a 叫做全局变量 xff0c 全局变量顾名思义就指定不管是函数内部还是函数外部都能够访问 2 局部变量 xff1a 局部变量 xff0c 就是在函数内部定义的变量 xf
  • vector erase删除第几个

    vector lt int gt Ilist Ilist push back 1 Ilist push back 2 Ilist push back 3 Ilist push back 4 Ilist push back 5 Ilist e
  • GLEW_ERROR_NO_GL_VERSION missing GL version一种解决方法

    可能你在代码里面指定了 GLFW 的版本号 xff0c 代码如下 xff1a glfwWindowHint GLFW CONTEXT VERSION MAJOR 4 glfwWindowHint GLFW CONTEXT VERSION M
  • have datatype/md5sum 相关的错误 IndentationError: unexpected indent

    类似的错误信息如下 xff1a ERROR 1611906790 607272604 Client listener 5059 456439 wants topic move base simple goal to have datatyp
  • 运行错误 terminate called without an active exception

    运行错误 xff1a terminate called without an active exception xff0c 可能的原因 xff1a 下面的代码中的 t41 join t42 join t43 join 注释掉会出现这个错误
  • link error : undefined reference to `main‘

    今天发现一个编译错误 xff1a undefined reference to 96 main 39 xff0c 意思是main函数没有定义 xff0c 明明定义了啊 xff0c 结果发现main函数被namespace包起来了 xff0c
  • dtsi编译错误

    1 FATAL ERROR Unable to parse input tree DTC arch arm64 boot dts rockchip rk3568 evb1 ddr4 v10 dtb Error arch arm64 boot
  • 理解dtsi中的&

    1 dtsi中的 amp 怎么理解呢 可以把它理解引用 xff0c 因为dtsi中的每个模块 xff08 驱动程序 xff09 都是用 xff5b xff5d 包在内的 xff0c 所以当你要修改某个模块A时 xff0c 可以不直接在它定义
  • 根据用户IP抓取MEC地址

    package com ccit web recommonedCode dao impl import java io BufferedReader import java io InputStreamReader import java
  • 说一说 RTThread 系统 开发过程的坑。。。

    1 系统文件 与 ST 官方的不一致 xff0c 无法兼容Cube MX xff0c 导致用户自行开发 外设时 需要大量初始化工作 xff0c 而且遇到问题难以查找 原因 xff0c 因为系统初始化过程 与官方差异较大 xff0c 这点 入
  • 几种2.4G无线数传模块电路

    一 几种2 4G无线数传模块介绍 无线数传按传输速率区分 分为低速数传模块和高速数传模块两大类 低速数传模块 使用的载频均较低 xff0c 一般都在 315MHz 433MHz 和 915MHz 这几个频段 xff0c 所以一般最高传输速率
  • 自动控制之PID原理

    自动控制原理 从控制的方式看 xff0c 自动控制系统有闭环和开环两种 闭环控制 xff1a 闭环控制也就是 xff08 负 xff09 反馈控制 xff0c 原理与人和动物的目的性行为相似 xff0c 系统组成包括传感器 xff08 相当