MATLAB/SIMULINK生成嵌入式代码的步骤

昨天参加了Mathworks公司在东南大学举办的关于MATLAB的培训,内容是关于MATLAB/SIMULINK的嵌入式代码生成以及物理建模,在这里把代码生成的步骤及一些相关内容总结一下。


嵌入式代码生成

嵌入式代码生成主要利用的是MATLAB中自带的MATLAB Coder模块,MATLAB Coder可以从MATLABcode产生可读且可移植的C/C++程序,支持多数MATLAB语言和工具箱,可以将产生的程序作为源程序、静态库或动态库集成到项目中,可在MATLAB环境中使用产生的程序来加快MATLAB代码的执行速度。

接下来就以一个非常简单的例子来举例说明嵌入式代码生成的步骤。

1.创建模型

          MATLAB/SIMULINK生成嵌入式代码的步骤_第1张图片

这个模型很简单,输出Out1等两个输入信号Input1和Input2之和再乘以增益k(这里先用2代替),即:

                                                                                      z=(x+y)*k

其中,x和y在其他模块中定义,z和k在本模块中定义(这个影响后面数据管理中各个参数的属性,后面再说,现在不管)。

2.更改设置

上文提到代码生成利用的是MATLAB自带的MATLAB Coder模块,打开SIMULINK中的Configuraton Parameters模块

或者Ctrl+E可行。打开之后,

第一步:更改求解器设置MATLAB/SIMULINK生成嵌入式代码的步骤_第2张图片

因为我们生成的代码是需要下载到单片机中的,而单片机中的计时是按照它的频率严格进行的,因此求解器中的求解步长要与单片机的步长一致,否则就会出错,所以这里将求解器类型改为定步长,离散,步长时间设置为0.01s(即10ms)。

第二步:Code Generation设置

MATLAB/SIMULINK生成嵌入式代码的步骤_第3张图片

将System target file一栏中默认的grt.tlc改为ert.lic,更改方式:可以直接将g改为e,也可以点击后面的Browse,然后选中ert.tlc(Embedded Coder),这一设置的目的在于生成的代码是嵌入式C代码,与grt.tlc相比,代码量小了很多,这一点对于单片机原本就不大的内存空间很有意义,有兴趣的可以自行比较一下。

MATLAB/SIMULINK生成嵌入式代码的步骤_第4张图片

这一步的目的在于可以在代码生成之后自动显示出来,不勾选的话无法直接看到代码。

第三步:代码生成

单击Build Model模块,或者Ctrl+B也行。

然后就可以看到生成的代码了。

MATLAB/SIMULINK生成嵌入式代码的步骤_第5张图片

红色方框圈出的就是我们想要实现的效果,但是可以看到这个公式和我们想要的还有一些距离,对,接下来要做的就是关键部分了。

3.数据管理

数据管理的方式有好几种,SIMULINK中使用的方法是:使用数据对象管理数据

在面向对象的编程模式下,有一个很重要的概念——,类是一种抽象,抽象出具有某一类事物具有共同属性的操作;还有一个概念——包,包可以把相关的类打包到一起,以便于管理;最后,就是对象,对象和类是对应存在的,对象是类的实体,而类是对象的抽象。

SIMULINK在进行数据管理的时候,提供了两个包供我们使用,分别是Simulink Package和Mpt Package,而我们要使用的就是Simulink Package。下面以Simulink Package简单介绍包、类、对象及对象的属性。

MATLAB/SIMULINK生成嵌入式代码的步骤_第6张图片

如上图所示,Simulink包中有Signal和Parameter两个类,Signal有Data Type、Data Storage Class、Dimensions等属性,而Parameter则有Data Type、Data Storage Class等属性。下图所示的即为Signal的属性图。

MATLAB/SIMULINK生成嵌入式代码的步骤_第7张图片

数据管理简单来说就是对上图中的各种属性进行管理,其中,最重要的就是数据类型(Data Type)和存储类(Storage Class)。数据类型很简单,而存储类比较麻烦,是影响数据存储的重要因素。模型中的信号,我们可能定义为全局变量,也可能定义为全局变量;模型中的参数,我们可以定义为常数型变量,也可以定义为宏定义。所有这些,都是通过对存储类进行管理进行实现的。

说了那么多,接下来就看看具体如何进行数据管理。

使用信号对象管理信号

第一步

在信号线上定义信号名。鼠标双击信号线,出现编辑框之后,写上信号线的名字x、y、z;

第二步

在Data Dictionary或Base Workspace里定义同名的信号对象(这里推荐使用Data Dictionary,因为数据字典会使用一个专门的文件进行信号的管理,下同)。在Model Explorer里,选中Data Dictionary或Base Workspace,然后添加三个Simulink Signal,并改名为x、y、z,设置x、y的Storage Class为ImportedExtern,将z 设置为ExportedGlobal;

MATLAB/SIMULINK生成嵌入式代码的步骤_第8张图片MATLAB/SIMULINK生成嵌入式代码的步骤_第9张图片

然后点击左下角出现的方框

MATLAB/SIMULINK生成嵌入式代码的步骤_第10张图片

MATLAB/SIMULINK生成嵌入式代码的步骤_第11张图片

第三步

将信号对象和信号线关联起来。鼠标右键信号线,选择Properties,然后选中Singal name must resolve to Simulink signal,成功设置字之后信号名前面会出现一个蓝色的“E”。

MATLAB/SIMULINK生成嵌入式代码的步骤_第12张图片

MATLAB/SIMULINK生成嵌入式代码的步骤_第13张图片

使用参数对象管理参数

第一步

定义参数。双击增益模块gain,更改参数值为k;

第二步

定义参数对象。在Model Explorer里,选中Data Dictionary或Base Workspace,添加Simulink Parameter,改名为k,定义k的初始值为2,设置Storage Class为const Volatile。

至此,代码生成的步骤就结束了,再按Ctrl+B就可以生成想要得到的代码了。

MATLAB/SIMULINK生成嵌入式代码的步骤_第14张图片

 

你可能感兴趣的:(MATLAB/SIMULINK,单片机)