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

在学习的时候发现了一个很好的学习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.rhkb.cn/news/95492.html

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

相关文章

Android上架商城 隐私政策需要网页 没有怎么办

Android开发的项目上架商城的时候会需要你填写url,但其实并不需要真的去发布一个网站 使用腾讯文档新建文档 填写隐私政策 点击生成网页 再将网址填写即可 下面我找到的一个隐私政策文档供大家参考 将XXXX应用一键替换为自己的应用 将XXXXXX公司一键替换为公司 …

【制作npm包4】api-extractor 学习

制作npm包目录 本文是系列文章, 作者一个橙子pro,本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…

【C++】位图和布隆过滤器

位图和布隆过滤器 前言正式开始位图位图讲解模拟实现位图几道关于位图的题目 布隆过滤器概念实例布隆过滤器模拟实现误判率测试几道题 前言 本来本篇是和前面的两篇连着的,但是没写到一块,位图和布隆过滤器都是基于哈希的思想的,如果对于哈希…

用pytorch实现google net

GoogleNet(也称为Inception v1)是由Google在2014年提出的一个深度卷积神经网络架构。它在ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 2014比赛中取得了优秀的成绩,并引起了广泛的关注。 GoogleNet的设计目标是构建一个更…

【24择校指南】齐鲁工业大学计算机考研考情分析

齐鲁工业大学 考研难度(☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1140字,预计阅读:3分钟。 2023考情概况 齐鲁工…

解决无法访问 Github 问题

GitHub作为程序员访问最频繁的网站,程序员们经常需要访问 Github找开源项目、学习新框架、管理自己的个人开源项目等等。 github加速器 因为GitHub属于国外的网站,直接访问的话,速度非常慢,甚至访问不了, 今天给大家…

RocketMQ(模式详解,安装)及控制台安装

下载 环境 64位操作系统,推荐 Linux/Unix/macOS 64位 JDK 1.8下载地址 https://rocketmq.apache.org/zh/download/ RocketMQ 的安装包分为两种,二进制包和源码包。 二进制包是已经编译完成后可以直接运行的,源码包是需要编译后运行的。 单…

如何快速在vscode中实现不同python文件的对比查看

总体而言:两种方式。一种是直接点击vscode右上角的图标(见下图)。 另一种方式就是使用快捷键啦“**Ctrl**”,用的时候选中想要对比的python文件,然后快捷键就可以达到下图效果了: 建议大家直接使用第二种…

ai之美:探索写真照片软件的创造力

小青:嘿,小华,你知道最近ai艺术写真非常流行吗? 小华:真的吗?我还不知道呢。告诉我更多细节吧! 小青:好的,ai艺术写真是指使用人工智能技术将照片转化为艺术作品的过程…

Spring-4-掌握Spring事务传播机制

今日目标 能够掌握Spring事务配置 Spring事务管理 1 Spring事务简介【重点】 1.1 Spring事务作用 事务作用:在数据层保障一系列的数据库操作同成功同失败 Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败 1.2 案例分析Spring…

算法通关村第八关——轻松搞定翻转二叉树

二叉树有很多经典算法题,今天我们就来看一下二叉树里的翻转问题。 力扣226,给了一棵二叉树,要将二叉树整体翻转。 分析:观察图中翻转前后的二叉树,我们不难发现,翻转过程中,只需要把每一个节点的左右子节点…

Qt使用qml(QtLocation)显示地图

一、qt版本和QtLocation模块版本确认 如果qt版本过低的话是没有QtLocation模块的,我的版本如下 构建工具版本如下 二、qml代码编写 1、工程中添加模块 首先在工程中添加模块quickwidgets positioning location 2、添加资源文件 3、在资源文件中添加qml文件 …

Ribbon 源码分析

Ribbon 源码分析 Ribbon Debug 分析 断点 LoadBalancerInterceptor LoadBalancerInterceptor 实现了 ClientHttpRequestInterceptor 接口,重写了其中的 intercept 方法,用来拦截请求; 获取原始的 uri 和 服务名,调用 LoadBalanc…

matlab中exp和expm的区别

exp()为数组 X 中的每个元素返回指数 e x e^{x} ex expm()计算 X 的矩阵指数。 两个函数传入矩阵后计算的结果是不同的,千万不能混淆。之前曾经想当然得把exp里传入矩阵当矩阵指数使用,也未验证正确性,实不应该。

【2023新教程】树莓派4B开机启动-树莓派第一次启动-树莓派不使用显示器启动-树莓派从购买到启动一步一步完全版!

背景 闲来无事,在咸鱼上买了一个树莓派4B。买来配件都十分齐全,于是就想着启动来测试一下。下面是树莓派无显示器第一次启动的全过程,包含安装系统。 网上的教程大多需要额外使用显示器、鼠标、键盘之类的外设。然而,树莓派本身就…

算法通关村——位运算

1. 常见的位运算 1.1 与 & &:两个数对应的位都是1,那么结果才是1 1 & 1 1 1 & 0 0; 0 & 0 0; 1.2 或 | |: 只要两个数对应的位有一个1,结果就是1 1 | 1 1; 1 | 0 1; 0 | 0 0; 1.3 异或^ ^: 只有两个数的位都…

解决访问Github出现的Couldn‘t connect to server错误

文章目录 前言原因分析以及解决办法原因分析解决办法 参考 前言 在Github上面克隆代码仓库出现Failed to connect to 127.0.0.1 port 1080 after 2063 ms: Couldnt connect to server、Failed to connect to github.com port 443 after 21083 ms: Couldnt connect to server等…

一百六十、Kettle——Linux上安装的Kettle9.2.0连接Hive3.1.2

一、目标 Kettle9.2.0在Linux上安装好后,需要与Hive3.1.2数据库建立连接 之前已经在本地上用kettle9.2.0连上Hive3.1.2 二、各工具版本 (一)kettle9.2.0 kettle9.2.0安装包网盘链接 链接:https://pan.baidu.com/s/15Zq9w…

Django框架 靓号管理(增删改查)

Django框架 靓号管理(增删改查) 新建一个项目 backend 使用pycharm创建app startapp app项目目录 C:\code\backend ├── app | ├── admin.py | ├── apps.py | ├── migrations | ├── models.py | ├── tests.py | ├── views.…

js实现按创建时间戳1609459200000 开始往后开始显示运行时长-demo

运行时长 00日 00时 17分 59秒 代码 function calculateRuntime(timestamp) {const startTime Date.now(); // 获取当前时间戳//const runtimeElement document.getElementById(runtime); // 获取显示运行时长的元素function updateRuntime() {const currentTimestamp Date…