当前位置: 首页 > news >正文

什么是PID控制?

一、概念

        PID控制是一种广泛应用于工业控制系统中的反馈控制算法,其名称来源于比例(Proportional)、积分(Integral)和微分(Derivative)三个控制作用。PID控制通过这三种控制作用的组合来调节系统的输出,使其达到期望的目标值。PID结构简单、易于实现、鲁棒性强,在温度控制、压力控制、流量控制、位置控制等各种工业场景中发挥了重要作用。例如,我们常用来设置固定温度煮茶的养生壶,其内置的温控模块往往就会采用PID控制。

二、原理

        PID控制器的总输出是比例、积分和微分三部分的综合,具体如下。

1、比例控制(P)

        比例控制是根据当前误差的大小来调整控制输出。误差是指系统的实际输出与期望输出之间的差值。比例控制的作用是使控制输出与误差成正比,公式为:

P(t) = K_{p} \cdot e(t)

        其中,K_{p}是比例增益,e(t)是在时刻 t 的误差。

2、积分控制(I)

        积分控制是根据误差随时间的累积来调整控制输出。它的作用是消除系统的稳态误差,即使得长期的误差趋于零。积分控制的公式为:

I(t) = K_{i} \cdot \int_{0}^{t}e(\tau )d \tau

        其中,K_{i}是积分增益,公式剩下的部分是从时刻 0 到时刻 t 的误差积分。

3、微分控制(D)

        微分控制是根据误差的变化率来调整控制输出。它的作用是预测误差的变化趋势,从而提前进行调整,减少超调和振荡。微分控制的公式为:

D(t) = K_{d} \cdot \frac{de(t)}{dt}

        其中,K_{d}是微分增益,公式其余部分是误差的导数。

4、总体公式

        由此,PID控制器的输出公式为:

u(t) = K_{p} \cdot e(t) + K_{i} \cdot \int_{0}^{t}e(\tau )d \tau + K_{d} \cdot \frac{de(t)}{dt}

        PID控制器的性能取决于三个增益参数的选择,调节这些参数的过程称为PID调节。常用的调节方法包括经验法、Ziegler-Nichols法、自动调节法(如遗传算法、粒子群优化)等

三、python实现

        这里,我们构建一个简单的PID控制算法,模拟养生壶的水温加热过程。运行程序之后可以看到,随着迭代次数的增加,水温趋于稳定并收敛于我们期望的设定温度。

class PID:  
    def __init__(self, Kp, Ki, Kd):  
        self.Kp = Kp    # 比例系数(反应速度)  
        self.Ki = Ki    # 积分系数(消除残留误差)  
        self.Kd = Kd    # 微分系数(抑制震荡)  
        self.last_error = 0  
        self.integral = 0  

    def compute(self, setpoint, current):  
        error = setpoint - current                # 当前误差  
        self.integral += error                    # 累积误差  
        derivative = error - self.last_error      # 误差变化趋势  
        output = (self.Kp * error +  
                  self.Ki * self.integral +  
                  self.Kd * derivative)           # 三部分合力  
        self.last_error = error  
        return output  

# 模拟使用(目标40℃,初始35℃)  
pid = PID(Kp=0.8, Ki=0.05, Kd=0.2)  
current_temp = 35  
for _ in range(30):  
    control = pid.compute(40, current_temp)  
    # 模拟加热效果(控制量影响温度变化)  
    current_temp += control * 0.5  
    print(f"当前温度:{current_temp:.1f}℃")  

http://www.dtcms.com/a/107930.html

相关文章:

  • FFmpeg命令详解
  • 波动率 计算学习 离散系数
  • 【JavaScript】十四、轮播图
  • 探索Ark-TS语言:什么是Ark-TS?如何入门?有什么基础容易上手?
  • 系统分析师备考启动
  • HashMap底层采用数组+链表而非数组+数组的设计,主要基于以下原因及两者的对比:
  • docker安装ngnix
  • diffusion-vas 提升遮挡区域的分割精度
  • openEuler24.03 LTS下安装Flume
  • 动态规划:第一弹(第N个泰波那契数列、使用最小花费爬楼梯、解码方法)
  • AI安全:构建负责任且可靠的系统
  • leetcode287.寻找重复数
  • 【开发问题记录】回流(Reflow) 和 重绘(Repaint)
  • C++的UDP连接解析域名地址错误
  • React PDF 预览终极优化:30 页大文件不卡,加载快如闪电!
  • 【机器学习】嘿马机器学习(算法篇)第14篇:决策树算法,学习目标【附代码文档】
  • Bigemap手机app数据照片同步至电脑教程
  • 数据结构初阶:二叉树的前中后序三种遍历(递归的暴力美学)
  • 3D意识(3D Awareness)浅析
  • 【Spring Boot 与 Spring Cloud 深度 Mape 之一】剖析 Spring Boot 核心:从快速构建到自动配置原理与实战
  • 零基础 LangGraph 多智能体开发
  • 使用mysqldump进行远程mysql本地定时备份
  • 模板模式——设计模式
  • 记一个.NET AOT交叉编译时的坑
  • 18认识Qt坐标系
  • 青少年编程与数学 02-015 大学数学知识点 01课题、概要
  • 【28BYJ-48】STM32同时驱动4个步进电机,支持调速与正反转
  • vue3二次封装ElDatePicker
  • Vue 组件命名及子组件接收参数命名
  • 汇编学习之《call, return指令》