邹凡 朱宏翔 袁凯
摘 要:文章介绍了MATLAB/Simulink的自动代码生成的实现方法和过程。以某新能源汽车油门控制模型为例,重点解释了浮点模型和定点模型之间的区别,并通过自动生成的代码和CodeWarrior编译生成的可执行文件证明定点模型相对于浮点模型所占内存少。
关键词:MATLAB/Simulink;自动代码生成;浮点;定点
中图分类号:U462 文献标识码:A 文章编号:1671-7988(2019)04-131-03
前言
随着电动汽车的快速发展,企业对电子控制系统的性能与开发效率提出了越来越高的要求,传统手写代码的开发方式周期长、调试难度大,已经很难适用于现代电控系统的开发。在新型电子控制系统的发展中,出现了一套成熟的汽车电控系统开发模式—V模式开发。利用MATLAB/Simulink工具搭建控制模型,在设计初期就可以直观地反映设计需求,进行系统设计,便于阅读和修改,使模型的更新与代码保持一致,而且没有实施过程中产生的错误,并且可以处理很复杂的模型系统。其中,自动代码生成技术可以直接从图形模型生成目标处理器上的代码,不仅保证了代码与模型的高度一致性,也使得控制器開发更加高效有序。
1 Simulink建模及代码生成
近几年来,在汽车电子控制领域,Simulink已经成为动态系统建模和仿真领域中应用最为广泛的软件之一。由于Simulink是采用模块组合方式来建模,从而可以使得用户能够快速、准确地创建动态系统的计算机仿真模型,特别是对复杂的不确定非线性系统更为方便。
在Simulink模型中要进行自动代码生成,至少有3部分需要配置:解算器(solver);目标硬件设置(hardware imple mentation);系统目标文件(system target file)。
一般情况下,Simulink的模型只生成应用层代码,其应用层软件与底层软件结合只能通过手动集成。现基于Freescale的一款芯片自主开发出一键式自动代码生成技术,通过编程自动集成应用层软件与底层软件,即可将控制模型自动生成可执行代码。
对于解算器(solver),其类型需设置为固定步长。由于模型是用于生产嵌入式代码,并下载到单片机中运行,而单片机总是以时钟源提供的稳定频率运行,无法进行变步长运算,所以两采样点间的时间间隔要设为固定。步长的大小取决于对计算精度和速度的平衡,步长越小,精度越高,而计算的速度越慢。在目标硬件为通用的情况下,对代码生成没有影响,当前设置为0.01s。
其次在目标硬件设置(hardware implementation)中,设备供应商(Device vendor)选择为Freescale,设备类型(Device type)选择为对应的芯片型号。因为目前使用的整车控制器芯片平台已经达到成熟量产的状态,所以目标硬件设置将所选芯片设置为默认状态。
再次在Code Generation界面中,将系统目标文件选择为Embedded Coder对应芯片的.tlc文件。Embedded Coder是可生成用于嵌入式单片机的实时C代码的编译器。TLC文件的作用是将模型编译出的RTW文件转换为支持某平台或硬件的代码,其Template makefile选择targetcoder.tmf。取消勾选Generate code only,否则编译只能生成C代码,无法生成可执行文件。
完成以上设置后,点击Build Model或者Ctrl+B快捷键即可生成C代码和可执行文件。
2 浮点数模型和定点数模型
Simulink建立的模型默认情况下以double型变量定义,并且参数和信号都以结构体形式生成代码,这会使得参数和信号在调用时都产生冗长的代码,降低可读性,并加重RAM的储存和单片机的计算负担。
Simulink定点软件支持整型数和定点数,它们之间的主要区别是小数点。在定点型硬件中,数据是以二进制的形式进行存储。定点数和它们的数据类型以字长、二进制小数点、有符号还是无符号为特征。目前整车控制器使用的为Freescale的16位芯片,其支持的是定点型数据,所以整车控制模型是以整数形式建模,但是其中的查表模块(Lookup Table)因条件限制,其中的数据类型为single形式,随着整车控制软件功能的增加,其中的查表模块使用的频次增多,生成的代码会加大对芯片内存的占用,导致整车控制程序运行效率降低。所以通过使用Fixed-Point工具,对查表模块的数据进行定点化(fixdt)处理。
对整车控制模型中的油门控制算法进行定点化:
3 生成结果分析
基于MATLAB/Simulink生成的浮点型代码和定点化后生成的代码数据如下:
定点数是用整数表达的小数,在单片机存储上面的数据时,是以整数来存储,如图7所示,数据都为uint16_T类型,此数据类型在单片机中占用2个字节,而如图6所示,数据都为real32_T类型数据,此数据类型在单片机内存中占据4个字节;如图6所示,查表的浮点数据总共是22个数据,定点化后是整数类型是33个数据。浮点型的存储会占用的内存是22*4=88个字节;如果定点化后存储数据占用的内存是33*2=66个字节。
而现在我们采用的是Freescale的16位单片机是定点处理器;这样会大大的减少数据在单片机中存储。
在CodeWarrior编译器的右下方显示(2.000000MHZ),表示晶振是2MHz,晶振后面就是时间。由图8和图9对比,图8显示的运行时间是1197,图9显示的运行时间是2780,定点化后运行同样一个算法所使用的时间只占到了浮点模型运行时间的一半不到。
综上所述,Simulink模型经过定点化处理后,其代码占用的内存变小,程序运行的时间也大大缩短,从而可以提高整车控制器整个程序的运行效率和质量。
4 结束语
本文介绍了MATLAB/Simulink的自动代码生成技术,并着重介绍了浮点模型和定点模型生成代码的区别。后期建立的Simulink模型可以朝定点数方向发展,进一步高效的利用单片机的资源。
参考文献
[1] 孙忠潇,Simulink仿真及代码生成技术入门到精通[M],北京:北京航空航天大学出版社,2015:350-374.
[2] 刘杰,翁公羽,周宇博,基于模型的设计-MCU篇[M],北京,北京航空航天大学出版社,2011:458-465.