自动控制:带死区的PID控制算法

带死区的PID控制算法

在计算机控制系统中,为了避免控制动作过于频繁,消除因频繁动作所引起的振荡,可采用带死区的PID控制。带死区的PID控制通过引入一个死区,使得在误差较小的范围内不进行控制动作,从而减少控制系统的频繁调整,提高系统的稳定性。

理论基础

传统PID控制算法

传统PID控制器的控制律为:

u ( t ) = K p e ( t ) + K i ∫ e ( t ) d t + K d d e ( t ) d t u(t) = K_p e(t) + K_i \int e(t) \, dt + K_d \frac{d e(t)}{dt} u(t)=Kpe(t)+Kie(t)dt+Kddtde(t)

其中:

  • u ( t ) u(t) u(t) 是控制输入
  • e ( t ) = r ( t ) − y ( t ) e(t) = r(t) - y(t) e(t)=r(t)y(t) 是误差信号
  • K p K_p Kp 是比例增益
  • K i K_i Ki 是积分增益
  • K d K_d Kd 是微分增益

带死区的PID控制算法

带死区的PID控制器通过在误差信号上引入一个死区 δ \delta δ,使得在误差 e ( t ) e(t) e(t) 的绝对值小于死区 δ \delta δ 时,控制输入 u ( t ) u(t) u(t) 不进行调整。其控制律为:

u ( t ) = { K p e ( t ) + K i ∫ e ( t ) d t + K d d e ( t ) d t if  ∣ e ( t ) ∣ > δ 0 if  ∣ e ( t ) ∣ ≤ δ u(t) = \begin{cases} K_p e(t) + K_i \int e(t) \, dt + K_d \frac{d e(t)}{dt} & \text{if } |e(t)| > \delta \\ 0 & \text{if } |e(t)| \leq \delta \end{cases} u(t)={Kpe(t)+Kie(t)dt+Kddtde(t)0if e(t)>δif e(t)δ

其中:

  • δ \delta δ 是死区的阈值

公式推导

带死区的PID控制算法可以通过以下步骤推导得到:

  1. 定义误差信号:

e ( t ) = r ( t ) − y ( t ) e(t) = r(t) - y(t) e(t)=r(t)y(t)

  1. 判断误差是否在死区范围内:

∣ e ( t ) ∣ ≤ δ |e(t)| \leq \delta e(t)δ

  1. 根据误差范围计算控制输入:

u ( t ) = { K p e ( t ) + K i ∫ e ( t ) d t + K d d e ( t ) d t if  ∣ e ( t ) ∣ > δ 0 if  ∣ e ( t ) ∣ ≤ δ u(t) = \begin{cases} K_p e(t) + K_i \int e(t) \, dt + K_d \frac{d e(t)}{dt} & \text{if } |e(t)| > \delta \\ 0 & \text{if } |e(t)| \leq \delta \end{cases} u(t)={Kpe(t)+Kie(t)dt+Kddtde(t)0if e(t)>δif e(t)δ

Python代码示例

下面是一个实现带死区的PID控制器的Python代码示例。假设我们有一个简单的温度控制系统,通过带死区的PID控制器保持系统温度在期望值。

import numpy as np
import matplotlib.pyplot as plt# 定义系统参数
dt = 0.1  # 时间步长
t = np.arange(0, 20, dt)  # 时间数组
n = len(t)# 初始化状态变量
temperature = np.zeros(n)  # 系统温度
desired_temperature = np.zeros(n)  # 期望温度
desired_temperature[100:] = 50  # 期望温度从时间t=10s开始为50
external_disturbance = np.sin(t) * 5  # 外界扰动# 控制器参数
Kp = 2.0  # 比例增益
Ki = 1.0  # 积分增益
Kd = 0.5  # 微分增益
delta = 1.0  # 死区阈值# 初始化误差变量
e_prev = 0  # 上一时刻的误差
integral = 0  # 误差积分# 模拟系统
for i in range(1, n):# 计算误差e = desired_temperature[i] - temperature[i-1]# 判断误差是否在死区范围内if abs(e) > delta:# 误差积分integral += e * dt# 误差微分derivative = (e - e_prev) / dt# PID控制器u = Kp * e + Ki * integral + Kd * derivativeelse:u = 0  # 在死区范围内,控制输入为0# 更新系统温度temperature[i] = temperature[i-1] + (u + external_disturbance[i]) * dt# 更新上一时刻的误差e_prev = e# 绘制结果
plt.figure(figsize=(10, 4))
plt.plot(t, desired_temperature, label='Desired Temperature')
plt.plot(t, temperature, label='Actual Temperature')
plt.plot(t, external_disturbance, label='External Disturbance')
plt.xlabel('Time [s]')
plt.ylabel('Temperature')
plt.legend()
plt.title('Dead Zone PID Control for Temperature System')
plt.grid(True)
plt.show()

在这里插入图片描述

代码解释

  1. 系统参数和时间数组:定义了时间步长 dt 和时间数组 t,用来模拟系统在一段时间内的行为。
  2. 状态变量初始化:初始化了系统温度 temperature、期望温度 desired_temperature 和外界扰动 external_disturbance
  3. 控制器参数:定义了带死区的PID控制器的比例增益 Kp、积分增益 Ki、微分增益 Kd 和死区阈值 delta
  4. 误差变量初始化:初始化了上一时刻的误差 e_prev 和误差积分 integral
  5. 系统模拟:通过迭代计算,在每个时间步长内根据带死区的PID控制律计算控制输入,并更新系统温度。
  6. 结果绘制:使用 matplotlib 绘制系统温度、期望温度和外界扰动的变化曲线。

结论

带死区的PID控制器通过在误差信号上引入一个死区,有效减少了控制系统的频繁调整,避免了因频繁动作所引起的系统振荡,从而提高了系统的稳定性。在实际应用中,带死区的PID控制器适用于控制量需要频繁调整的场合,能够显著改善系统的动态特性。结合Python代码示例,可以更直观地理解带死区的PID控制器的基本原理和实现方法。

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

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

相关文章

将nvim的配置 上传gitee

首先是创建仓库 接着进入这个界面 然后是上传代码, 结果: 可以看到已经是可以了。 然后是 拉取代码进行测试。 第一次 拉取 使用 git clone .(家里) 做一点修改,然后上传。(公司) 然后在git pu…

【ROS2】概念:中级-不同的 ROS 2 中间件供应商

目录 支持的 RMW 实现多种 RMW 实现默认 RMW 实现 ROS 2 构建在 DDS/RTPS 之上,作为其中间件,提供发现、序列化和传输。本文( https://design.ros2.org/articles/ros_on_dds.html )详细解释了使用 DDS 实现和/或 DDS 的 RTPS 有线…

Linux驱动开发——字符设备驱动开发

1 概述 1.1 说明 本文是学习rk3568开发板驱动开发的记录,代码依托于rk3568开发板 1.2 字符设备介绍 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺…

用 Manim 库来生成一个树形结构的动画

完整代码: from manim import * class LargeTreeGeneration01(MovingCameraScene): DEPTH 3 CHILDREN_PER_VERTEX 2 LAYOUT_CONFIG {"vertex_spacing": (0.8, 1)} VERTEX_CONF {"radius": 0.12, "color": BLUE_B, "fi…

java基础概念05-运算符

一、自增自减运算符 二、赋值运算符 2-1、注意 三、关系运算符 四、逻辑运算符 4-1、短路逻辑运算符 五、三元运算符 六、运算符的优先级

Catalyst优化器:让你的Spark SQL查询提速10倍

目录 1 逻辑优化阶段 2.1 逻辑计划解析 2.2 逻辑计划优化 2.2.1 Catalys的优化过程 2.2.2 Cache Manager优化 2 物理优化阶段 2.1 优化 Spark Plan 2.1.1 Catalyst 的 Join 策略 2.1.2 如何决定选择哪一种 Join 策略 2.2 Physical Plan 2.2.1 EnsureRequirements 规则 3 相关文…

Linux基本用法(上)

1.计算机主要由 硬件和软件 组成 2.操作系统是什么 ? 有什么作用? 操作系统是软件的一类 主要作用是协助用户调度硬件工作,充当用户和计算机之间的桥梁 3.常见的操作系统有哪些? PC端: Windows,Linux,MacOS 移动端: Android&#xff…

搭建cool-admin-java(前端vue)项目

为什么选择 Cool Admin?​ 随着技术不断地发展,特别是最近 Ai 相关的技术发展,以往的框架已经越来越不能满足现代化的开发需求。 Cool Admin 做为后来者有后发优势,主要特点: Ai 编码,从页面到后端代码&…

数据库实验:SQL Server创建数据库及基本表

一、实验目的: 1、掌握使用SQL SERVER Management Studio工具连接数据库引擎; 2、掌握使用CREATE TABLE 创建基本表的用法; 3、掌握使用ALTER TABLE 修改基本表的用法; 4、掌握使用DROP TABLE删除基本表的用法; 二…

姜夔,师法自然的不仕道人

姜夔(ku),字尧章,号白石道人,约生于南宋绍兴二十四年(公元1154年),卒于南宋嘉定十四年(公元1221年),享年67岁。他的艺术成就涵盖了诗词、散文、书…

Rpi Zero W做的老头乐声控灯

祭图__|\0>历经各种尝试,最后选了docker 里装个rhasspy,配上paho-mqtt搞出了这个奇葩夜灯。各种曲折就不说了,直接分享捷径思路。 这个绿板子是respeaker hat with 2 mic 用的是seeed-voicecard,跟着github编译,不…

微信小程序开发(百货商战)实战项目的购物车和个人中心的创建

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

玩转usbserver之usbserver日志报警

一、graylog 介绍 graylog是一个简单易用、功能较全面的日志管理工具,graylog也采用Elasticsearch作为存储和索引以保障性能,MongoDB用来存储少量的自身配置信息,master-node模式具有很好的扩展性,UI上自带的基础查询与分析功能比…

JAVAWeb实战(后端篇)

因为前后端代码内容过多,这篇只写后端的代码,前端的在另一篇写 项目实战一: 1.创建数据库,表等数据 创建数据库 create database schedule_system 创建表,并添加内容 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------…

向日葵RCE复现(CNVD-2022-10270/CNVD-2022-03672)

一、环境 1.1 网上下载低版本的向日葵<2022 二、开始复现 2.1 在目标主机上打开旧版向日葵 2.2 首先打开nmap扫描向日葵主机端口 2.3 在浏览器中访问ip端口号cgi-bin/rpc?actionverify-haras &#xff08;端口号&#xff1a;每一个都尝试&#xff0c;直到获取到session值…

动手学深度学习V2每日笔记(权重衰退+Dropout)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1UK4y1o7dy/vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录&#xff0c;内容不会特别严谨仅供参考。 1.函数目录…

科普文:万字详解Kafka基本原理和应用

一、Kafka 简介 1. 消息引擎系统ABC Apache Kafka是一款开源的消息引擎系统&#xff0c;也是一个分布式流处理平台。除此之外&#xff0c;Kafka还能够被用作分布式存储系统&#xff08;极少&#xff09;。 A. 常见的两种消息引擎系统传输协议&#xff08;即用什么方式把消息…

【机器学习】探索图神经网络 (GNNs): 揭秘图结构数据处理的未来

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ ​ &#x1f48e;1. 引言 图结构数据在现实世界中无处不在&#xff0c;从社交网络中的用户关系&#xff0c;到推荐系统中的用户-物品交互&#xff0c;再到生物信息学中的分子结构。传统的机器学习模型在处理这些数据时常常力…

【Unity插件】Editor Console Pro:提升开发效率的神器

在 Unity 开发过程中&#xff0c;控制台&#xff08;Console&#xff09;是我们排查错误、获取信息的重要窗口。而 Editor Console Pro 则是 Unity 编辑器控制台的强大替代品&#xff0c;为 Unity 的控制台带来了更多实用的功能和改进&#xff0c;极大地提升了开发效率。 一、…

力扣刷题----42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xf…