【研发日记】Matlab/Simulink技能解锁(十)——PID调参技巧

news2025/2/23 1:24:52

文章目录

 

前言

项目背景

参数P调节

参数I调节

参数D调节

整体优化

分析和应用

总结

参考资料


前言

        见《【研发日记】Matlab/Simulink技能解锁(五)——七个Simulink布线技巧》

        见《【研发日记】Matlab/Simulink技能解锁(六)——六种Simulink模型架构》

        见《【研发日记】Matlab/Simulink技能解锁(七)——两种复数移相算法》

        见《【研发日记】Matlab/Simulink技能解锁(八)——分布式仿真》

        见《【研发日记】Matlab/Simulink技能解锁(九)——基于嵌入式处理器仿真》

项目背景

        近期在一个嵌入式项目中用到了PID控制,利用周末时间对PID调参的一些基本规律和技巧总结一下。该项目的整体框架如下示例:

参数P调节

        为了更好地说明参数P,先把参数I和参数D设置为0,即不引入积分项和微分项,示例如下:

        参数P为1的初始状态,控制效果如下所示:

        从上图中可以看出,DCDC的输出电压U在目标值100V的上下剧烈的震荡,而且PID的控制输出也变化幅度非常大(理论值应该在30左右才是合理的),判断原因是参数P为1太大了,所以下面开始调整参数P值。

        第一次直接把参数P调小到1/10,即0.1,控制效果如下所示:

        从上图中可以看出,DCDC的输出电压U和PID的控制输出,震荡幅度相比初始状态已经减小了很多,而且能逐渐收敛到恒定值,说明前面参数P的调整是有效的。但是目前的震荡幅度还是不合格,所以要继续调整参数P。

        第二次再把参数P调小到1/10,即0.01,控制效果如下所示:

        从上图中可以看出,DCDC的输出电压U和PID的控制输出,震荡幅度相比前一次又大幅减小了,目前的震荡幅度暂时可以接受了,待后续微调优化。

参数I调节

        前面参数P暂定下来之后,就可以调整参数I了。下面基于P=0.01、D=0继续调试,参数I也从初始值1开始调试,初始控制效果如下所示:

        从上图中可以看出,DCDC的输出电压U,长时间与目标值100V之间保持较大的差距,差值的积分面积已经很大了,但是PID的控制输出仍然停留在较小值,判断原因是参数I为1太小了,所以下面开始调整参数I。

        第一次直接把参数I调大到10,即10,控制效果如下所示:

        从上图中可以看出,DCDC的输出电压U,与目标值100V之间的差距缩小的时间大幅减少了,说明前面对参数I的调整是有效的。但是目前的差距缩小速度还是不合格,所以要继续调整参数I。

        第二次再把参数P调大到10,即100,控制效果如下所示:

        从上图中可以看出,DCDC的输出电压U,与目标值100V之间的差距缩小的时间,相比前一次又大幅减小了,目前的逼近速度暂时可以接受了,待后续微调优化。

参数D调节

        前面参数P和参数I暂定下来之后,就可以调整参数D了。下面基于P=0.01、I=100继续调试,参数D也从初始值1开始调试,初始控制效果如下所示:

        从上图中可以看出,第一个周期的目标值100V刚建立起来时,产生的差值微分量就让PID的控制输出达到了饱和值100。后面的DCDC的输出电压U不管变化幅度大或小都会让PID的控制输出为0和100的饱和值。判断原因是参数D为1太大了,所以下面开始调整参数D。

        第一次直接把参数I调小到1/10,即0.1,控制效果如下所示:

        从上图中可以看出,第一次调整参数D的效果与初始效果基本一样,判断原因是PID的控制输出仍未进入饱和范围0和100之间,所以继续调整参数D。

        第二次再把参数I调小1/10,即0.01,控制效果如下所示:

        从上图中可以看出,PID的控制输出已经开始进入饱和范围0和100之间,而且DCDC的输出电压U的振幅已经有所收窄,说明前面对参数D的调整是有效的。但是目前的振幅还是不合格的,所以继续调整参数D。

        第三次和第四次分别再把参数I调小1/10,即0.0010.0001,控制效果如下所示:

        从上图中可以看出,第三次的参数D已经相较之前明显优化,第四次的参数D则进一步逼近可以接受的范围,所以参数D暂时不再继续调整,待后续微调优化。

整体优化

        至此参数P、参数I和参数D的基本值已经确定,下面基于P=0.01、I=100、D=0.0001进一步微调优化。

        第一步,对比参数D在PID控制器中发挥的作用,示例如下:

        从上图中可以看出,目标值100V刚建立起来后的早期阶段,微分项(参数D)能使PID的控制输出有较大的振幅,但是同时也是这种更激进的作用导致了同一时间段的DCDC的输出电压U的振幅扩大,两方面对比后决定把微分项拿到,即参数D=0

        下面基于P=0.01、I=100、D=0,进一步微调优化DCDC的输出电压U向目标值100V逼近的速度,示例如下:

        从上图中可以看出,当积分项I=100时DCDC的输出电压U逼近目标值的速度较慢,需要将近20ms。当积分项I=500时,电压U逼近目标值的速度大幅提高,只需大约4ms,但是带来了电压U的震荡。当积分项I=300,电压U逼近目标值的速度也提高挺多,只需大约6ms,同时电压U也不震荡了。速度和震荡两方面对比后,决定把积分项I设定为300。

        下面基于P=0.01、I=300、D=0,进一步微调优化DCDC的输出电压U达到目标值100V后的震荡问题,示例如下:

        从上图中可以看出,P=0.002和P=0.01相比,电压U的振幅并没有明显变化,而且PID的控制输出也没有明显变化(可能这个参数最小只能是0.01),说明该震荡不是由参数P引起的。分析推测可能的原因是,差值在上图的由正转负过程中会过零点,由于Controller是离散系统,对DCDC的连续系统识别不足,并且Duty转换为PWM时也会有连续和离散的转换过程,再加之DCDC电路中固有的电容电感特性,最终导致了上述震荡现象。因为目前的震荡幅值只有0.04V,相比100V的基准是非常小的,所以暂时不再继续优化,比例项参数P仍保留为0.01。

分析和应用

        1、参数P是对当前时刻的差值进行放大或衰减,降低系统的惰性,加快响应速度。与他的优点相对的是,参数P过大时可能会引起系统振荡使稳定性变差。单独使用参数P时,调整的是系统的比例系数,即目标值与最终稳定输出结果之间的比例关系,无法逼近目标值,除非设定一个精确计算的参数P,并且系统的特性从始至终不变。

        2、参数I是对累积差值进行放大或者衰减,并通过系统的负反馈作用减小偏差。只要参数I不是0,那么经过足够的时间后,积分项都能消除稳态偏差。参数I越大就能越加速这个过程。缺点是当有临时的外界扰动进入系统时,不能及时地克服扰动的影响。

        3、参数D是差值变化率进行放大和衰减,当被控对象快速接逼近目标值时,微分项会对抗这个趋势使得逼近速度减缓。差值变化越快,控制量就越大,负反馈校正量就越大。当差值变化很慢或者不变时,微分项的作用就为0。所以具有超前控制作用,有助于减小超调,克服振荡。

总结

        以上就是本人在研发中使用PID控制时,一些个人理解和分析的总结,主要介绍了PID参数调整的基本规律和技巧,展示了仿真运行的效果,并分析了三个PID的特点和适用场景。

        后续还会分享另外几个最近解锁的Matlab/Simulink新技能,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。

        另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。

参考资料

    Mathworks Help -> PID Controller

        版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!

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

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

相关文章

WEB前端11-Vue2基础01(项目构建/目录解析/基础案例)

Vue2基础(01) 1.Vue2项目构建 步骤一:安装前端脚手架 npm install -g vue/cli步骤二:创建项目 vue ui步骤三:运行项目 npm run serve步骤四:修改vue相关的属性 DevServer | webpack //修改端口和添加代理 const { defineCo…

7·19微软蓝屏事件:对全球 IT 基础设施的冲击与反思

719微软蓝屏事件:对全球 IT 基础设施的冲击与反思 一、引言二、事件的详细剖析三、网络安全与系统稳定性的挑战四、构建稳固和安全网络环境的建议五、各领域的有效实践六、总结与展望 719微软蓝屏事件是指当地时间2024年7月19日美国网络安全企业“群集打击”&#x…

Cocos Creator2D游戏开发-(1)初始化设置

初心: 做一款微信或者抖音小游戏,然后发布,对于我来说这是一个新的赛道; 写这些文档的原因,记录一下自己学习过程,下次用的时候方便找 cocos creator版本: 3.8.3 当前小游戏飞机大战教程来源于: 抖音: 禅影 chanying001 源码目录: https://www.kdocs.cn/l/caLr6XCbEfPa 创建一个…

【iOS】KVO底层原理

KVO底层原理 KVO概述KVO常用方法注册监听器详细解释1. 系统不会增加观察者对象的引用计数2. 对象释放后观察者不会自动置空3. 需要自己持有观察者对象的强引用 示例代码Person 类Observer 类main 函数 解释删除监听器监听器对象的监听回掉方法 KVO内部实现_NSSetLongLongValueA…

脑网络布线成本优化——从Caja守恒原则到最小化成本的探索

脑网络布线成本优化——从Caja守恒原则到最小化成本的探索 Caja守恒原则的核心作用 Caja守恒原则,即大脑组织的布线成本最小化原则,是神经科学中的一个重要概念。它指出,大脑在组织结构上倾向于最小化连接神经元以构成环路或网络所涉及的布…

掌握 Python 面向对象编程与模块化导入技巧

文章目录 前言一、封装、继承、多态1. 封装2. 继承3. 多态 二、导入模块1. 导入整个模块2. 导入模块的特定部分3. 导入模块中的所有功能4. 导入整个模块并重命名5. 导入模块的特定部分并重命名 三、函数参数类型1. 位置参数2. 关键字参数3. 默认参数4. 可变参数 总结 前言 在 …

vue3-01创建项目

一、创建一个 Vue 应用 1、前提条件 前提条件: 已安装 18.3 或更高版本的 Node.js,如果当前的node 版本低于18的话,也没关系,可以使用这个命令行,忽略忽略引擎版本的检查 yarn config set ignore-engines true2、创建…

【数学建模】——【python】实现【最短路径】【最小生成树】【复杂网络分析】

目录 1. 最短路径问题 - 绘制城市间旅行最短路径图 题目描述: 要求: 示例数据: python 代码实现 实现思想: 要点: 2. 最小生成树问题 - Kruskal算法绘制MST 题目描述: 要求: 示例数据…

【前端 15】Vue生命周期

Vue生命周期 在Vue.js中,了解组件的生命周期对于开发者来说是至关重要的。Vue的生命周期指的是Vue实例从创建到销毁的一系列过程,每个阶段都对应着特定的生命周期钩子(或称为生命周期方法),允许我们在不同的时间点加入…

【中项】系统集成项目管理工程师-第7章 软硬件系统集成-7.2基础设施集成

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…

C#实现深度优先搜索(Depth-First Search,DFS)算法

深度优先搜索(DFS)是一种图搜索算法,它尽可能深入一个分支,然后回溯并探索其他分支。以下是使用C#实现DFS的代码示例: using System; using System.Collections.Generic;class Graph {private int V; // 顶点的数量pr…

牛客算法题解:数字统计、两个数组的交集、点击消除

目录 BC153 [NOIP2010]数字统计 ▐ 题解 NC313 两个数组的交集 ▐ 题解 AB5 点击消除 ▐ 题解 BC153 [NOIP2010]数字统计 题目描述: 题目链接: [NOIP2010]数字统计_牛客题霸_牛客网 (nowcoder.com) ▐ 题解 题目要求统计出某段数组中一共有多少个…

YOLOv8不同位置引入RepVGG重参数化

一、原理解析: 复杂的卷积网络大都具有如下缺点: 复杂的多分支设计(如ResNet中的残差相加和Inception中的分支连接)使模型难以实现和自定义,降低了推理速度和降低了内存利用率。一些组件(例如Xception和Mo…

嵌入式linux系统中压力测试的方法

在Linux环境下,确保系统各项资源充分且稳定地运行对任何系统管理员来说都至关重要。特别是在生产环境中,理解如何对系统资源进行基准测试和压力测试可以帮助预防未来的问题,同时也能够优化现有系统的性能。 在本文中,我们将探讨如何使用命令行工具来对Linux系统的CPU、内存…

开发环境搭建——Node.js

在启动前端项目的时候我们通常会用到Node.js,下面是对Node.js的下载安装以及配置的讲解 一、Node.js的安装 1.1、通过Node.js官网下载:Node.js — Run JavaScript Everywhere 下载后双击.msi安装文件后一直点击下一步即可 1.2、配置node 1.2.1、查看…

MT2140 供水管线(最小生成树Kruskal)

思路&#xff1a;Kruskal模板题 代码&#xff1a; #include<iostream> #include<stdio.h> #include<string.h> #include<vector> #include<algorithm> using namespace std;#define LL long long intconst int MAXN1e22;struct edge{int u,v,w;…

try-catch-finally 捕获异常不在catch里抛出;循环遍历对象生成任务,捕获异常对象不抛出,不影响其他正常对象生成任务

场景&#xff1a;一个模板绑定多个对象&#xff0c;要对每个对象生成任务。捕获生成任务过程中的异常&#xff0c;但是不抛出&#xff0c;只是用日志记录。这样做目的&#xff1a;循环遍历对象生成任务时&#xff0c;异常对象数据生成任务时发生异常只是导致自己生成任务失败&a…

29 列表元素访问

创建列表之后&#xff0c;可以使用整数作为下标来访问其中的元素&#xff1b;列表还支持使用负整数作为下标。 x list(hello world) print(x) print(x[0]) # 下标为0的元素&#xff0c;第一个元素 print(x[-1]) # 下标为-1的元素&#xff0c;最后一个元素x[5] print(x)

RedHat9 | Ansible 角色

环境版本说明 RedHat9 [Red Hat Enterprise Linux release 9.0]Ansible [core 2.13.3]Python [3.9.10]jinja [3.1.2] 描述角色结构 Playbook可能比较冗长且负载&#xff0c;也可能存在大量的重复代码。而角色&#xff08;roles&#xff09;可以用于层次性结构化的组织playbo…