MATLAB 系统辨识 + PID 自动调参


Matlab R2021b下载安装详细教程

原文链接

下载链接:https://pan.baidu.com/s/19JbPP2hWlZraVbLuNlHpcg 提取码:6666

下载好的压缩包里有秘钥的txt文件,复制粘贴就好

Chapter1 MATLAB 系统辨识 + PID 自动调参

原文链接

1. 导入数据

1.1 从 Excel 中导入数据
如果不是从Excel中导入可以跳过该步骤

导入函数:

[num,txt,raw]=xlsread('xxx\xxx.xlsx');

um返回的是excel中的数据;txt输出的是文本内容;raw输出的是未处理数据;圆括号是文件所在的路径。

比如有这么一个表,我需要用第一列(综合间隙)作为输出,第四列(电流)作为输入

在这里插入图片描述
我们就需要有两个数组变量来存储上面这两列

clc
clear all
close all

% 读入数据
[num,txt,raw]=xlsread('悬浮点数据\悬浮点4数据汇总.xlsx');

%输入
input=num(:,4);

%输出
output=num(:,1);

一定要运行一下,确保工作区里面有这俩,否则后面导入会报错的
在这里插入图片描述

2. 系统辨识

我们在matlab-》app中找到系统辨识工具箱,或者在命令窗口输入:ident

在这里插入图片描述
一般是选择时域数据,如果是频域就选择下面那个
在这里插入图片描述
之后将1.1节中的变量名打进去,采样时间选一下,最后点 import
在这里插入图片描述
我们点 Time plot 验证一下输入和输出的数据是否有问题
在这里插入图片描述
在这里插入图片描述
确认输入和输出的数据无误后,我们就可以开始进行系统辨识了
一般是用传递函数模型进行辨识
在传递函数辨识界面选择零点个数,极点个数,连续 or 离散,点击 estimate 进行辨识

在这里插入图片描述
训练完成后,在右边的界面处可以看到结果,点击 Model output 查看拟合程度
在这里插入图片描述
拟合度越大越好,最好超过80%及以上是最好的,这边只有79.17,差点意思!
在这里插入图片描述
如果我们想看拟合后的传递函数,可以右键点击图形
在这里插入图片描述

3. PID 自动调参

打开 simulink ,根据上一章得出的传递函数进行模型的搭建
在这里插入图片描述
我们现在肯定不知道怎么调参吧?有些人可能会一个个试过去,但是那样的话非常的耗时间,所以这边利用 PID 模块的一个功能
在这里插入图片描述
在这个界面中,我们可以根据需求调整 pid 响应曲线,最后应用一下即可
在这里插入图片描述
最后运行,在scope里面查看一下
在这里插入图片描述

Chapter2 MATLAB系统辨识

原文链接:https://blog.csdn.net/qq_45159887/article/details/125336181
在这里插入图片描述
最终效果:自动调出PID三项对应的参数,控制效果很不错。

目的:通过matlab,辨识出系统的传递函数,找到最理想的PID参数。

优点:1.节省“盲调PID”的时间。2.在辨识出传递函数后,还可以设计专门的控制器,达到经验调参不能做到的效果,逼近完美。

用到的工具:1.matlab的system identification 和PID tunner app2.simulink。

在使用系统辨识工具箱之前,我们先使用simulink模块生成我们需要的仿真模型以及输入输出数据。

在这里插入图片描述

在这里插入图片描述
搭建完整个仿真模型后,点击simulink模块的绿色开始按钮,即可开始进行仿真。
点击图3中灰色齿轮,打开参数配置界面,点击“Solver”选项,将“Type”选项设置为Fixed-step,同时,将Fixed-step size与输入信号周期一致,这里选取0.02。
在这里插入图片描述
我们将输入信号的周期设定为0.02秒,这里也可以设定为其他值,该周期需要与系统辨识工具箱中的周期匹配,否则会导致系统辨识结果错误。
在这里插入图片描述
搭建完简单的仿真模型之后,我们就可以开始使用Matlab系统辨识工具箱了。

在Matlab命令窗口输入“ident”命令,即可打开系统辨识工具箱。或则点击APP中的system identifaication

在这里插入图片描述
Matlab系统辨识工具箱组成说明。
在这里插入图片描述
首先,我们需要导入需要辨识的输入数据,点击“Import data”按钮,工具箱出现下拉选项,这里我们选择“Time domain data”。
在这里插入图片描述
这里的Input与Output输入框中的名称即为上文中通过Simulink模型仿真生成的输入-输出信号对应的工作区中的变量名称。Samping interval即为采样间隔,该值需与上文Simulink仿真模型中的信号仿真步长一致,否则,会导致辨识结果出现偏差。将参数配置完成后,点击“Import”按钮,结束输入信号的导入。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
输入信号预处理选项,其中包括滤波器、数据转换等功能。
在这里插入图片描述
模型辨识设置,这里选择过程模型。
过程模型参数配置,这里选择无零点、无时延无积分环节的一阶系统模型作为待辨识模型,配置完参数后,勾选“Display Progress”按钮,点击“Estimate”按钮开始进行辨识。

在这里插入图片描述
过程模型辨识结果,左边对话框显示了模型辨识精度及相对误差。
双击右边对话框中的辨识模型结果P1,弹出如下对话框,由图可知,Kp = 1,Tp1 = 1,与上文中Simulink仿真模型中的传递函数参数吻合,至此,完成了整个简单的系统辨识工具箱的使用流程。
在这里插入图片描述

Chapter3 【MATLAB】使用系统辨识工具箱(System Identification)建模

原文链接

Chapter4 matlab系统辨识工具箱及其反向验证

原文链接:https://blog.csdn.net/m0_66861238/article/details/130077760

系统辨识工具箱

什么时候使用系统辨识,当系统传递函数不确定(在多大程度上不确定?)时,通过对输入输出数据采集,通过数学迭代找到控制对象的近似模型。在找到近似模型(传递函数)后,就可以使用线性化调参工具对系统控制参数进行整定,进行控制系统设计。

调用命令:systemIdentification

一般过程:

将数据数组从matlab工作区导入程序;

绘制数据;

数据归一化;

估计、验证、 线性模型;

模型导出到工作区

Chapter5 MATLAB系统辨识工具箱学习,详细教程!

原文链接:https://blog.csdn.net/tzlaa/article/details/113575724

进入统辨识工具箱主界面
系统辨识:系统辨识是根据系统的输入输出时间函数来确定描述系统行为的数学模型。现代控制理论中的一个分支。通过辨识建立数学模型的目的是估计表征系统行为的重要参数,建立一个能模仿真实系统行为的模型,用当前可测量的系统的输入和输出预测系统输出的未来演变,以及设计控制器。对系统进行分析的主要问题是根据输入时间函数和系统的特性来确定输出信号。

进入方式及界面介绍:
结合我的例子数据进行讲解

打开方式:
1、 在命令行窗口输入命令:ident

Chapter6 智能车Matlab电机系统辨识和PID仿真自动调参

原文链接:https://blog.csdn.net/sorcererr/article/details/124990179

使用 Matlab 的 System Identification 系统辨识工具箱,辨识出传递函数;用 Simulink 仿真控制系统;PID Tuner 自动整定 PID 参数

步骤:系统辨识传递函数 -> Simulink仿真 -> PID Tuner自动调参

系统辨识传递函数

采集数据

这里选择根据输入和输出数据辨识传递函数。

具体到智能车电机的话,就是在电机开环的情况下,给定电机恒定的占空比,将车放到赛道上,记录电机速度(编码器返回值)从0到接近稳定的曲线。

一定要开环测量数值,就是单纯给PWM即可。

给电机占空比的具体数值,最好使用电机以日常速度跑的时候的占空比。电机在正常运行的区间内,理论上这个关系应该是线性的,用任何占空比最终的效果都会差不多,但考虑到实际情况还是在日常使用的占空比范围区间内选取定值比较好,不过也不用过于纠结这里。

将车放到赛道上跑,是为了模拟实际在赛道上竞速时电机的负载情况。没有足够大小的赛道或是场地的话,找个摩擦相似的地面也可以。

采集数据,一定要以固定的频率发送给上位机。

可以用串口转蓝牙的无线串口,配合匿名上位机完成原始数据的采集。
在这里插入图片描述

导入数据

导入数据到 Matlab

我使用的环境是 Matlab R2020b。

(Matlab 从 R2019a 开始就有了 STM32 的硬件支持包,Simulink 可以直接生成能下载到板子中运行的代码和程序。不过这部分我还没探索完咕咕咕

首先,在顶部选择导入数据,打开匿名上位机保存出来的CSV文件,选中速度的那列数据,并在上方将输出类型更改为数值矩阵,最后点击右侧将电机转速数据导入工作区。

还需要输入数据,也就是给电机的PWM定值。因为是定值所以只需要创建一个与输出数据元素个数相同的列向量即可。以上面图片的数据和情况为例,则是 PWM = linspace(1000,1000,170) `。 注意需要在最后加上 “ ’ ” 将行向量转为列向量。

导入数据到系统辨识工具箱

系统辨识这边我们自然选择的是根据数据建模的方案,而非直接使用机理建模。

之后在 Matlab 的 App 中选择 System Identification

在左侧import data导入数据,导入的数据可以包括时域的也可以包括频域的,这里我们以选择Time domain data导入时间域数据为例。

Workspace Variable里的input为输入数据,填写matlab工作区内的输入数据变量名即PWM;Output即需要填入输出转速变量名

Data Information里的Starting time为起始时间设为0即可;Sample time为采样时间单位是s,根据自己单片机程序里设置的编码器的采样时间输入。注意编码器的采样频率应该和串口接收数据(也就是matlab工作区里的电机转速数据)的频率相同,不过如果丢包率很低也可以不用太在意。

勾选time plot会显示数据,可以检查数据是否正确。

在这里插入图片描述

系统辨识

接下来将左侧的mydata曲线拖动到Working Data中。要对数据进行操作时,都要把数据拖到Working Data中才能生效。

正常需要对电机转速的数据进行预处理。但因为我在单片机串口发送的数据就已经是一阶低通后的数据,所以可以不用再处理这部分。

在Estimate选择Transfer Function Models,然后设置合适的零点极点。电机模型一般零点为1极点为2。

由于我们的转速的编码器采集的离散数据,所以我们需要将默认的连续性数据选项改为Discrete-time (Ts = 0.0x)(由于后面仿真的时候节点选的都是连续型,这里也就先按连续型做系统辨识,为了尽量保证准确性等我开学回实验室再次验证下之后再更新成离散型

I/O Delay是延时时间不用管默认0即可。也可以取消勾选Time delay中的Fixed,设置好Minimum和Maximum后会在区间内自动辨识时间延迟。

Estimate等待一小段时间的计算后即会计算出结果。拟合率一般80%为经验可用的界限。此时右侧的模型窗口出现了辨识的tf1

勾选Model output即可查看辨识结果。将辨识结果与原始实验数据叠加在一起,可以看到模型的辨识效果很好。
在这里插入图片描述
(只是为了演示就只采集了一小部分数据采样频率也不高

把辨识结果tf1拖拽到To Workspace即可导出到工作区,系统辨识完成。这时回到Matlab主窗口即可查看工作区里tf1的信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9MflNFxJ-1653561255706)(https://raw.githubusercontent.com/ittuann/ittuann.github.io/main/_posts/_img/2021-08-30-CarSimulate3.png)]

Simulink 仿真

按图连接节点,名称已经标出
在这里插入图片描述
也可以加入延迟模块模拟电机系统

离散型其实应该使用的是Discrete PID Controller和Discrete Transfer Fcn

双击Transfer Fcn填入刚刚辨识完的传递函数。具体数据双击工作区的tf1直接复制tf1.Denominator和tf1.Numerator即可

PID Tuner 自动调参

双击PID Tuner。
在这里插入图片描述
上方Controller可以选择使用PID还是PI/PD/P/I。

右下方Automated tuning中,选择Transfer Function Based (PID Tuner App) ,之后点击Tune即可开始调参。
在这里插入图片描述
DESIGN中的Domain可以选择使用时间还是频率

在左上方CONTROLLER的Options可以更改设计偏好(Design Focus)。默认为Balanced,可选Reference tracking/Input disturbance rejection

调节上方两个按钮,Response Time (seconds)是上升时间(单位秒),另一个Transient Behavior可以理解成超调量。

实线为当前参数仿真效果,虚线为调整前的参数,方便对比。

Show Parameters为当前参数,以及各项指标。注意PID Tuner计算连续型时的积分项I需要乘上系统的采样时间(单位秒)才是常规位置式PID的参数。PID Tuner调参完成。

另外PID Tuner整定参数的结果验证和Simulate后Scope显示的是一致的。
在这里插入图片描述

其他

其实PID Tuner出来的参数直接就已经是可以用的程度了。另外仿真也可以给出一个大概的参数范围,在这个结果上依据实际情况再修改参数,也会有更好的效果。我们最终在国赛时四个电机的速度环,就是在仿真出的参数的基础上调了一个小时左右就最终确定了的。

参考资料:

PID Controller https://ww2.mathworks.cn/help/simulink/slref/pidcontroller.html

System Identification 官方帮助文档 https://ww2.mathworks.cn/help/ident/index.html

System Identification Toolbox https://ww2.mathworks.cn/products/sysid.html

STM32硬件支持包 https://ww2.mathworks.cn/products/hardware/stmicroelectronics.html
on Toolbox https://ww2.mathworks.cn/products/sysid.html

STM32硬件支持包 https://ww2.mathworks.cn/products/hardware/stmicroelectronics.html

Chapter7 【单片机】温控系统参数辨识及单片机PID控制

原文链接:https://blog.csdn.net/qq_42011369/article/details/129850385

1. 温控系统组成

半导体制冷片正向通电制冷,反向通电制热。系统采用半导体制冷片(帕尔贴)作为执行单元,帕尔贴下端连接水冷系统进行散热,上端为导热铜片,铜片上贴有热敏电阻用于测量系统的温度。
控制系统采用4个MOS管组成的H桥驱动电路,通过PWM进行加热制冷温度控制。

2. matlab辨识系统参数

一般的加热系统的传递函数可以简化为一阶时滞系统,其传递函数如下:

在这里插入图片描述

2.1 采集阶跃响应信号

我们可以用一阶跃信号去激励系统,从而识别出系统的参数。
这里将温控系统的输出设定为100%,记录导热铜板上的温度变化曲线。
在这里插入图片描述

2.2 导入matlab系统辨识模块

将阶跃响应信号保存为 iddata 格式

dataName=["P100","P80","P50","P20"]; %P100代表 PWM信号100%开度
dataAll=readtable('Row.xlsx');
dataAll=table2array(dataAll);
originalTemp=dataAll(1,:);%初始温度
dataAll=dataAll-originalTemp;%将所有信号变为0摄氏度开始
sampTime=0.06;%采样时间

for  i=1:length(dataName)
    tempData=dataAll(:,i);
    tempData=tempData(~isnan(tempData));
    tempTime=(sampTime:sampTime:(length(tempData))*sampTime)';
    tempDataTime=[tempTime,tempData];
    u=ones(length(tempDataTime),1);%阶跃信号
    eval("x_"+dataName(i)+"=iddata(tempData,u,sampTime);");
end

得到下面四组实验数据
在这里插入图片描述
打开matlab中 System Identifiction模块
在这里插入图片描述
导入数据点击【Data object】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

PID控制

理论模型与实际模型比较
在这里插入图片描述

在这里插入图片描述

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值