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)

大家都在看

  • 反射解决微信开发加解密illegal key size,不需要修改JDK jar包

    在微信开发时,消息接口时,涉及到消息加密,抛出了 java.security.InvalidKeyException: Illegal key size 的异常,异常堆栈如下: 按…

    数据结构和算法 2023年6月16日
    0122
  • 2022ICPC网络赛 L LCS-like Problem(DP 子序列自动机)

    L LCS-like Problem(DP 子序列自动机) ​ 给出两个串s, t。请找出一个最长的子序列(s’),使其与(t)的最长公共子序列长度不大于1。输出这个最…

    数据结构和算法 2023年6月12日
    094
  • 联合省选 JSOI2022 游记

    Day 998244351 学了一下 NOI Linux 2.0 的使用,防止赛场上出现不知道如何操作的情况。 vscode 真好用! Day 998244352 尝试补了点模拟赛…

    数据结构和算法 2023年6月12日
    063
  • tarjan全家桶

    tarjan 全家桶 关于tarjan 它太强了 CCCOrz dfs树&low dfs树:在图上做不重复经过同一点的dfs,经过的边与点形成一棵树。于是图上所有点都被这棵…

    数据结构和算法 2023年6月7日
    072
  • ZJOI 2009 取石子游戏题解

    本文作者:Altwilio 希望写的题解不要再被小破网站爬了。本题解给出所有情况下保证先手必败的具体方案。 有一排 (n) 堆石子,两人轮流从最左或最右一堆取若干石子,不能取的人输…

    数据结构和算法 2023年6月12日
    0109
  • buuctf-[RoarCTF2019]babyRSA

    下载py文件,代码如下: 代码逻辑不难,就是通过自定义的myGetPrime()函数获得三个大质数p,q,r,再加密,重点在于函数的返回值 sympy.nextPrime((B!)…

    数据结构和算法 2023年6月7日
    058
  • 大前端网络篇之认识HTTP/2

    HTTP/2 从2015年产生,它的出现解决了HTTP/1.x伴随的一些缺点,具体从以下三点了解一下都解决了哪些个问题 Multiplexing(多路复用) 和 Concurren…

    数据结构和算法 2023年6月7日
    063
  • 数据结构3.2栈的应用

    1 #define _CRT_SECURE_NO_WARNINGS 1 2 3 #include 4 #include 5 #include<string.h> 6 #…

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

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

    数据结构和算法 2023年6月12日
    068
  • 初识设计模式-适配器模式

    适配器在生活中经常见到,如手机、笔记本电脑的电源适配器,USB 转接头都是常见的适配器。 在设计模式当中,适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。 在类适配器模…

    数据结构和算法 2023年6月8日
    082
  • 890.查找和替换模式

    你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配。 如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之…

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

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

    数据结构和算法 2023年6月12日
    066
  • ACM模式细节

    牛客网的ACM模式需要自己写输入输出,在这里简单记录一下: 基本答题框架: import java.util.*; public class Main{ public static…

    数据结构和算法 2023年6月8日
    0116
  • P2634 [国家集训队]聪聪可可

    简要题意 给你一个 (n) 各节点的树,每一个边有一个权值。你需要求出树上任意两个的点之间的简单路径权值和(相同的点结果是 (0))是 (3) 的倍数的概率。输出概率的最简分数形式…

    数据结构和算法 2023年6月12日
    075
  • st表树状数组入门题单

    树状数组用来维护一个具有区间可减(加)性质的工具,所以可以用来维护区间前缀和。区间最值不具有区间可减性,所以不能使用树状数组进行维护,而使用st表。 初始化 &#x9884…

    数据结构和算法 2023年6月7日
    071
  • STL set

    一句话原理: set用红黑树(一种AVL)实现。 一句话功能: 能替代一部分AVL(二叉排序树)的功能。 详细如下: 查询最大(小)值。 查询值k出现的次数。 查讯值k的前驱(后继…

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