我是靠谱客的博主 清爽柠檬,最近开发中收集的这篇文章主要介绍simulink仿真及代码生成技术入门到精通pdf_Sinmulink代码生成基础体验教程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

d079cf4e0b6b0254887deb4c3b52fb2a.png

本文来自我的微信公众号【古德曼汽车工业】,欢迎大家关注

前言

一个完整的控制器(xCU)嵌入式程序在逻辑架构均可分为两层:一个是应用逻辑层(Application Software),用来表达整个控制逻辑的实现算法;还有一个是基础软件层(Basic Software)也就是常说的底层驱动,负责芯片功能进行初始化,例如:定时器、锁相环、CAN、SPI等。逻辑层与基础软件层之间需要有一个接口层(Interface Layer)实现数据的交互。

Simulink代码生成技术的出现很好的解决的控制器程序开发的分工问题,控制策略由各专业工程师开发,而底层驱动由嵌入式工程师完成。控制策略工程师可利用Simulink强大的建模与测试功能开发控制策略模型,最后将生成嵌入式代码与底层驱动一起编译成二进制文件。另外,如果硬件变更或者硬件升级,只需要修改驱动成代码不需要更改测试好的逻辑层策略。

代码生成工具

早期Simulink代码生成主要依托dSpace公司的TargetLink实现。安装了TargetLink后,在Simulink中就会出现TargetLink自带的元件库,如果你原先仿真时用的为Simulink的标准原件,就需要将模型转换成TargetLink模型。近几年由于Simulink EmbeddedCoder在技术上日趋成熟,并且推广力度也便较大。所以越来越多厂家开始使用EmbeddedCoder生成嵌入式代码。接下来篇幅就来演示如何使用Simulink的EmbeddedCoder功能快速生成C语言代码。

代码生成基础操作

这部分内容为了让各位对嵌入式代码生成有个直观的感受,希望有兴趣的可以跟着一起练习下,【思想】当初学习也是从这部分开始的。

84e91bf32e9c3f3b5fe845931bc9516e.png

以一个简单的模型为例,有两个输入分别为x、y,一个输出z。运算过程为z=(x+y)*k;

250dcd9eabab26429618dd0c45edb506.png

第一个重要的设置就是解算法,这里一定要设置为离散的定步长算法,并设置步长。因为所有的控制器内部都会有一个模数递减器,用来实现一个步长的精确定时。大部分控制一个步长都设置为10ms。

abd0b403a78b5a00424d9224a5cc8a4e.png

在模型设置中的代码生成选项,选取代码生成的模板。本次使用的时EmbeddedCoder,所以选择与其对应的ert.tlc。特别注意的是由于生成的代码不会使用Simulink的编译工具进行编译,所以需要勾选Generate Code Only,这样就只会生成C文件与h文件。

3453520153813b20a4d51bb1072480a7.png

点击Build Model按钮或者使用快捷键Ctrl+B进行生成代码,生成的代码会有一个报告,包含模型的配置信息。在左边的框中提示了本次生成代码的文件,点击可以对代码进行查看。生成ert_main.c文件包含了一些模型的初始化并调用模型的主函数,正常开发过程中这个文件是不会被用到。Main函数正常都是由嵌入式工程在芯片开发环境中编写,通过调度层来调用模型函数。接口与调度这部分内容会在后面的文章中详细叙述,敬请关注。GenerateCode.c文件则就是存放Simulink模型生成代码的文件,还有若干个h文件和Simulink自带的引用文件。

0833d63c4a10b4f153aa305329295c9e.png

GenerateCode_Step函数中,就是Simulink模型生成C语言代码,可以看到这里的输入与输出都是以结构体的形式进行表达的,k值则是在WorkPlace中直接赋值。这样的代码可读性比较低,接下来就对模型进行更多的优化设置。

8a6166561ce7b4076161d5402d3f079c.png

在Simulink数据管理器中使用mpt.Signal添加4个变量,分别命名为x、y、z、k设置数据类型、存储方式等,并且对k赋予初始值。

9fb63171b3573d94c50fbc91e4ae54fe.png

选中信号线并右键进入properites【属性】对话框,在SignalName中输入刚刚创建的变量名,并勾选Signal name must resolveto Simulink signal object。

e529f320e78fd02b31c4c7163137db5c.png

设置后的模型效果,可以看到这时候信号线上多了个关联图标并再次对模型生成代码。

8a9e1dc53fa1f75a67e8c12b6d1ca8b2.png

生成后的代码就可以看到与第一次生成的相比,那几个晦涩难懂的结构体已经被具体的变量名取代了。以上这个部分很重要,这是后续接口层开发的要点。

函数的封装

手工写过代码的朋友一定有这样的经验,尽可能的要把相同逻辑的代码用一个函数封装起来。这样既可以很方便地调用代码,也能够减少代码冗余提高执行效率。同样的使用Simulink建模也需要考虑这个问题。

2992732a05558572c371549d252d463e.png

对刚刚的没模型进行简单的封装,并复制一个出来。两个子系统中的逻辑都是z=(x+y)*k,区别仅仅是输入与输出不同。

6fcec6cf4b25e8192756a4d3e2e48112.png

右键对Subsystem模块属性进行设置,勾选【Treat as atomic unit】设置为原子子系统,并自定义一个函数名。

aae2e5cbea49c42a2da7b29815882056.png

生成代码后可以看到,左边两个Subsystem均调用了同一个函数。

生成代码的设置

生成代码的设置除了上面的选择编译模板一定要配置外,下面这几个选项也是需要注意的。如果比较细心的朋友会发现前面生成报告的硬件信息为Intel->x86-64 (Windows64),在模型设置中可以对设备进行指派,设置芯片的厂家、型号、各数据类型的数据长度、甚至字节序。

8221b0989bbb35fa8e1dddd61d971ae7.png

另外这部分是很容易被忽略的,这里可以根据不同的C语言标准来生成代码,支持C99和C89标准。做嵌入式开发的朋友一定要根据自己的开发环境来选择,如使用code warrior 5.2的朋友一定要选择C89,选择C99就会出现编译错误的问题。

更多内容

更多的基础设置及细节问题可以向思想索取Matlab官方培训视频及思想对该视频的学习笔记ppt

abd2b210b316d22e8d9d2874d9052f4f.png

最后

以上就是清爽柠檬为你收集整理的simulink仿真及代码生成技术入门到精通pdf_Sinmulink代码生成基础体验教程的全部内容,希望文章能够帮你解决simulink仿真及代码生成技术入门到精通pdf_Sinmulink代码生成基础体验教程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(100)

评论列表共有 0 条评论

立即
投稿
返回
顶部