当前位置:首页 » 《随便一记》 » 正文

Simulink建模:PID控制模型

0 人参与  2023年04月11日 09:45  分类 : 《随便一记》  评论

点击全文阅读


本文研究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

运行脚本后,会在工作空间里生成对应的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功能等。

>>返回个人博客总目录


点击全文阅读


本文链接:http://zhangshiyu.com/post/59243.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1