Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

S-Function 允许使用自定义C/C++函数作为传递函数,具有可移植性。也可以同样利用MATLAB函数进行相同的运算,看开发者熟悉程度而定。

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

项目流程

  1. 由系统串口接收数据包。
  2. 通过S-Function自定义函数解析数据包,得到数据集合。
  3. 数据集合总线输出,分为各部分数据进行可视化显示。

串口接收

首先需要通过MPU6050数据手册将其寄存器的各项输出数据通过UART读出,并将其处理为我们所需要的7项参数(加速度Accl. [X,Y,Z],角加速度Gyro. [X,Y,Z],温度Temp)。
但是这不是本文的重点,因此本文假设已经处理好了上述数据,并且以字符打印的形式通过串口稳定输出,(通过Rasberry Pico PI预处理)如下:

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

我们需要配置串口接收参数:

COM口以用户本机分配为准

Serial Configuration配置如图

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

Serial Receive配置如图

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

注意,由于是以字符 char接收,因此选择类型为 uint8,Data Size设置缓冲区大小,此处设为128为例。同样可以设置数据包头和数据包尾,我们此处不做设置。

当然,在实际项目中会以更高效率的数据包传输,此处仅为示例作用,因此选用字符接收。

S-Function函数示例

从Library Browser中找到User-Defined functions(用户自定义函数),在系统仿真中这部分是较为常用的。

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

选择S-Function Builder,双击点开面板。由于是面板端编辑,直接面向对象,逻辑更清晰,但是限制也较多。

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

填写函数名,选择语言C++,即可Build编译。(初次需要按提示安装MinGW-w64方可编译,且安装目录不能带空格)

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

注意到,编辑器里面有三个子函数,分别封装S-Function的起始方程,输出方程和终止方程,在本实例中仅用到输出的封装,其他功能请自行学习浏览官方示例。

void xxx_Start_wrapper(void);
void xxx_Outputs_wrapper(const real_T *u0, real_T *y0);
void xxx_Terminate_wrapper(void);

注意到,输入输出参数都是以数组指针的形式传参的,带 const表示输入参数,不可更改,不带的即表示输出参数,可更改。函数的目的是按次调用这三个子函数。
我们可以先调试好C++程序再整合。

在本实例中,输入参数为大小为128*1的字符数组(uint8),输出参数为包括三个参数的总线(Bus:gyroData),以结构体形式调用。

在自己工程文件中定义头文件(structure.h),用于类型的转换和结构体的定义等,这部分内容是为了便于程序能在本地调试成功,而由于在Simulink中这部分内容已有定义,因此在Simulink的S-Function Builder中编译的时候是需要将其之注释掉的。
structure.h:

#ifndef _STRUCTURE_H
#define _STRUCTURE_H
typedef char uint8_T;
typedef short int16;

struct gyroData{
    int16_t accl[3], gyro[3];
    double temp;
};
#endif //_STRUCTURE_H

如果不注释掉,在编译时会由于变量类型冲突而编译失败。

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

在本地C++工程调试成功,即可移植。

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

调试成功后,将其移植至S-Function Builder中。
注意参数类型、维度都要一一匹配。需要用到的头文件和引入文件也需要在include部分添加进来。

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

如果C++工程包含其他文件,将工程文件目录添加至 INC_PATH,注意文件目录最好不要含有空格,否则再次打开时可能会产生修正而出错。

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

点击编译,提示 ERROR: Bus object for output port 1 gyroData does not exist in workspace,即:总线未被添加至工作区导致编译失败。

手动添加的办法,即打开MODELING中的Bus Editor选项进行添加,注意总线名称 Object Name以及元素名称,以及其类型、维度,均设置匹配。当然,也有通过代码区更方便添加的办法请自动查阅相关文档。

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

添加后请将其保存为 .mat文件方便日后直接将设置好的总线导入。

如果没有问题,会显示S-Function编译成功。

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

这时,我们可以用S-Function模块直接填写函数名,直接调用,模块会自动产生相应数目的输入输出端口,可以供检查。
(虽然S-Function Builder也可直接使用)

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

这样,我们的S-Function就编写完成。

数据可视化

我们利用Bus Selector模块进行对总线拆分,用Display模块显示文本(数组),用Scope模块进行示波器图像绘制,这些属于基本操作,就不详加叙述了。

这里提到一个调试的方法,即先使用静态文本(此处用了字符串常量String Constant)进行调试,确认S-Function功能无误即可接入动态数据进行观察。

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

最后

文章末尾,附上相关的工程文件供参考。

  • bus_gyroData.mat gyroData总线
  • getGyroData___ 由S-Function生成的函数
  • receive_test.slxc 接收端Simulink工作区面板
  • gyroDataProcess 用于产生S-Function的C++文件

请访问我的Github URL以下载:https://github.com/Chiron19/Simulink

感谢阅读!欢迎分享。

Original: https://www.cnblogs.com/jjmg/p/simulink_s-function_application.html
Author: Chiron-zy
Title: Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/583700/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 两种树的直径求法

    两遍DFS 优点:方便记录直径的两端点。 缺点:无法除理带负权的树。 树形DP 优点:短,可以处理有负权的树。 缺点:不好记录端点,容易打错。 最初每条路要走两遍,修一条路就可使与…

    数据结构和算法 2023年6月7日
    080
  • (3)栈的操作

    一、栈(Stack)的介绍 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元…

    数据结构和算法 2023年6月16日
    068
  • poj 3321 Apple Tree

    题意: 有一棵树,这棵树上有很多果子,一开始每个果子都在,给出下面两种操作: 1.C x,改变果子x的状态,如果有,那么久摘下来;没有,就变为有; 2.Q x,问在x上面的(包括x…

    数据结构和算法 2023年6月12日
    085
  • 模拟赛-3

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/orchid-any/p/16530236.htmlAu…

    数据结构和算法 2023年6月12日
    080
  • CF1467C Three Bags

    传送门 思路:对于一般情况,我们有三个袋子,容易想到把袋子里物品的价值排序。然后贪心,我们想让最后的价值最大,则三个袋子最后都可以剩余一个物品,这三个物品总和需要最大,最好的情况就…

    数据结构和算法 2023年6月7日
    0112
  • Java日志框架中需要判断log.isDebugEnabled()吗?

    背景 在日常开发中,项目会使用抽象日志接口slf4j来打印日志。如下是一段典型的打印日志代码: logger.debug("hello, world"); 但是…

    数据结构和算法 2023年6月7日
    060
  • DFS与BFS

    DFS与BFS dfs又称深度优先搜索,即一路走到底(一个执着的人),当走到底(到达叶子节点)时要回溯。注:回溯不是直接回到头,而是边回去边看,能不能再往下走,只有当我们明确当前节…

    数据结构和算法 2023年6月7日
    087
  • AtCoder ABC 270 题解(D-F)

    ​ 现在有一堆石子,一个序列a表示每次可以从石头里拿走多少个石子。当无法再拿出石头的时候,游戏结束。两边都以最佳策略游玩,请问先手者最多能拿走几个石子。 ​ 对于这种两边都采取最佳…

    数据结构和算法 2023年6月12日
    064
  • 来自学长的馈赠6 社论

    A. ^_^ 期望线性性,考虑染一个点 (u) 当且仅当其子树内的点都没被染过,于是期望为 (\dfrac1{siz(u)}) . 于是答案就是 (\displaystyle\su…

    数据结构和算法 2023年6月7日
    087
  • CF1225E Rock Is Push 题解

    一般这种 dp 的转移都是相邻格子之间的,但是这道题相邻格子之间转移没办法搞掉题目的这个限制。考虑每次转向的时候转移,这样对于某一个点,他能转移的一定是一个区间(不能到最后 (cn…

    数据结构和算法 2023年6月12日
    074
  • 《数据结构》(C语言版)学习笔记—— 第1章 绪论

    数据结构的研究内容 数据 结构主要研究非数值计算问题,非数值计算问题的数学模型不再是数学方程,而是诸如线性表、 树和图的数据结构。因此,简单地说,数据结构是一门研究非数值计算程序设…

    数据结构和算法 2023年6月7日
    084
  • 2022牛客暑期多校训练营3-A.Ancestor(LCA)

    题目传送门:https://ac.nowcoder.com/acm/contest/33188/A 题意: • 给出两棵编号 1-n 的树 A B , A B 树上每个节点均有一个…

    数据结构和算法 2023年6月8日
    0113
  • 容斥原理

    链接:https://ac.nowcoder.com/acm/contest/548/F来源:牛客网 立华奏是一个天天打比赛的萌新。 省选将至,萌新立华奏深知自己没有希望进入省队,…

    数据结构和算法 2023年6月7日
    080
  • Spring Boot+微信小程序_保存微信登录者的个人信息

    1. 前言 微信小程序开发平台,提供有一类 API,可以让开发者获取到…

    数据结构和算法 2023年6月7日
    090
  • 关于链表中结构体typedef相关疑惑的解释

    本文将以单链表和静态链表的初始化代码(c++)为例,具体分析了结构体中 typedef struct LNode{….} LNode, *LinkList, SLinkList…

    数据结构和算法 2023年6月12日
    084
  • 利用策略模式优化过多if else代码

    1.应用场景 现在需要完成这样一项业务,客户在前端输入算法名,后台就调用对应算法来进行模拟实验。假设不使用策略模式,那么我就需要以下代码实现该业务: @Autowired priv…

    数据结构和算法 2023年6月16日
    0105
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球