请选择 进入手机版 | 继续访问电脑版
查看: 166|回复: 3

[单片机资料] 借助MATLAB与SIMULINK仿真嵌入式C算法

[复制链接]

签到天数: 376 天

[LV.9]元老将成

发表于 2018-8-7 21:02:42 | 显示全部楼层 |阅读模式
本帖最后由 小马哥-1650185 于 2018-8-7 22:59 编辑

概述

为在嵌入式开发中碰到的算法验证问题,借助matlab平台可以更方便的调试。如控制算法,可以先验证算法编写的正确性,防止盲目调参的无用功。借助的是SIMULINK 与 S-Function Builder

方法

首先保证 matlab MEX部分能正常工作,可以参考 mex -setup相关信息。主要是让mex找到正确的编译器,如:已安装了gcc套件,则只需设置下环境变量: setenv(‘MW_MINGW64_LOC’,’F:\MinGW64’);
即可
S-Function 是一个将c c++ 等编译为simulink模块的工具,吧待检测的代码构建为simulink 标准模块便可借助 simulink 强大功能仿真了。S-Function 有特定的格式,可以手写,这里用更简单的S-Function Builder做。
下面以一个iir滤波器算法为例
1.待验证的iir实现如下,保存为iir_souce.c



  1. /**
  2. * @brief 离散 IIR 滤波器算法,被s function builder
  3. * 使用并建立iir.c(与builder设置的函数名相同)
  4. *
  5. * @param u 输入
  6. * @param xD 离散变量寄存器, sfuncton builder 提供
  7. * @return double 输出
  8. */
  9. double iir(double u, double* xD) {
  10.     double y;
  11.     // IIR 的查分方程: y(n)=0.2x(n)+0.3x(n-1)+0.5x(n-2)
  12.     //定义 xD[0] x(n-1) xD[1] x(n-2)
  13.     y = 0.2 * u + 0.3 * xD[0] + 0.5 * xD[1];
  14.     xD[1] = xD[0];
  15.     xD[0] = y;
  16.     return y;
  17. }
复制代码




2.开启新的simulink,导入S-Function Builder 模块,双击打开编辑
2.1 命名
要求与刚才c文件不同命,不然会覆盖

4.1.jpg
2.2 离散状态设置
这是s function 特殊性,就是离散化的算法中的x[n-1]这样的历史值需要构建为离散状态。如上图设置两个,给x[n-1] x[n-2]用
2.3 函数输入输出设置
iir只需要单输入单输出 宽度都为1 double(默认的) 格式
4.2.jpg
2.4 说明要编译的文件
左侧 iir_souce.c 指出要编译的文件 右侧extern double iir(double u, double* xD); 提示一会儿要在后面用到里面的这个函数
4.3.jpg
2.5 这一步指出实现
y0[0]=iir(u0[0],xD);
u0[0] 是输信号,y0[0]为输出信号,xD是刚才定义的离散状态数组
4.4.jpg
2.6 编译
如图,默认设置就好,还可以产生TLC用于matlab builder 自动生成代码
4.5.jpg
2.7测试
构建如下系统:
4.6.jpg
4.7.jpg

至此,成功将目标代码构建到sinmulink中仿真

签到天数: 673 天

[LV.9]元老将成

发表于 2018-8-8 10:26:15 | 显示全部楼层
不错的资料
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部