3. Coder保留的默认名称
在“1简单示例”一节,生成的代码中出现了一些固定的名称,这些是代码生成器保留的默认名称,用户不能改变。为方便理解生成的代码,将这些默认名称及含义列于表 1中。 表 2. 生成代码中的默认名称 默认名称 U Y B P DW DefaultP Ext 含义 整个模型的输入模块 整个模型的输出模块 模块输出信号 模块参数 离散模块状态 默认参数 全局类型加的前缀 默认名称 local rt rtb _T step initialize 含义 局部变量加的前缀 全局变量的前缀,可设置 局部模块输出的前缀,可设置 默认类型后缀,可替换 模型入口,可设置 模型初始化,可设置
4. 代码重用
该部分将搭建一个稍微复杂模型,封装参数,生成可重用代码。 1) 建立如错误!未找到引用源。模型。
图 2. PID模型
2) 选中上面模型,右键,create subsystem from selection.进入子系统,按上面介绍的方法编辑各基本模块。为信号和状态起名,设置输入数据类型,输出数据类型和输入保持一
致。参数设置为结构体,比如KpGain的值设置为pid.Kp,数据类型继承。
3) 返回模型上一级,修改子系统名称为Dpid,选中子系统右键 -> mask -> edit mask,在parameter选项卡,编辑参数,将名称设为pid。
4) 右键->subsystem parameters,勾选treat as atomic unit,function packing设为reusable,函数名设为UnSatIntPid。
5) 打开model explorer,在数据字典中添加simulink bus类,选中该类,右下角launch bus editor进入编辑,设置类名称为PidParaStrc,将参数按名称依次添加到类,并设置基本数据类型。
6) 在数据字典中添加simulink parameter对象,将对象数据名称设为DpidPar,类型设为PidParaStrc,值设为struct,存储类型设为ExportedGlobal。在DpidPar值属性列,编辑与PidParaStrc类成员对应的参数名称,并赋值。将simulink参数DpidPar复制一份,编辑其参数值。
7) 将子系统Dpid复制一份,名称改为Qpid,设置mask参数为QpidPar,连上输入输出,最终模型如图所示。
图 3. 代码重用演示模型
8) 设置好模型配置参数,编译生成代码,查看生成的报告。
整个模型的代码如下,调用两次UnSatIntPid函数,分别传入不同的参数。
生成可重用的算法如下所示,函数名为设置的UnSatIntPid,函数参数有四个,依次是给定,反馈,子系统状态,PidParaStrc参数。
5. 数据重用
嵌入式应用多用查表的方式实现较复杂的数学函数,比如三角函数。而且为了保证精度,表格的数据一般较多。通常,如正弦函数,会充分利用周期性对称性,查找(0, pi/2)的sin表格。本部分将演示,将(0, pi/2)的sin表格定义为全局const变量,单独放在一个文件,实现sin/cos函数。
1) 建立如图 4模型实现sin查表。
图 4. sin查表模型
模型输入为无符号短整型,执行环境下输入角度信号,ufix(16, 15)类型,1代表360度。输出为sfix(16, 15),为sin查表值。模型使用同一个[0,pi/2)的sin表,表长256,表数据类型同输出。
2) 设置查表模块名称为SinTab90d,右击设置属性,表格数据设置为SinTab90d,数据类型继承。对SinTab90d建立Simulink.Patameter对象,保存到数据字典。参数值设置为sin( [ 0 : pi/2/255 : pi/2 ] ),数据类型设置为fixdt(1,16,15),存储类型设置为ConstVariable(Custom),定义文件、头文件设置为LkupTab。然后复制出其余四个查表模块。
3) 将模型封装为可重用子模块。
4) 按同样的方法,可利用[0,pi/2)的sin表格实现cos查表。
5) 最后建立如图 5模型,对算法进行仿真,验证算法输出是否没有错误。
图 5. 正弦查表算法仿真验证
仿真结果如图 6,从图中可看出,一个周期内计算结果均正确,算法得以验证。
图 6. 正弦查表模型仿真波形
6) 剔除仿真用的信号发生和示波器,接输入输出端口,设置,然后生成代码。
整个模型的入口函数为:
按配置,模型为表格生成单独的文件:
生成可重用的LkupSin函数如下,函数第一个参数为输入,第二个参数为输出。
更多使用方法,请参见MATLAB软件help。