Simulink建模基础: 查表模块及其代码

本文描述查表模块的建模并研究生成的代码。

1 Simulink中的查表模块

查表模块中定义了断点和查表值(都是数组)的对应关系,然后通过输入数值在断点中的位置,“查出”对应在查表值中的数值,然后输出。

查表模块是汽车软件开发中的一种常用的模块,因为在实际工作中,很多物理量之间的对应关系是难以用数学公式来表达的,但是可以通过实验测量出关系曲线,然后截取其中对应的坐标点。例如方向盘转角和车轮转角的对应关系、发动机特性曲线、制动踏板和制动主缸压力对应关系等,都可以用查表模块来处理。

下图中是1D查表模块,也就是通过一个断点数组查表得出数值。
在这里插入图片描述

2 查表模块示例模型

本节研究1D查表模块的建模用法,更高维度的查表模块类似。

假如现在的目标是通过方向盘转角的输入查表得出左前轮转角的输出,那么应该做如下几步。

2.1 设置Table and Breakpoints

在Table and Breakpoints选项卡中需要设置断点和查表值,这是对输入信号进行查表的依据。
在这里插入图片描述
模块中默认定义了断点和查表值为[-5:5]和tanh([-5:5])的常数,这就意味着这张“表”是写死在软件里,不能更改的。比较合理的做法是将其配置成标定量,在Simulink中对应的就是Parameter对象。所以首先在Matlab工作空间中定义方向盘转角和车轮转角的数组参数,如下。
在这里插入图片描述
其中Value代表查表值或参数的数组,DataType类型。数值是随便设置的。这里的断点数组最好是从小到大排序的,否则容易出现理解上的问题,虽然模型不会有什么问题。

然后把这两个参数写在查表模块里面。
在这里插入图片描述
下方的Edit table and breakpoints按钮也可以方便地查看两个参数。

2.2 设置Algorithm

接下来要设置插值算法,Algorithm选项卡如下:
在这里插入图片描述
这里重点关注的是Interpolation method和Extrapolation method这两项,也就是内插和外插。

内插表示输入值落在断点数组范围之内,此时可以用线性、就近原则等进行插值。这里用用线性的方式进行插值,也就是说在前后两个断点中间等比例地计算。

外插表示输入值落在断点数组范围之外,此时可以选用线性或者禁止外插改用端点的方式(Clip),这里用了Clip的方式,因为超出了边界后,数据就没有意义了,起到了一个防止溢出的效果。
在这里插入图片描述

2.3 设置DataType

查表模块涉及到很多变量的数据类型,包括输入输出、断点、中间值等,在DataType可以配置这些类型。
在这里插入图片描述
博主在工作中习惯将断点和查表值配成继承数据字典,将中间值配置成内部规则,规则改为速度优先(Speed),如下:
在这里插入图片描述
工作中感觉类型相关的的配置差别不大。

2.4 简单仿真

保存之前的设置,然后给模块一个输入,仿真得出输出如下。
在这里插入图片描述
这个模块计算的过程是这样的:

  1. 首先输入数值为350,输入值是落在了断点数组之内的,所以要用内插;
  2. 由于断点数组是[-500 -400 -300 -200 -100 0 100 200 300 400 500],输入的350处于300~400之间,所以索引是8(从0开始计数);
  3. 计算350在300~400之间增加了多少比例,也就是frac。计算过程为frac = (350 - 300)/(400 - 300) = 0.5
  4. 寻找索引8在查表值数组中的数值,[-32 -25 -19 -11 -4 0 4 11 19 25 32]中的第8个应该是19;
  5. 查出的数值再加上增量乘以比例值frac,计算如下:out = 19 + 0.5*(25 - 19) = 22;

以上就是上文配置的线性内插的过程。外插的方法比较简单,这里就不再描述。

3 代码生成

将前文的模型替换成inport和ouport如下:
在这里插入图片描述
Ctrl + B生成代码:
在这里插入图片描述
上图可以看出,查表模块封装成一个函数look1_iflf_binlcapw,传入断点、输入值、查表值等参数,在step函数内调用。

look1_iflf_binlcapw内的实现,与上一节的分析过程相同。
在这里插入图片描述

4 总结

本文研究了查表模块的使用和代码生成。该模块在汽车软件开发中是很常用的,很好的处理了很多非线性关系。

>>返回个人博客总目录

### QEMU设备树配置教程及相关解决方案 #### 什么是QEMU中的设备树? 设备树(Device Tree)是一种描述硬件的数据结构,主要用于无固件系统的初始化阶段。通过设备树,操作系统可以动态识别并加载所需的驱动程序,而无需硬编码具体的硬件信息。对于QEMU而言,支持设备树使得开发者能够在模拟环境中测试和验证基于ARM或其他架构的目标系统。 在QEMU中使用设备树时,通常会涉及以下几个方面的工作: - 编辑`.dts`文件以定义硬件布局。 - 使用工具编译`.dts`文件生成二进制形式的`.dtb`文件。 - 将生成的`.dtb`文件传递给QEMU作为启动参数之一[^1]。 #### 如何编辑设备树源文件(DTS) 设备树源文件采用一种类似于C语言的语法书写,以下是创建或修改设备树的一些基本指导原则: ```c /dts-v1/; /plugin/; / { compatible = "example,device"; model = "Example Device"; cpus { cpu@0 { device_type = "cpu"; compatible = "arm,cortex-a9"; reg = <0>; }; }; memory@80000000 { device_type = "memory"; reg = <0x80000000 0x4000000>; /* 起始地址和大小 */ }; chosen { bootargs = "root=/dev/mmcblk0p2 rw console=ttyS0,115200 earlyprintk"; }; }; ``` 上述代码片段展示了如何声明CPU节点以及内存区域,并设置了引导参数以便于调试操作系统的启动过程[^2]。 #### DTS到DTB转换流程 完成`.dts`文件编写之后,需要将其转化为可被QEMU解析的形式——即`.dtb`(Device Tree Blob) 文件。此步骤可以通过命令行工具 `dtc` 实现: ```bash $ dtc -I dts -O dtb -o example.dtb example.dts ``` 这里 `-I dts` 表明输入格式为 `.dts`, 同样地 `-O dtb` 则指定了输出为目标格式 `.dtb`. #### 在QEMU中指定设备树 一旦拥有了有效的`.dtb`文件,在调用QEMU仿真器的时候便可通过如下方式引入该文件: ```bash qemu-system-arm \ -M vexpress-a9 \ -kernel zImage \ -dtb example.dtb \ -nographic \ -append "console=ttyAMA0 root=/dev/mmcblk0p2" ``` 以上命令行设置了一个VExpress A9板子模型,加载了Linux内核镜像(`zImage`) 和之前构建好的设备树 (`example.dtb`). 此外还关闭图形界面并将串口重定向至标准输出方便观察日志消息. #### Rust与嵌入式开发的关系及其优势 尽管当前讨论的重点在于传统意义上的Linux驱动开发,值得注意的是现代技术趋势下新兴的语言如Rust也开始进入这一领域。由于其安全性特性加上零成本抽象能力,Rust逐渐成为替代C/C++进行低级系统编程的一个强有力候选者。尤其当涉及到资源受限场景下的微控制器单元(MCU)项目或者更复杂的RTOS甚至裸机应用程序设计时,Rust展现出了极大的潜力[^3]. 综上所述,针对QEMU环境下关于设备树的具体实践已经有所阐述;同时提及到了未来可能影响整个行业的变革力量—Rust语言的应用前景。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chhttty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值