从零开始之PID控制

news2024/11/14 15:12:56

        从零开始系列之PID控制,宗旨就是以说人话的方式讲述它,真正的做到从零开始,小白一看就会,一学就废。

一、什么是PID控制?

        PID控制(比例-积分-微分控制)由比例单元(Proportional)、积分单元(Integral)和微分单元(Derivative)组成。可以通过调整这三个单元的增益系数 Kp、Ki和Kd来调定其特性。

        PID控制是一个在工业控制应用中常见的反馈控制。通过把实际采集到的数据和一个设定的目标值进行比较,得到误差值,然后把误差值用于计算出新的输入值,这个新的输入值的目的是可以让系统输出的实际数据达到或者保持在设定的目标值。PID控制器可以根据历史数据和差别的出现率来调整输入值,使系统更加准确而稳定。主要适用于基本上线性,且动态特性不随时间变化的系统。

        控制的逻辑图如下:

        举个例子,在一个电压源的系统中,我需要一个5V的输出电压,此时设定输入r(t) = 5,假如此时输出为0V,那么此时的误差e(t)= -5,然后通过下面公式计算出u(t),给到输出,然后重复之前的步骤直到误差e(t) = 0,就达到了最终的控制目的。

二、PID参数

1.参数含义:

        P:比例项,误差值和一个正值的常数Kp(表示比例)相乘。

        Kp只是在控制器的输出和系统的误差成比例的时候成立。比如,一个电热器控制器是在目标温度和实际温度差10°C时有100%的输出,而其目标值是25°C。那么它在15°C的时候会输出100%,在20°C的时候会输出50%,在24°C的时候输出10%,注意在误差是0的时候,控制器的输出也是0,若要让受控输出为非零的数值,就需要产生一个稳态误差或偏移量。

        若比例增益大,在相同误差量下,会有较大的输出,但若比例增益太大,会使系统不稳定。相反的,若比例增益小,若在相同误差量下,其输出较小,因此控制器会较不敏感的。若比例增益太小,当有干扰出现时,其控制信号可能不够大,无法修正干扰的影响。

        当比例系数Kp=1时,y=x(这里x = e(t),y = Pout),Kp越大,斜率越大。输出与误差信号成正比,换句话说,比例控制器的输出是误差信号和比例增益的乘积。

        比例项的作用是调节系统的响应速度,增大比例增益可以提高系统的响应速度,但可能导致不稳定性;减小比例增益可以增加系统的稳定性,但可能导致响应速度过慢。

        本身无法完全消除稳态误差,因为比例控制是一种线性反馈控制,其输出与误差成正比,只根据当前的误差大小产生控制输出,而无法纠正已经累积的误差。

        I:积分项,积分控制考虑过去误差,将过去一段时间的误差值总和乘以一个正值的常数Ki。

        这里的积分被称为定积分,它可以被解释为平面上区域的带符号的面积,该区域由给定函数在实直线上两点之间的图形所包围。通常,平面横轴以上的面积为正,而平面横轴以下的面积为负。

        积分是对误差随时间的累积,如果应用比例控制后存在残余误差,则积分项试图通过添加由于误差的历史累积值而产生的控制效应来消除残余误差。当误差消除后,积分项将停止增长。

        D:微分项,考虑将来误差,计算误差的一阶导,乘以一个正值的常数Kd。

        这个导数的控制会对系统的改变作出反应。导数的结果越大,那么控制系统就对输出结果作出更快速的反应。这个Kd参数也是PID被称为可预测的控制器的原因。Kd参数对减少控制器短期的改变很有帮助。一些实际中的速度缓慢的系统可以不需要Kd参数。

        求导的过程称为微分,在数学中,导数表示函数的输出相对于输入变化的敏感性。导数是微积分的基本工具。例如,运动物体的位置相对于时间的导数是物体的速度:它测量的是随着时间的推移物体的位置变化有多快。

    微分项根据误差的变化率来调整控制输出,帮助预测系统输出的趋势,并对输出的变化率进行调整。

   

2.参数概述        

        PID控制器的比例单元(P)、积分单元(I)和微分单元(D)分别对应目前误差、过去累计误差及未来误差。若是不知道受控系统的特性,一般认为PID控制器是最适用的控制器。

        控制器的响应可以用控制器对误差的反应快慢、控制器过冲的程度及系统震荡的程度来表示。

        不过使用PID控制器不一定保证可达到系统的最佳控制,也不能保证系统稳定性。有些应用只需要PID控制器的部分单元,可以将不需要单元的参数设为零即可。

        因此PID控制器可以变成PI控制器、PD控制器、P控制器或I控制器。其中又以PI控制器比较常用,因为D控制器对回授噪声十分敏感,而若没有I控制器的话,系统不会回到参考值,会存在一个误差量。

        总而言之,比例项提供快速的响应,积分项消除稳态误差,微分项改善系统的动态响应,综合使用比例、积分和微分三个控制项从而实现高效、稳定的控制性能。但在实际应用中,需要根据具体系统的特性和需求,合理选择和调节PID控制器的增益参数,以达到最优的控制效果。

三、实现一个简单的PID控制算法

1、实现步骤如下

  1. 计算误差,error=设定值-实际值。
  2. 计算比例值,P= Kp * error
  3. 计算积分值,I= Ipre + Ki * Ts * error
  4. 计算微分值,D= Kd * (error – error_pre)/ Ts
  5. 计算PID值,PID = P + I + D
  6. 将PID值输出到控制器。
  7. 重复上面的步骤。

2、实际使用注意

        实际在实现上述步骤的时候,还会有一些问题,毕竟不能以理想情况考虑,比如,

1、积分饱和

        若设定值有大的变动,其积分量会有大幅的变化,大到输出值被上下限限制而饱和,因此系统会有过冲,而且即使误差量符号改变,积分量变小,但输出值仍被上下限限制,维持在上限(或下限),因此输出看似没有变化,系统仍会持续的过冲,一直要到输出值落在上下限的范围内,系统的回授量才会开始下降。此问题可以用以下方式处理:

        - 在程序变数离开可控制范围时,暂停积分

        - 让积分值限制在一个较小的上下范围内

       - 重新计算积分项,使控制器输出维持上下限之间的范围内

        积分饱和讲人话方式:还是上面那个电压源,当设定值突然很大(10000V),这时积分项会超出输出值很多(10000V以上),在后面的调节中,比如设定输出电压为3V时,首先要将积分值(10000V以上)调到输出值范围(0-5V)后,才能对实际的控制进行调节,最后达到3V。

2、输出饱和

        PID输出值太大/小,超过实际控制值的范围,有些执行器可能无法识别这个控制值,会产生两种状态:控制无效,保持当前值不变、输出一个最大/最小控制状态。

3、输出变化太快。

        设定一个目标值后,PID输出值变化率很大,在一些反应比较慢的滞后系统或者状态改变不能突变的系统中,需要对这个变化率做限制,以免变化太快导致机器损坏或者造成其他危险。

4、等等。

3、c语言例程

        计算部分如下:

   // 1、计算误差
    float error = pid_handle->set_value - _sample_value;

    // 2、计算比例系数
    float proportional = pid_handle->P * error;

    // 3、计算积分系数
    // time_interval * 0.5f 是为了在离散时间积分中使用梯形规则(Trapezoidal Rule)进行数值积分。该方法使用当前时间间隔的一半来估计误差的变化率,并将其与之前的误差相加
    float integral = pid_handle->integral_prev + pid_handle->I * time_interval * 0.5f * (error + pid_handle->error_prev);

    // 4、限值积分项的取值范围,避免积分项过大或过小导致系统不稳定或响应不正确的问题
    integral = pid_data_constrain(integral, -pid_handle->output_max, pid_handle->output_max);

    // 5、计算微分项
    float derivative = pid_handle->D * (error - pid_handle->error_prev) / time_interval;

    // 6、计算输出值
    float output = proportional + integral + derivative;
    // 7、限值输出值
    output = pid_data_constrain(output, -pid_handle->output_max, pid_handle->output_max);

    // 8、输出变化率限制
    if (pid_handle->output_ramp > 0)
    {
        float output_rate = (output - pid_handle->output_prev) / time_interval;
        if (output_rate > pid_handle->output_ramp)
            output = pid_handle->output_prev + pid_handle->output_ramp * time_interval;
        else if (output_rate < -pid_handle->output_ramp)
            output = pid_handle->output_prev - pid_handle->output_ramp * time_interval;
    }

    // 9、存储当前值
    pid_handle->integral_prev = integral;
    pid_handle->output_prev = output;
    pid_handle->error_prev = error;
    pid_handle->times_prev = times_now;

    // 10、更新输出值
    pid_handle->output_value = output;

四、调参方法

1、人工调参

        这个就不用多说了,需要对PID的参数有一定的理解。

        有一种通用的方法如下:先将Ki及Kd设为零,增加Kp一直到回路输出震荡为止,之后再将Kp设定为“1/4振幅衰减”(使系统第二次过冲量是第一次的1/4)增益的一半,然后增加Ki直到一定时间后的稳态误差可被修正为止。不过若Ki可能会造成不稳定,最后若有需要,可以增加Kd,并确认在负载变动后回路可以够快的回到其设定值,不过若Kd太大会造成响应太快及过冲。一般而言快速反应的PID应该会有轻微的过冲,只是有些系统不允许过冲。因此需要将控制系统调整为过阻尼系统。

2、齐格勒-尼科尔斯方法

        一种启发式的调试方式,由John G. Ziegler和Nathaniel B. Nichols在1940年代导入,一开始也是将Ki及Kd设定为零,增加Kp比例增益直到系统开始等振幅振荡为止,当时的增益称为Ku,而振荡周期为Pu,即可用以下的方式计算增益:

五、PID控制举例

        用excle设计了一个PID控制系统,PID输出直接作用于执行器,执行器1:1输出。可自行下载文件体验调参,文件链接:PID控制数据例程.xlsx - 蓝奏云

        设定一个输入值后,通过调节PID系数,观察输出值的图表,文件内容:

          参数为Kp = 0.8、Ki = 0、Kd = 0时,输出如下图:

        参数为Kp = 0.8、Ki = 0.5、Kd = 0时,输出如下图:

        参数为Kp = 0.38、Ki = 0.41、Kd = 0.007时,输出如下图:

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

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

相关文章

玩耍的猫咪【 InsCode Stable Diffusion 美图活动一期】

1️⃣ 工具介绍 InsCode是一个集成了在线IDE、在线AI编程、在线算力租赁、在线项目部署以及在线SD 模型使用的综合代码开发平台。 Stable Diffusion是目前最火的AI绘画工具之一&#xff0c;它是一个免费开源的项目。通过Stable Diffusion&#xff0c;可以很轻松的通过文字描述…

上半年结束,下半年继续冲!

前言: 这周直播也把雷神写的Ffmpeg推流器讲解完了&#xff0c;而一同时&#xff0c;一转眼间&#xff0c;2023年已经过半&#xff0c;正式进入了下半年&#xff1a; 因为上半年已经开始在做解析Ffmpeg 最新版本的源码&#xff0c;所以下半年&#xff0c;我会继续坚持讲解Ffmpeg…

“GPT+健康医疗”赋能医疗行业“数智化”发展,景联文科技提供高质量医疗数据库

近日&#xff0c;ChatGPT这个代表着通用版的大型语言模型以其出色的表现在全球互联网上引人注目。它所使用的GPT技术基础为人工智能应用开启了全新的世界。 “大模型时代已经到来。它已变成基础设施&#xff0c;变成算力&#xff0c;变成生产力。大模型可能有通用技术&#xf…

C++杂谈-友元和操作符重载

1、友元- friend 我的理解&#xff1a;通过设置友元函数和友元类来让外部函数来访问私有成员&#xff0c;这样虽然破坏了类的封装型和隐藏性&#xff0c;但是提高了程序的运行效率&#xff08;减少了某些安全性检查的过程&#xff09;。 友元函数和友元类统称友元&#xff0c;…

Nginx+Tomcat(多实例)实现动静分离和负载均衡(四层、七层)

目录 一、Tomcat 多实例部署 二、反向代理的两种类型 三、NginxTomcat实现负载均衡和动静分离&#xff08;七层代理&#xff09; 1.动静分离和负载均衡原理 2.实现方法 3.部署实例 &#xff08;1&#xff09;部署Nginx负载均衡服务器 &#xff08;2&#xff09;配置Tom…

C++之GNU C的__attribute__常用属性(一百五十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

使用 ZBrush、Ornatrix 和 Substance 3D Painter 重现哈利波特中的凤凰

今天瑞云渲染小编给大家带来了Ramn Tapia 分享 Phoenix 项目背后的工作流程&#xff0c;解释了如何在 Ornatrix 中完成修饰&#xff0c;并展示了纹理化过程。 介绍 你好&#xff0c;有创造力的读者朋友们 我的名字是Ramn&#xff0c;但在数字艺术领域&#xff0c;我的名字是ra…

【 Android11 无线热点开发 】无线AP开与关、无线AP信息获取

前言 前面四篇文章介绍完了有线网络、无线网络的开发过程&#xff0c;下面介绍下Android 11上网络的终结篇&#xff0c;无线热点的开发流程。 相关文章 1、【 Android11 WiFi开发 一 】WiFi列表获取与展示 2、【 Android11 WiFi开发 二 】WiFi连接、断开 3、【 Android11 Wi…

软件为什么要进行故障演练?主要为了什么?

随着现代社会的高度信息化和软件的广泛应用&#xff0c;软件的质量和可靠性对于保障用户体验和信息安全显得尤为重要。为了保证软件的稳定运行和即时响应&#xff0c;软件故障演练成为软件开发和运维过程中的重要环节&#xff0c;那软件为什么要进行故障演练&#xff1f;主要为…

IIC(I2C)协议

I2C&#xff08;Inter-Integrated Circuit&#xff09;:是一种串行通信协议&#xff0c;用于在集成电路之间进行数据传输。它由飞利浦公司开发&#xff0c;并广泛应用在各种电子设备和传感器之间进行通信。 I2C通信协议由两根线组成&#xff1a; 一个是用于数据传输的串行数据线…

JVM关键知识点整理,从入门到提高到实践

文章目录 基础篇一、了解JVM内存结构程序计数器&#xff08;线程私有&#xff09;Java虚拟机栈&#xff08;线程私有&#xff09;本地方法栈&#xff08;线程私有&#xff09;方法区&#xff08;线程共享&#xff09;堆&#xff08;线程共享&#xff09;运行时常量池直接内存 二…

Android12之解决-Werror,-Wunused类似问题万能公式(一百五十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Unity3d跨平台原理是什么?

Unity3D的跨平台原理是通过提供统一的开发环境和工具、抽象化的底层接口、平台适配和优化&#xff0c;以及导出和发布功能来实现的。这让开发者们能够在一个平台上创建游戏&#xff0c;并轻松地将其移植和发布到其他支持的平台上&#xff0c;实现游戏的跨平台兼容性。 基于以下…

【大数据之Hadoop】三十七、Hadoop HA高可用

1、HA概述 实现高可用最关键的策略是消除单点故障。HA分成各个组件的HA机制&#xff1a;HDFS的HA和YARN的HA。   Hadoop2.0之前&#xff0c;在HDFS集群中NameNode存在单点故障&#xff08;SPOF&#xff09;。 NameNode主要在以下两个方面影响HDFS集群&#xff1a; &#xff…

Java设计模式之一:观察者模式

目录 一、什么是观察者模式 二、如何使用观察者模式 三、观察者模式的优势和使用场景 一、什么是观察者模式 观察者模式是一种常见的设计模式&#xff0c;用于在对象之间建立一对多的依赖关系。在该模式中&#xff0c;一个主题&#xff08;被观察者&#xff09;维护了一个观…

三相交流电相序检测器/三相交流电相序指示器电路设计

三相交流电相序检测器 在使用三相交流电动机时&#xff0c;需要知道所连接三相电源的相序&#xff0c;若相序不正确&#xff0c;则电动机的旋转方向将与所需的相反&#xff0c;从而导致安全事故。本电路的功能为检测三相交流电源的相序 &#xff0c;并在相序正确的前提下自动接…

15 线程

文章目录 线程创建MFC使用CreateThread线程案例&#xff08;AfxBeginThread MFC 创建线程&#xff09;开始创建线程线程暂停继续结束线程全部代码 线程创建 #include <stdio.h> #include <Windows.h>//线程处理函数 //线程1 DWORD WINAPI DoWork1(LPVOID lpParame…

BOSHIDA DC电源模块在自动化设备的详细应用

BOSHIDA DC电源模块在自动化设备的详细应用 DC电源模块是自动化设备中经常使用的电源设备&#xff0c;它可以将交流电转换成稳定的直流电&#xff0c;以满足自动化设备的电能需求。以下是DC电源模块在自动化设备中的详细应用&#xff1a; 1. 逆变器控制器&#xff1a;DC电源模…

SciencePub学术 | 算法类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 算法类重点SCI&EI征稿中&#xff01;2区闭源好刊&#xff0c;对国人非常友好。信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 算法类重点SCI&EI 【期刊简介】IF&#xff1a;6.0-6.5&#xff0c;JCR2区&#xff0c;中…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)三:找回密码界面及对应功能实现

一、本章内容 本章实现找回密码功能,包括短信验证码找回、邮箱验证码找回等功能,并通过node-send-email发送邮箱验证码,实现找回密码界面、接口等功能。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频