2. Simulink基础操作:常用模块库介绍、信号线与总线、子系统与封装、模型配置参数
好,咱们正式开始动手了。这一章我带你熟悉Simulink的“家底”——那些你天天要打交道的模块、信号线,还有怎么把模型收拾得整整齐齐。说白了,就是让你从“能跑模型”进化到“会搭模型”。
2.1 常用模块库:你的工具箱
打开Simulink库浏览器(Ctrl+Shift+L),你会看到一堆分类。别慌,做电机控制,常用的其实就那几个抽屉。
2.1.1 连续与离散模块组
电机控制本质上是离散系统,所以我们主要跟离散模块打交道。我个人习惯把Discrete库里的Discrete PID Controller、Unit Delay、Discrete Derivative这几个拖到收藏夹。连续模块里,Integrator偶尔用在仿真电机本体模型时,但实际代码里很少用。
2.1.2 数学运算模块
这个太常用了。Add、Product、Gain、Saturation,这四个基本能解决80%的运算需求。尤其是Saturation,限幅用的,我在项目里吃过亏——有一次没加限幅,仿真时电流飙到1000A,吓得我以为板子烧了。
2.1.3 信号路由模块
Mux和Demux是打包和解包信号的。但说实话,我现在更推荐用Bus Creator和Bus Selector,因为总线能带名字,可读性强很多。你想想看,一堆信号用Mux捆在一起,过两天你自己都分不清哪根是哪根。
2.2 信号线与总线:别让线乱飞
搭模型最怕什么?线拉得跟蜘蛛网似的。我见过一个同事的模型,信号线绕了三个弯才连上,他自己都找不到起点。
2.2.1 信号线的基本操作
- 连线: 鼠标左键点住输出端口,拖到输入端口松开。
- 分支: 按住Ctrl键,在线上点一下拉出新线。
- 标标签: 双击线,输入名字。比如
Id_ref、Speed_fb。
为什么要标标签?嗯,调试的时候你就知道了。Scope里看波形,标签名直接显示在曲线上,一眼就知道哪个是哪个。
2.2.2 总线:把信号装进一个信封
总线就是把相关的信号打包在一起。比如电机控制里,电流反馈总线可以包含Ia、Ib、Ic三根线。
// 创建总线的步骤
1. 拖一个 Bus Creator 到画布
2. 把 Ia, Ib, Ic 三根线连进去
3. 双击 Bus Creator,给每个信号起个名字
4. 在接收端用 Bus Selector 拆包
Current,结果Bus Selector里选了其中一个,另一个也跟着变,排查了半天。
2.3 子系统与封装:让模型变整洁
模型一大,画布上几百个模块,看着就头疼。这时候就需要子系统了——把功能相关的模块装进一个框里。
2.3.1 创建子系统
选中你要打包的模块,右键 -> Create Subsystem。瞬间,一堆模块缩成了一个方块。双击进去,里面还是原来的内容。
我个人习惯把每个控制环路做成一个子系统:电流环、速度环、位置环。这样顶层模型看起来就像一张系统框图,特别清晰。
2.3.2 封装:给子系统加个“皮肤”
子系统默认是个灰色方块,不好看。封装(Mask)可以让你自定义图标、参数对话框,甚至加说明文档。
// 封装步骤
1. 右键子系统 -> Mask -> Create Mask
2. 在 Icon & Ports 标签页,输入绘图命令:
plot([0 1 0 0], [0 0 1 0])
这样图标上会画个三角形
3. 在 Parameters 标签页,添加一个参数叫 Kp
4. 在子系统内部,把增益模块的值改成 Kp
封装的好处是,别人用你的模块时,双击弹出参数设置框,不用去翻内部结构。我在公司里做了个FOC控制器的封装库,团队里其他人直接拖来用,参数调一调就行。
i、j这种,容易跟循环变量搞混。
2.4 模型配置参数:仿真前的最后一步
模型搭好了,点运行之前,一定要检查配置参数。不然仿真结果可能完全不对。
2.4.1 求解器设置
电机控制仿真,我一般用固定步长求解器,步长设成1e-4(100微秒)或1e-5。为什么?因为实际控制器就是固定周期运行的,用变步长仿真反而失真。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Solver | discrete (no continuous states) | 纯离散系统,没有连续状态 |
| Fixed-step size | 1e-4 | 步长越小越精确,但仿真越慢 |
| Stop time | 0.1 或 1.0 | 看你要观察多长时间 |
2.4.2 数据导入/导出
仿真完要看波形?在Data Import/Export里勾上Signal logging。这样你加的Scope信号都会自动保存到工作区,方便后续分析。
我记得有一次仿真结果异常,查了半天发现是Limit data points to last没勾掉,导致只保存了最后1000个点,前面的瞬态过程全丢了。嗯,这个小坑你注意一下。
2.4.3 代码生成相关
如果你最终要生成C代码(比如用Embedded Coder),那Code Generation标签页里要选对硬件。比如STM32就选ARM Compatible,TI的C2000选TI C2000。这个后面章节会细讲,这里先提一嘴。
Hardware Implementation的Device vendor选错了,结果生成的代码里中断优先级全乱套。所以,仿真前先确认目标硬件。
本章知识体系
下面这张图帮你理清本章的核心逻辑:从模块到信号,再到子系统和配置,一步步搭出专业模型。
好了,这一章的内容就这些。从模块库到信号线,再到子系统和配置,每一步都是你以后搭复杂模型的基础。别嫌啰嗦,这些基本功练扎实了,后面做FOC、无传感器控制才能得心应手。