MBDT实现PIL测试步骤

电子说

1.2w人已加入

描述

1 从零新建一个MBDT工程

  • 按键中断 :检测S32K144 EVB上的按键SW2,每按下一次,红色LED灯切换一次亮灭状态;
  • 周期中断 :每0.5秒(2 Hz)进入一次周期中断服务函数,切换绿色LED灯亮灭状态,绿色LED灯会亮灭交替闪烁。

从零开始创建MBDT工程可以分为七个步骤:

**1. **将S32K144 EVB连接到电脑上,注意检查OpenSDA端口号和磁盘中S32K144 EVB盘号;

**2. **选择合适的位置作为MATLAB的工作空间,新建Simulink模型,并命名保存;

**3. **在模型中添加必要模块,包括MBD_S32K1xx_Config_Information、Digital_Input_ISR、Periodic_Interrupt_Timer和两个Function-Call Subsystem,如下图:

simulink仿真

添加模块到新建工程中 - From autoMBD

**4. **配置模块的参数,各个模块的配置可以参照以下截图(未给出截图的地方保持默认即可):

simulink仿真

MBD_S32K1xx_Config_Information配置1 - From autoMBD

simulink仿真

MBD_S32K1xx_Config_Information配置2 - From autoMBD

simulink仿真

Periodic_Interrupt_Timer配置 - From autoMBD

simulink仿真

Digital_Input_ISR配置 - From autoMBD

**5. **构建中断中执行的功能,本示例执行的功能较为简单,仅控制灯的亮灭。具体的模型如下(两个模型实际上是一样的,只不过输出的引脚不一样):

simulink仿真

周期中断的中断函数模型 - From autoMBD

simulink仿真

按键中断的中断函数模型 - From autoMBD

**6. **选择固定步长,配置工程的步长为0.001 s,设置求解器为离散求解器。工程的步长根据实际需要进行配置,但也要考虑模型的运算量。如果运算量大,在设置的步长内不能完成计算,会导致错误结果。

simulink仿真

工程求解器配置 - From autoMBD

**7. **至此MBDT的工程已经完成,可以生成代码了。在“C CODE”标签中点击“Build”(快捷键ctr + B),Simulink编译后会将代码自动下载到S32K144 EVB中,并运行起来。一切正常的话,下载后可以看到绿色LED灯在不断闪烁,按压SW2按键,可以控制红色LED灯的亮灭。

从零开始新建一个MBDT工程的基本步骤就是这样的了。

使用模型来构建自己的函数,最常用到的是Simulink中的 Stateflow ,它可以高效的产生和控制各种信号(Signal)、事件(Event)和状态(State)。后期会专门针对Stateflow开一期,欢迎关注。

2 使用S32DS下载生成的代码

可能有读者会疑惑,为什么需要使用S32DS下载生成的代码,Simulink不是已经下载好了吗?原因我总结有以下三点:

  • 最重要的一点是 ,底层驱动并不适合通过模型的方式来实现,最高效的还是使用S32DS来配置底层。一般建议将算法部分和底层驱动分开,这样的话需要有一个集成的过程,这就避免不了使用S32DS;
  • 使用S32DS进行debug更加高效和便捷,功能也更加强大;
  • 通过S32DS还可以对生成的代码进行扩展,扩展一些其它库或者技术栈。

从我目前了解到的,一个完整的基于MBD的开发,还很难摆脱对IDE的依赖,所以这里给出使用S32DS下载生成的代码的示例。同样给出一个视频教程时长约4 min 44 s。

使用S32DS下载生成的代码,一共有6个步骤:

**1. **打开S32DS,新建一个空白工程,并删去main.c文件。注意新建工程时不要选择SDK,因为生成的代码中已经包含了SDK,其他保持默认即可。

simulink仿真

*新建S32DS工程(不选择SDK) * - From autoMBD

但如果你在 模型中使用了AMMCLIB的相关模块 ,可以在新建的时候添加相应的AMMCLIB库:

simulink仿真

*添加AMMCLIB工具 * - From autoMBD

当然也可以通过添加库的方式添加AMMCLIB,添加库的方法是:选中工程,右键选择“Properties”,找到Paths and Symbols中的Library Paths和Libraries,添加S32K14x_AMMCLIB.a文件和路径即可(其他扩展库也是这样的方法添加):

simulink仿真

*添加AMMCLIB工具 * - From autoMBD

需要注意的是路径和库文件的格式,以我自己安装的AMMCLIB1.1.24为例,格式如下:

  • 库文件为 英文的冒号+文件名 ,不包含路径

simulink仿真

*添加库文件 * - From autoMBD

  • 库路径为 路径所在目录 ,不包含库文件

simulink仿真

*添加库路径 * - From autoMBD

视频展示的例程没有使用到AMMCLIB库,所以没有上述过程。

**2. **将Simulink生成的代码复制到S32DS工程中去,生成的代码在Simulink工作空间一个标题为 “工程名”+“_mbd_rtw” 的文件夹中。生成的代码源文件有:

  • common文件夹内所有文件
  • inc文件夹内所有文件
  • S32K144文件夹内所有文件
  • src文件夹内所有文件
  • 目录内所有***.c和.h文件***

将上述所有源文件复制到新建的工程中去:

simulink仿真

*复制生成的代码到S32DS工程中 * - From autoMBD

**3. **下一步,添加编译路径。需要添加的具体路径如下:

  • ${ProjDirPath}/src
  • ${ProjDirPath}/src/common
  • ${ProjDirPath}/src/inc
  • ${ProjDirPath}/src/S32K144/include
  • ${ProjDirPath}/src/src/clock/S32K1xx
  • ${ProjDirPath}/src/src/power/S32K1xx

值得注意的是, 如添加了库,那么库的include文件也需要包含到路径中 。还是以AMMCLIB1.1.24为例,库的包含路径为:

  • C:NXPAMMCLIBS32K14x_AMMCLIB_v1.1.24include

同样视频中也没有这个步骤。添加库的方法是:选中工程,右键选择“Properties”,找到Paths and Symbols中的“Includes”,依次添加上述路径即可。如下图所示:

simulink仿真

*添加必要的编译路径 * - From autoMBD

**4. **将startup.c、system_S32K144.c从编译路径中移除,因为这些文件和新建的S32DS工程有重复,编译会报错。从编译路径移除的方法是:选中要移除编译路径的文件,右键选中Buidl path -> Remove from -> Debug_FLASH。

移除编译路径的文件并没有被删除,但不会被编译,同时文件会变成灰色。如下图所示:

simulink仿真

*移除编译路径的文件 * - From autoMBD

5. 至此生成的代码已经成功导入到S32DS中了,可以点击编译查看是否有错误。

simulink仿真

*编译S32DS工程 * - From autoMBD

**6. **点击Debug虫,开始下载代码

simulink仿真

下载S32DS工程* * - From autoMBD

下载成功后,即可开始Debug,下图方框中的按钮分别是:运行、暂停、终止、断开连接、步入、步进、步出。

simulink仿真

*S32DS Debug调试 * - From autoMBD

通过S32DS下载的代码,功能和Simulink下载的是完全一样的。

3 基于MBDT实现PIL测试

通过MBDT,实现PIL(Processor In the Loop)是比较简单的。

PIL的基本原理是,Simulink在下载代码的同时,会在代码中包含一段通信协议。该通信协议可以接受Simulink发送的指令,并传输代码运算的结果到Simulink。

在Simulink的每一个步长中,Simulink会将输入信号发送到MCU,MCU计算好后,再将结果传回Simulink,周而复始实现PIL测试。一般采用的是串口通信方式,本示例中使用的是UART通讯。

**Tips:**该通信协议被称为rtiostream,是Simulink开发的,有兴趣的可以去了解一下。

这里要提一下,在MCU的应用中,是没必要做SIL(Software In the Loop)的,因为SIL是在电脑上跑(跑的是exe文件),而实际代码是在MCU中跑。这样的SIL测试结果没什么意义。MCU的应用中,一般只需要执行PIL和HIL。

开展PIL测试需要创建两个工程:Model工程是被测工程,会生成代码,并下载到MCU中运行;Top工程是上位机工程,用于产生Model工程的输入信号,并与MCU进行数据交互。

本示例中对 AMMCLIB中的Sin函数进行PIL测试 ,测试其在MCU中的运行效果。开展PIL测试一共分为了四个步骤:

**1. **首先将S32K144 EVB连接到电脑上,并为MATLAB选择合适的工作空间。前文已经提到过,这里不再赘述。

**2. **创建Model工程。Model工程比较简单,可按以下步骤进行创建:

  • 添加MBD_S32K1xx_Config_Information模块,并配置参数;
  • 添加GFLIB_Sin_FLT、输入和输出模块;
  • 配置工程步长为0.001 s。

创建的Model工程如下图所示:

simulink仿真

*PIL测试的Model工程 * - From autoMBD

**3. **创建Top工程。可按以下步骤创建:

  • 添加Model模块,并关联到需要测试的model工程;
  • 添加对照模块,斜坡输入(斜率π,初始值-2π)作为输入信号;
  • 配置工程步长为0.001 s。

值得注意的是,PIL的输入信号要转换为单精度数,因为MCU处理的是单精度数据。创建的Top工程如下:

simulink仿真

*PIL测试的Top工程 * - From autoMBD

**4. **至此PIL测试的模型搭建已经完成了。将仿真总时长设为6 s,点击Run即可开始PIL测试。测试过程中的现象可查看上面的视频,这里给出一个测试结果的图:

simulink仿真

*PIL测试的结果 * - From autoMBD

由于斜坡输入的斜率为π,初始值-2π,总仿真时长为6π,那么测试的输入信号范围是-2π到4π。从上图可以看到,-2π到2π之间的曲线是吻合得较好的,当输入信号大于2π时,MCU的Sin函数计算结果开始出现失真。

查看AMMCLIB的手册说明,找到GFLIB_Sin_FLT的说明

simulink仿真

*GFLIB_Sin_FLT的说明 * - From AMMCLIB手册

可以看到这里要求的输入范围是-π到π。一般对于MCU来说,算力非常紧张,所以这种非线性的数学函数会有特殊的要求,如果不满足就会出现失真,结果不正确。所以我们在使用这类函数的时候一定要注意使用要求,从而保证最佳的性能。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分