本文描述查表模块的建模并研究生成的代码。
查表模块中定义了断点和查表值(都是数组)的对应关系,然后通过输入数值在断点中的位置,“查出”对应在查表值中的数值,然后输出。
查表模块是汽车软件开发中的一种常用的模块,因为在实际工作中,很多物理量之间的对应关系是难以用数学公式来表达的,但是可以通过实验测量出关系曲线,然后截取其中对应的坐标点。例如方向盘转角和车轮转角的对应关系、发动机特性曲线、制动踏板和制动主缸压力对应关系等,都可以用查表模块来处理。
本节研究1D查表模块的建模用法,更高维度的查表模块类似。
假如现在的目标是通过方向盘转角的输入查表得出左前轮转角的输出,那么应该做如下几步。
在Table and Breakpoints选项卡中需要设置断点和查表值,这是对输入信号进行查表的依据。
模块中默认定义了断点和查表值为[-5:5]和tanh([-5:5])的常数,这就意味着这张“表”是写死在软件里,不能更改的。比较合理的做法是将其配置成标定量,在Simulink中对应的就是Parameter对象。所以首先在Matlab工作空间中定义方向盘转角和车轮转角的数组参数,如下。
其中Value代表查表值或参数的数组,DataType类型。数值是随便设置的。这里的断点数组最好是从小到大排序的,否则容易出现理解上的问题,虽然模型不会有什么问题。
然后把这两个参数写在查表模块里面。
下方的Edit table and breakpoints按钮也可以方便地查看两个参数。
接下来要设置插值算法,Algorithm选项卡如下:
这里重点关注的是Interpolation method和Extrapolation method这两项,也就是内插和外插。
内插表示输入值落在断点数组范围之内,此时可以用线性、就近原则等进行插值。这里用用线性的方式进行插值,也就是说在前后两个断点中间等比例地计算。
外插表示输入值落在断点数组范围之外,此时可以选用线性或者禁止外插改用端点的方式(Clip),这里用了Clip的方式,因为超出了边界后,数据就没有意义了,起到了一个防止溢出的效果。
查表模块涉及到很多变量的数据类型,包括输入输出、断点、中间值等,在DataType可以配置这些类型。
博主在工作中习惯将断点和查表值配成继承数据字典,将中间值配置成内部规则,规则改为速度优先(Speed),如下:
工作中感觉类型相关的的配置差别不大。
保存之前的设置,然后给模块一个输入,仿真得出输出如下。
这个模块计算的过程是这样的:
以上就是上文配置的线性内插的过程。外插的方法比较简单,这里就不再描述。
将前文的模型替换成inport和ouport如下:
Ctrl + B生成代码:
上图可以看出,查表模块封装成一个函数look1_iflf_binlcapw,传入断点、输入值、查表值等参数,在step函数内调用。
look1_iflf_binlcapw内的实现,与上一节的分析过程相同。
本文研究了查表模块的使用和代码生成。该模块在汽车软件开发中是很常用的,很好的处理了很多非线性关系。
>>返回个人博客总目录