你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何在matlab的simulink中嵌入C语言进行仿真

[复制链接]
gaosmile 发布时间:2020-11-14 15:13
[导读]前面的话 本文介绍如何在matlab的simulink中嵌入C语言进行多输入多输出的仿真;这样暂时脱离硬件平台的问题,快速验证算法的可行性,从而提高效率,总体来说,simulink挺香的,不过由于不可抗拒因素,在一些高校强行被ban,非常可惜,但是我相信我们最终会拥有比matlab更强大的软件。


前面的话

本文介绍如何在matlab的simulink中嵌入C语言进行多输入多输出的仿真;这样暂时脱离硬件平台的问题,快速验证算法的可行性,从而提高效率,总体来说,simulink挺香的,不过由于不可抗拒因素,在一些高校强行被ban,非常可惜,但是我相信我们最终会拥有比matlab更强大的软件。

目录
  • 1 s-function

  • 2 具体设置


    • 2.1 输入输出

    • 2.2 构建 S-Function


  • 3 源码分析

  • 4 相关测试

  • 5 总结


1 s-function

S-function模块,位于Simulink/User-Defined Functions模块库中,它可以很方便的调用matlab脚本,即.m为后缀的文件,也可以调用c文件,进行多输入多输出(输入多个参数,返回多个参数),即MIMO的系统;

那么就需要LEVEL-2的s-function,因此这里需要使用S-Function Builder来自定义需要输入的参数和输出的参数;

S-Function Builder

2 具体设置

首先拖拽S-Function Builder到仿真文件中,并双击打开,可以看到具体的属性如下图所示;

属性

一般初级的使用,这里有四个地方需要注意,已经在上图中标注出来;

  • S-Function文件名,最终构建成功会生成相应名称的 C文件;
  • 输入输出的设置,根据需求设置 S-Function的入口参数,和返回参数,后面会详细解释;
  • 完成设置之后需要进行构建,生成 C文件;
  • 对相应文件进行修改,最终进行编译;
  • 如果编译成功的话,C程序就已经成功嵌入了,下面可以进行 simulink仿真了;

后面将结合一个例子进行分析;

2.1 输入输出

首先设置文件名,本文设置为sfun_myc

然后在输入和输出选项下有相关端口的属性选项,具体如下;

  • Port name:端口名称,用户自己填写;
  • Dimensions:数据的维度,这里有两种选项,分别是 1-D2-D;如果是 1-D则表示输入 向量2-D则表示输入为矩阵;
  • Rows:输入数据的行数;
  • Columns:输入数据的列数;
  • Complexity:输入的数据是实数还是复数,这里有 realcomplex这两个选项;
2.1.1 添加相应的输入信号

如下图所示;点击图标①,在Input ports的选项下,添加了u0,u1,u2和t,这四个输入信号的添加;

输入信号

2.1.2 添加相应的输出信号

输出具体如下图所示;

输出信号

2.2 构建 S-Function

设置成功之后,具体信息如下图所示;

文件列表

模块图标如下图所示;

从上面两图可以看出,已经设置完成,点击Build生成S-Function对应的C程序,包括;

  • sfun_myc.c;在这文件中也可以进行对输出的修改;
  • sfun_myc_wrapper.c;主要修改这个文件,下面具体再分析;

文件列表如下图所示;

文件列表
3 源码分析

3.1 sfun_myc.c

sfun_myc.c是软件自动生成的文件,源码相对较长,占较大篇幅,暂时不贴,主要分析其中几个主要的函数;
mdlOutputs函数会每过一个采样点(sample time)就被调用一次,在这里以及传入了我们之前定义好的四个参数,以及需要输出的三个参数;并且最终调用sfun_myc_Outputs_wrapper函数来处理输入和输出,具体如下所示;

/* This sample sets the output equal to the input
      y0[0] = u0[0];
For complex signals use: y0[0].re = u0[0].re;
      y0[0].im = u0[0].im;
      y1[0].re = u1[0].re;
      y1[0].im = u1[0].im;
*/

上面的代码可以看到,u0为输入,y0和y1为输出;

sfun_myc_Outputs_wrapper函数中进行修改,就可以得到:

这里用梯形速度曲线进行测试,具体如下;

mex sfun_myc.c sfun_myc_wrapper.c

0 warning 0 errors

如果出现以下提示:错误使用 mex 未找到支持的编译器或 SDK。您可以安装免费提供的 MinGW-w64 C/C++ 编译器;请参阅安装 MinGW-w64 编译器。如需更多选项,请参阅http://www.mathworks.com/support/compilers/R2015b/win64.html。===
则需要先根据提示安装相应的编译器。
4 相关测试仿真的框图如下所示;仿真图写的是一个梯形速度曲线规划仿真算法,,结果符合预期,开心。输出结果5 总结本文总结了在matlab的simulink中调用C语言进行仿真,但是还有很多问题没有考虑在内,需要读者进行举一反三,如果有别的问题也可以进行在文章下方进行评论。


收藏 评论0 发布时间:2020-11-14 15:13

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版