首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Simulink建模:PID控制模型

  • 23-09-22 01:03
  • 2421
  • 6071
blog.csdn.net

本文研究PID控制的Simulink模型实现及其代码生成。

文章目录

  • 1 PID控制
  • 2 应用场景
  • 3 Simulink建模
    • 3.1 对公式的理解
    • 3.2 建模过程
    • 3.3 模型配置
  • 4 模型更新及代码生成
    • 4.1 模型更新
    • 4.2 代码生成
  • 5 总结

1 PID控制

PID控制是一个非常经典的控制方法,离散化的位置式PID控制的公式如下:
在这里插入图片描述
其中,e(k)为k时刻的偏差值,Kp,Ki,Kd分别为比例、积分、微分系数。PID控制的示意图如下:
在这里插入图片描述

2 应用场景

通过一个汽车加速的场景可以很好地理解PID控制的原理。

首先,设想自己是一名驾驶员,刚刚经过收费站上了高速公路。现在,高速公路上是一个一望无际的长直道,并且周围都没有车。这时驾驶员的想法是,尽快将车加速到100km/h的时速,并保持这个速度在路上行驶。

此时,驾驶员就是控制系统中的传感器、控制器和执行器。其中眼睛就是传感器,可以获取仪表盘上的车速;大脑是一个控制器,可以计算出油门踏板或刹车踏板的行程;右脚是执行器,可以根据大脑发来的行程指令,踩下踏板。那么PID控制的示意图就会变成下图:

在这里插入图片描述
驾驶员看到当前的车速,会和自己内心期望的100km/h的车速做比较,得出error的偏差值。PID在其中的含义就是:

  • P项的含义就是,偏差越大,就需要踩踏板踩得越深,才能尽快减小偏差值。
  • I项的含义就是考虑整个过程中的偏差的累计值,可以理解为,经历的越长的时间还没到达期望车速,就会在P项的基础上再踩得深一些。
  • D项的含义是考虑当前时刻偏差的变化率,可以理解为如果偏差在减小,那么de/dt就是个负值,其绝对值表示减小的速率,这个速率越大,D项越大,抵消的P项越多,类似于一个阻力的效果,防止变化过快。

3 Simulink建模

本文重点研究通过Simulink实现位置式PID控制模型。

3.1 对公式的理解

为了较好的进行建模,博主会结合自己做汽车电控开发的经验对公式进行理解,这些理解会指导后面的建模。

  • 输入值、输出值和参数值都应该是浮点数,建模时统一定为single类型;
  • 比例项需要用Kp乘以e(k),积分项需要累加零时刻到当前时刻的所有e(k)再乘以Ki,微分项需要用当前e(k)减去上一个周期的e(k-1)再乘以Kd;
  • 比例、积分、微分项相加之后,要对大小进行限值,以防出现不合理的输出数值;
  • 比例、积分、微分的系数和上下限应该是一个可标定的数,因此在Simulink中应该做成Parameter参数。

3.2 建模过程

1)首先在Simulink中建立一个子系统,将其命名为PIDControl,并定义好输入输出名称;
在这里插入图片描述
2)比例项的模型只要把输入的Err和比例系数相乘即可;
在这里插入图片描述
3)积分项除了做乘法,还需要把历史的每个Err的数值都累加起来,这里可以用一个Unit Delay模块;
在这里插入图片描述
4)微分项部分需要求两次Err之差,再和Kd相乘;
在这里插入图片描述
5)最后,在三项之和的后面加上Saturation模块,根据在其中加上上下限的标定参数名;
在这里插入图片描述
在这里插入图片描述
至此,模型里面的模块就都已经搭建完成。

3.3 模型配置

模块和信号线都搭建好了以后,需要对他们进行一些必要的配置。

1)将Inport,Outport和每个运算模块的Output DataType都配置成single,这样保证了整个数据流都是浮点型的;
在这里插入图片描述
2)在Matlab工作空间中创建模型中所用参数的属性,因为配置的太多,所以这里博主直接用一个Matlab脚本创建;

%% 生成PID模块所需要的参数
%% 清空工作空间
clear;
clc;
%% Kp参数
Kp = Simulink.Parameter;
Kp.Value = 0.2;
Kp.DataType = 'single';
Kp.Description = 'PID控制模块的Kp参数;';
Kp.CoderInfo.StorageClass = 'ExportedGlobal';
%% Ki参数
Ki = Simulink.Parameter;
Ki.Value = 0.02;
Ki.DataType = 'single';
Ki.Description = 'PID控制模块的Ki参数;';
Ki.CoderInfo.StorageClass = 'ExportedGlobal';
%% Kd参数
Kd = Simulink.Parameter;
Kd.Value = 0.02;
Kd.DataType = 'single';
Kd.Description = 'PID控制模块的Kd参数;';
Kd.CoderInfo.StorageClass = 'ExportedGlobal';
%% Up_Lim上限参数
Up_Lim = Simulink.Parameter;
Up_Lim.Value = 1000;
Up_Lim.DataType = 'single';
Up_Lim.Description = 'PID控制模块的输出上限参数;';
Up_Lim.CoderInfo.StorageClass = 'ExportedGlobal';
%% Low_Lim下限参数
Low_Lim = Simulink.Parameter;
Low_Lim.Value = 200;
Low_Lim.DataType = 'single';
Low_Lim.Description = 'PID控制模块的输出下限参数;';
Low_Lim.CoderInfo.StorageClass = 'ExportedGlobal';
%% End
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

运行脚本后,会在工作空间里生成对应的Parameter参数。其中除了数值和描述信息以外,数据类型和Storage Class都配置成了相同的。
在这里插入图片描述
注:这里的数值都是博主随便定的,只是为了演示这个过程。参数的定义需要根据实际开发中的需求和场景来定义,甚至还需要在试车测试的时候不断标定和调试后确认参数。

3)将积分项和微分项中用到的UnitDelay模块分别配置一个名字,并定义代码生成的StorageClass;将积分项的名字定义为Err_Sum,代表Error的累加,将微分项的名字定义为Err_Last,代表上一次的Error值;
在这里插入图片描述
在这里插入图片描述
注:这里的定义仅仅是为了代码生成的可读性更强,不会影响到Unit Delay的模型功能和代码功能,所以也可以不做这一步名称的定义。另外,无论是否定义名称,这里的Unit Delay模块都会消耗一个全局变量的RAM资源。

4 模型更新及代码生成

Simulink模型建立好后,可以分两步走。首先是Ctrl + D看看模型有没有编译问题,再Ctrl + B看看有没有生成代码问题。

4.1 模型更新

1)在子系统外面加上Inport和Outport模块,使之成为完整的模型;
在这里插入图片描述
2)Ctrl + D更新模型,并显示一下数据类型,可以看到整个数据流的类型都是single;
在这里插入图片描述

4.2 代码生成

1)在Simulink中配置一下代码生成,具体方法可参照博主以前的博客《Simulink代码生成: Embedded Coder配置》。

2)以上配置好后,可以Ctrl + B生成代码;
在这里插入图片描述
在这里插入图片描述
在Step函数中,首先会通过Input和Ki计算Err_Sum。然后通过PID公式计算输出数值,将输出数值限值在上下限之内,最后给Err_Last赋值本次的Err,以便下次计算微分项的时候用到。

5 总结

本文研究了位置式PID控制的建模和代码生成,增量式PID控制也可以按照类似的思路来做。在建模的过程中也可以加入一些其他的功能,例如再添加信号使能或者复位PID功能等。

>>返回个人博客总目录

注:本文转载自blog.csdn.net的chhttty的文章"https://blog.csdn.net/u013288925/article/details/122139081"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top