电子说
1 从零新建一个MBDT工程
从零开始创建MBDT工程可以分为七个步骤:
**1. **将S32K144 EVB连接到电脑上,注意检查OpenSDA端口号和磁盘中S32K144 EVB盘号;
**2. **选择合适的位置作为MATLAB的工作空间,新建Simulink模型,并命名保存;
**3. **在模型中添加必要模块,包括MBD_S32K1xx_Config_Information、Digital_Input_ISR、Periodic_Interrupt_Timer和两个Function-Call Subsystem,如下图:
添加模块到新建工程中 - From autoMBD
**4. **配置模块的参数,各个模块的配置可以参照以下截图(未给出截图的地方保持默认即可):
MBD_S32K1xx_Config_Information配置1 - From autoMBD
MBD_S32K1xx_Config_Information配置2 - From autoMBD
Periodic_Interrupt_Timer配置 - From autoMBD
Digital_Input_ISR配置 - From autoMBD
**5. **构建中断中执行的功能,本示例执行的功能较为简单,仅控制灯的亮灭。具体的模型如下(两个模型实际上是一样的,只不过输出的引脚不一样):
周期中断的中断函数模型 - From autoMBD
按键中断的中断函数模型 - From autoMBD
**6. **选择固定步长,配置工程的步长为0.001 s,设置求解器为离散求解器。工程的步长根据实际需要进行配置,但也要考虑模型的运算量。如果运算量大,在设置的步长内不能完成计算,会导致错误结果。
工程求解器配置 - 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不是已经下载好了吗?原因我总结有以下三点:
从我目前了解到的,一个完整的基于MBD的开发,还很难摆脱对IDE的依赖,所以这里给出使用S32DS下载生成的代码的示例。同样给出一个视频教程时长约4 min 44 s。
使用S32DS下载生成的代码,一共有6个步骤:
**1. **打开S32DS,新建一个空白工程,并删去main.c文件。注意新建工程时不要选择SDK,因为生成的代码中已经包含了SDK,其他保持默认即可。
*新建S32DS工程(不选择SDK) * - From autoMBD
但如果你在 模型中使用了AMMCLIB的相关模块 ,可以在新建的时候添加相应的AMMCLIB库:
*添加AMMCLIB工具 * - From autoMBD
当然也可以通过添加库的方式添加AMMCLIB,添加库的方法是:选中工程,右键选择“Properties”,找到Paths and Symbols中的Library Paths和Libraries,添加S32K14x_AMMCLIB.a文件和路径即可(其他扩展库也是这样的方法添加):
*添加AMMCLIB工具 * - From autoMBD
需要注意的是路径和库文件的格式,以我自己安装的AMMCLIB1.1.24为例,格式如下:
*添加库文件 * - From autoMBD
*添加库路径 * - From autoMBD
视频展示的例程没有使用到AMMCLIB库,所以没有上述过程。
**2. **将Simulink生成的代码复制到S32DS工程中去,生成的代码在Simulink工作空间一个标题为 “工程名”+“_mbd_rtw” 的文件夹中。生成的代码源文件有:
将上述所有源文件复制到新建的工程中去:
*复制生成的代码到S32DS工程中 * - From autoMBD
**3. **下一步,添加编译路径。需要添加的具体路径如下:
值得注意的是, 如添加了库,那么库的include文件也需要包含到路径中 。还是以AMMCLIB1.1.24为例,库的包含路径为:
同样视频中也没有这个步骤。添加库的方法是:选中工程,右键选择“Properties”,找到Paths and Symbols中的“Includes”,依次添加上述路径即可。如下图所示:
*添加必要的编译路径 * - From autoMBD
**4. **将startup.c、system_S32K144.c从编译路径中移除,因为这些文件和新建的S32DS工程有重复,编译会报错。从编译路径移除的方法是:选中要移除编译路径的文件,右键选中Buidl path -> Remove from -> Debug_FLASH。
移除编译路径的文件并没有被删除,但不会被编译,同时文件会变成灰色。如下图所示:
*移除编译路径的文件 * - From autoMBD
5. 至此生成的代码已经成功导入到S32DS中了,可以点击编译查看是否有错误。
*编译S32DS工程 * - From autoMBD
**6. **点击Debug虫,开始下载代码
下载S32DS工程* * - From autoMBD
下载成功后,即可开始Debug,下图方框中的按钮分别是:运行、暂停、终止、断开连接、步入、步进、步出。
*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工程比较简单,可按以下步骤进行创建:
创建的Model工程如下图所示:
*PIL测试的Model工程 * - From autoMBD
**3. **创建Top工程。可按以下步骤创建:
值得注意的是,PIL的输入信号要转换为单精度数,因为MCU处理的是单精度数据。创建的Top工程如下:
*PIL测试的Top工程 * - From autoMBD
**4. **至此PIL测试的模型搭建已经完成了。将仿真总时长设为6 s,点击Run即可开始PIL测试。测试过程中的现象可查看上面的视频,这里给出一个测试结果的图:
*PIL测试的结果 * - From autoMBD
由于斜坡输入的斜率为π,初始值-2π,总仿真时长为6π,那么测试的输入信号范围是-2π到4π。从上图可以看到,-2π到2π之间的曲线是吻合得较好的,当输入信号大于2π时,MCU的Sin函数计算结果开始出现失真。
查看AMMCLIB的手册说明,找到GFLIB_Sin_FLT的说明
*GFLIB_Sin_FLT的说明 * - From AMMCLIB手册
可以看到这里要求的输入范围是-π到π。一般对于MCU来说,算力非常紧张,所以这种非线性的数学函数会有特殊的要求,如果不满足就会出现失真,结果不正确。所以我们在使用这类函数的时候一定要注意使用要求,从而保证最佳的性能。
全部0条评论
快来发表一下你的评论吧 !