simulink学习笔记:基于模型的控制和pid整定

news2024/11/26 2:37:54

在学习的时候发现了一个很好的学习simulink的网站,打算来练练手:Introduction: Simulink Control,过程中会涉及到搭建动力学模型和设计pid控制器(整定pid参数)。该模型描述的是火车的两节车厢,对前一节车厢施力,控制其速度按照跟随指定的方波。我在我的资源里也把我建好的所有模型放上去,大家可以直接下载。链接是

simulink基于模型的控制和pid整定配套模型文件

1. 搭建动力学模型

在这里插入图片描述

根据牛顿第二定律,我们画出受力图:

在这里插入图片描述
列出动力学方程:
Σ F 1 = F − k ( x 1 − x 2 ) − μ M 1 g x ˙ 1 = M 1 x ¨ 1 Σ F 2 = k ( x 1 − x 2 ) − μ M 2 g x ˙ 2 = M 2 x ¨ 2 \begin{aligned} \Sigma F_{1}&=F-k\left(x_{1}-x_{2}\right)-\mu M_{1} g \dot{x}_{1}=M_{1} \ddot{x}_{1} \\ \Sigma F_{2}&=k\left(x_{1}-x_{2}\right)-\mu M_{2} g \dot{x}_{2}=M_{2} \ddot{x}_{2} \end{aligned} ΣF1ΣF2=Fk(x1x2)μM1gx˙1=M1x¨1=k(x1x2)μM2gx˙2=M2x¨2

于是我们可以搭建如下图所示的模型,简单说一下搭建的思路,从动力学入手我们可以从加速度入手,将加速度单独拿到一边,另一边是合力除上质量,通过积分器可以把加速度依次变成速度和位移,而合力又昆虫用上位移和速度,这样就写成了一个闭环(使用积分器比微分器好,微分器容易出现不连续)。使用到的模块:Sum、Add、Gain、Integrator、Scope、Signal Gernerator

链接给出了具体的搭建步骤,如果感兴趣可以去看一下:Introduction: Simulink Modeling。
在这里插入图片描述
关于参数的设置要先在工作区设置好。新建一个parameter.m文件和simulink文件在一起,写入参数:

parameter.m

clc
clear
M1 = 1;
M2 = 0.5;
k  = 1;
F  = 1;
mu = 0.02;
g  = 9.8;

运行后加载后工作区,上面的模型才能运行!因为在诸如Gain的模块里写的是1/M1,M1是个变量,从工作区里得到。
在这里插入图片描述

设置仿真的时间为1000,运行我们看到速度的幅度现在基本是±3.5,类似一个方波。

在这里插入图片描述
但是我们现在不能让其是我们想要的速度,于是我们接下来就就加入pid控制实现按我们规定的速度运行。

2. PID控制器的实现

2.1 开环效果

这一部分可以接上一步的train_model.slx操作,我写好的模型在train_model_pid1.slx中。

我们然后使用Out1和一个In1模块替换所有的Scope,如下图所示。我们还要给三个Out1分别命名为x1_dot、x1和x2,以及In1命名为F。

在这里插入图片描述

然后我们右键生成子系统

在这里插入图片描述
如图我们添加pid控制器,并且加入波形发生器signal builder。

在这里插入图片描述

对于pid我们的初始的设置为:kp=1,ki=0,kd=0。

在这里插入图片描述我们设置波形为如图所示,时间长度为300s,在10秒从0阶跃到1,在150秒从1阶跃回0.在这里插入图片描述

这里我们设置的仿真时间和信号发生器的时间是一样的,也是300s(后面的闭环效果也是一样的)。我们可以运行一下上面的模型看一下效果,和前面的动力学模型的效果是一样的。因为现在还没有加反馈。

在这里插入图片描述

2.1.1 提取开环模型

要注意的是,上面我们的模型框图并没有添加闭环的反馈。我们在PID控制器后面的信号线右键选择Linear Analysis Points,接着选择Open loop Input,然后会显示一个向下的箭头,

在这里插入图片描述

同样的我们可以在子模块的x1_dot输出信号线右键选择Linear Analysis Points,接着选择Open loop Output,然后会显示一个向上的箭头。
在这里插入图片描述
在这里插入图片描述
我们用模型线性化器提取模型。

在这里插入图片描述
点击Step我们可以看到输入阶跃信号的输出。这个输出和我们在simulink的输出是一样的。
在这里插入图片描述
在这里插入图片描述
我们可以调整一下图的坐标(后面的图都可以同样的操作),右键选择Properties
在这里插入图片描述
改这两个参数我们可以看到

在这里插入图片描述
我们可以看到生成了线性化的模型linsys1,在Linear Analysis Workspace里面,
在这里插入图片描述
根据生成的模型我们可以计算反馈系统下的零极点。在命令行窗口输入:

sys_cl = feedback(linsys1,1);
p = pole(sys_cl)
z = zero(sys_cl)

在这里插入图片描述
这等价于下面的模型框图:

在这里插入图片描述

对上述情况的检查表明,原点存在零极点取消。此外,其余极点具有负数 实部和两个“最慢”的极点很复杂。这表明当前形式的闭环系统是稳定的 并且占主导地位的极点阻尼不足。我们接下来根据上面的分析运行看一下闭环的情况。

2.2 闭环效果

我们运行上面的模型,现在我们取消之前添加的Open loop InputOpen loop Output,还是右键再点一下Linear Analysis Points中的Open loop InputOpen loop Output就可以取消了。

在这里插入图片描述

我们还是运行一下闭环添加了反馈的效果。
在这里插入图片描述

2.2.1 闭环pid参数整定

选择控制系统设计器

在这里插入图片描述
在这里插入图片描述

点击Add Blocks。
在这里插入图片描述

然后不要直接在Edit Architecture界面按OK,要回到模型,我们设置一下输入和输出(我的理解是一个参考输入和一个实际输出),我们在信号发生器后面的信号线右键选择Linear Analysis Points,接着选择Input Perturbation,然后会显示一个向下的加号箭头。

在这里插入图片描述

同样的我们可以在子模块的x1_dot输出信号线右键选择Linear Analysis Points,接着选择Output Measurement,然后会显示一个向上的箭头。
在这里插入图片描述

在这里插入图片描述
然后返回前面的Edit Architecture界面按OK,这步和前面的顺序不能反了,否则不能出现下面的Controllers And Fixed Blocks以及Responses。(可能只出现一个,我之前就是搞错了顺序只出现了Controllers And Fixed Blocks)

在这里插入图片描述
在这里插入图片描述

好了我们现在可以看一下根轨迹。如图选择Turning Method,选择Root Locus Editor
在这里插入图片描述
点击plot
在这里插入图片描述
我们就出现了根轨迹。我们可以用鼠标“拖拽”标记闭环极点的粉红色框以图形方式完成 位置并将它们拖向开环极位置(用 x 标记)【这个就很神奇,动态调节】,可以自己尝试一下哈。

在这里插入图片描述

然后我们根据现在的这个系统绘制一下输出的响应,点击New Plot,然后点击New Step

在这里插入图片描述
选择New input-output transfer response

在这里插入图片描述
我们定义输入信号,在Specify input signal下点击Add signal to list
在这里插入图片描述

然后选择Select signal from model

在这里插入图片描述
点击回到模型点击信号发生器后面的那根信号线。
在这里插入图片描述
信号就出现了Select signals对话框里,再点击Add signal
在这里插入图片描述

我们定义输出信号

在这里插入图片描述
然后选择Select signal from model
在这里插入图片描述
点击回到模型点击子系统后面的那根x1_dot的信号线。

在这里插入图片描述

信号就出现了Select signals对话框里,再点击Add signal
在这里插入图片描述
点击Plot,我们绘制响应曲线。

在这里插入图片描述

结果如图所示:
在这里插入图片描述
我们还是改变一下图的Properties,在图像上右键选Properties,改一下图的坐标轴的范围。

在这里插入图片描述
这和我们在simulink里仿真的模型的结果是一样的,我们看到存在稳态误差,积分器可以很好地减少稳态误差。

我们首先打开看一下我们的pid的传递函数,在Controllers And Fixed Blocks选择Open Selection

在这里插入图片描述
我们看到pid的传递函数是1,和我们的初始的设置是一样的。
在这里插入图片描述

我们回到根轨迹图右键选中Add Porle or Zero,然后我们选中Integrator在这里插入图片描述

现在只有一个积分器,肯定是不稳定的,我们还要有个零点来组成PI控制器。

在这里插入图片描述

我们回到根轨迹图右键选中Add Porle or Zero,然后我们选中Real Zero。现在就是PI控制器了

在这里插入图片描述
我们可以很方便地看PID三个参数的变化怎么影响输入输出曲线的(不同于直接的在PID控制器整定),我们选中Parameter,在下面有滑动条我们可以很方便地拖动调整最后的输出。在拖动的过程中输出曲线也会相应变化!

在这里插入图片描述
看看下面的gif。还是很方便的。
请添加图片描述
最后我们设置零点的位置是-0.15,如图所示最终的pid效果,传递函数为 0.5 × 1 + 6.7 s s 0.5\times \frac{1+6.7s}{s} 0.5×s1+6.7s

在这里插入图片描述
我们将调整好的pid参数更新到simulink模型里,点击菜单栏的Update Blocks

在这里插入图片描述

重新点击我们模型框图里的pid控制器,我们看到pid的参数确实改了。

在这里插入图片描述

我们看到最终的效果就好很多了。速度很平稳地到了1,也没有发生超调。

在这里插入图片描述

这里在上面网站的基础上拓展一点:在pid控制器模块里也有整定参数的按钮:调节
在这里插入图片描述
滑动上面的滚动条也可以查看曲线,但是这就是pid控制器了,kd也会被考虑进来。

在这里插入图片描述
我们整定好也可以点击如图的Update Blocks

在这里插入图片描述
于是我们的pid参数又变了

在这里插入图片描述
运行一下再看下效果,响应速度变快了,但是就有一些跳变了,但是依旧没有超调:

在这里插入图片描述

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

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

相关文章

迪瑞克斯拉算法 — 优化

在上一篇迪瑞克斯拉算法中将功能实现了出来,完成了图集中从源点出发获取所有可达的点的最短距离的收集。 但在代码中getMinDistanceAndUnSelectNode()方法的实现并不简洁,每次获取minNode时,都需要遍历整个Map,时间复杂度太高。这…

《Zookeeper》源码分析(九)之选举通信网络

在上一篇文章中讲到QuorumCnxManager,它负责zookeeper服务器在选举期间最底层的网络通信,整个网络涉及到的类如下: 整个网络建立的过程如下: 选举前创建好QuorumCnxManager实例,并在QuorumCnxManager构造函数中创建好…

scope组件穿透

今天我们以单选框为例来探究一下样式的穿透问题 1.代码 <template><div class""><el-radio v-model"radio" label"1">备选项</el-radio><el-radio v-model"radio" label"2">备选项</el-r…

glOrtho与gluOrtho2D 的作用

gluOrtho2D 函数设置二维正交裁剪区域。 相当于调用 zNear -1 且 zFar 1 的 glOrtho 。 glOrtho定义二维正交投影矩阵&#xff0c;这个矩阵会把视图&#xff08;摄像机&#xff09;空间的坐标转换到一个裁剪空间&#xff0c;一言以蔽之&#xff1a;glOrtho定义了裁剪空间&…

Netty:DelimiterBasedFrameDecoder分析

说明 io.netty.handler.codec.DelimiterBasedFrameDecoder是ByteToMessageDecoder的一个实现类&#xff0c;用一个或多个分割符拆分接收到的 ByteBuf。这个主要用于解析分隔符在帧的末尾的情况。注意&#xff0c;如果分割符在帧的开头&#xff0c;那么解析出来的帧的长度是0&a…

从一到无穷大 #10 讨论 Apache IoTDB 大综述中看到的优劣势

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言问题定义新技术数据模型schemalessTsfile设计双MemTable高级可扩展查询其他 IotD…

如何实现浅拷贝和深拷贝

一、浅拷贝的实现方法 1.Object.assign方法 let obj1{name:"aaa",}let obj2{age:20}let obj3Object.assign(obj1,obj2)// obj3.age30console.log(obj1);console.log(obj3);console.log(obj1obj3);console.log(obj1obj3); 结果为&#xff1a; 2.直接赋值 let obj1{n…

sql中union all、union、intersect、minus的区别图解,测试

相关文章 sql 的 join、left join、full join的区别图解总结&#xff0c;测试&#xff0c;注意事项 1. 结论示意图 对于intersect、minus&#xff0c;oracle支持&#xff0c;mysql不支持&#xff0c;可以变通&#xff08;in或exists&#xff09;实现 2.测试 2.1.创建表和数…

将Map存到数据库中,并且支持数据类型原样取回

1.数据库设计 1.1 表设计 create table variables (id bigint not null comment 主键,business_key varchar(128) null comment 业务key,data_key varchar(128) null comment Map中的key,data_value varchar(…

35岁职业危机?不存在!体能断崖?不担心

概述 90年&#xff0c;硕士毕业&#xff0c;干了快8年的Java开发工作。现年33岁&#xff0c;再过2年就要35岁。 工作这些年&#xff0c;断断续续也看过不少35岁找不到工作&#xff0c;转行&#xff0c;降薪入职的传闻、案例。 35岁&#xff0c;甚至30岁之后&#xff0c;体能…

【Linux操作系统】文件描述符fd

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ Linux之路       &#x1f6f0;️社区 :✈️ 进步学堂       &#x1…

easyx图形库基础:1.基本概念的介绍+图形的绘制。

基本概念的介绍图形的绘制 一.基本概念的介绍。1.为什么要使用easyx图形库2.安装easyx图形库。3.语法相关 二.图形绘制1.窗体创建和坐标的概念。1.基本窗体的创建。2.坐标概念3.改变逻辑坐标。 2.设置图形颜色1.设置描边颜色和描边样式。2.设置图形填充颜色和填充样式3.绘制图形…

【第二阶段】kotlin的函数类型作为返回类型

fun main() {//调用,返回的是一个匿名类型&#xff0c;所以info就是一个匿名函数val infoshow("",0)//info接受的返回值为匿名类型&#xff0c;此时info就是一个匿名函数println(info("kotlin",20)) }//返回类型为一个匿名函数的返回类型fun show(name:Str…

编程工具合集

须知&#xff1a; 本博文只是为了记录程序员在编程中所用到的编程工具以及效率软件&#xff0c;如有侵权&#xff0c;请告知&#xff01; VSCode 英文官网&#xff1a;https://code.visualstudio.com/ 中文官网&#xff1a;http://vscode.p2hp.com/ win下载链接&#xff1a;VS…

ModaHub魔搭社区:AI时代连接硬件和上层应用的中间层基础设施。

从类比的角度理解AI Infra:AI时代连接硬件和上层应用的中间层基础设施。传统本地部署时代,三大基础软件(数据库、操作系统、中间件)实现控制硬件交互、存储管理数据、网络通信调度等共性功能,抽象并隔绝底层硬件系统的复杂性,让上层应用开发者能够专注于业务逻辑和应用功…

Kotlin入门:变量和函数——02

目录 一、Kotlin 基本数据类型 ​编辑 二、变量 val 关键字&#xff1a; var 关键字: 类型推断: 可空类型: 三、函数 基本函数语法&#xff1a; 单表达式函数&#xff1a; 默认参数值&#xff1a; 命名参数&#xff1a; 一、Kotlin 基本数据类型 Kotlin 的基本数…

CCLINK IE 转MODBUS-RTU网关modbusrtu与485区别

远创智控YC-CCLKIE-RTU。这款产品的主要功能是将各种MODBUS-RTU、RS485、RS232设备接入到CCLINK IE FIELD BASIC网络中。 那么&#xff0c;这款通讯网关又有哪些特点呢&#xff1f;首先&#xff0c;它能够连接到CCLINK IE FIELD BASIC总线中作为从站使用&#xff0c;同时也能连…

sqlyog下载和卸载的最新详细过程,超多图快速安装或者卸载

目录 1.SQLyog的介绍2.sqlyog的下载和安装3.sqlyog的卸载 ✨ 原创不易&#xff0c;还希望各位大佬支持一下&#xff01; &#x1f44d; 点赞&#xff0c;你的认可是我创作的动力&#xff01; ⭐️ 收藏&#xff0c;你的青睐是我努力的方向&#xff01; ✏️ 评论&#xff0c…

7.5.tensorRT高级(2)-RAII接口模式下的生产者消费者多batch实现

目录 前言1. RAII接口模式封装生产者消费者2. 问答环节总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-RAI…

Netty核心源码解析(一)

Netty是什么&#xff1f; Netty是Jboss提供的一个Java 开源框架&#xff0c;主要针对TCP协议的高并发场景Netty本质是对Java NIO做了封装的网络通信框架&#xff0c;主要作用是Java NIO基本接口的封装&#xff0c;提供了网络通信中线程同步&#xff0c;编解码&#xff0c;粘包拆…