3. 信号与系统基础:Simulink中的信号类型、常用信号源、数学运算模块、子系统创建

做电机控制仿真,说白了就是跟信号打交道。电流信号、转速信号、PWM脉冲……这些在Simulink里怎么表示?怎么生成?怎么运算?

这一章,我们就来把这些基础打牢。我个人习惯,在开始搭建电机模型之前,一定会先花半小时把信号类型和常用模块理清楚。磨刀不误砍柴工嘛。

3.1 Simulink中的信号类型

Simulink里的信号,不像我们平时说的“强电”、“弱电”那么复杂。它主要分两大类:标量信号和向量/矩阵信号。

  • 标量信号:就是一个数。比如一个恒定的转速给定值 1500 rpm,或者一个PID控制器输出的单路电压值。在信号线上,它显示为单线。
  • 向量/矩阵信号:是一组数。比如三相电流 [Ia, Ib, Ic],就是一个1x3的向量。在信号线上,它显示为粗线。

重要概念:Simulink中还有总线信号。它可以把不同类型的信号打包在一起,比如把“转速(标量)”和“三相电流(向量)”捆成一根总线。这在复杂系统里非常有用,能让模型看起来清爽很多。

我在项目中遇到过一个问题:刚开始用总线时,总忘记给总线里的信号命名,结果调试时根本不知道哪根线是哪根线。后来我养成了一个习惯——所有总线信号,必须显式命名。这个习惯帮我省了不少排查时间。

3.2 常用信号源模块

信号源,就是给模型提供“输入”的模块。电机控制里,最常用的就这几个:

模块名称 图标/路径 典型用途 我的一点经验
Constant Sources 库 提供固定数值,比如直流母线电压、目标转速 别小看它。我见过有人把常数直接写在Gain模块里,结果改参数时要到处找。用Constant模块,所有参数一目了然。
Step Sources 库 阶跃信号,测试系统的阶跃响应 调PID参数时,我习惯先用Step给一个转速阶跃,看超调量和调节时间。
Sine Wave Sources 库 正弦波,模拟交流电或注入谐波 做电流环带宽测试时,我会用Sine Wave作为电流给定,扫频分析。
Ramp Sources 库 斜坡信号,模拟缓慢变化的给定 电机启动时,用Ramp做软启动,比直接给Step要温柔得多。
Repeating Sequence Sources 库 自定义重复波形,比如三角波、锯齿波 做PWM调制时,载波就是高频三角波,这个模块正好用上。

小技巧:双击任意信号源模块,按 F1 键可以快速打开它的帮助文档。我刚开始学的时候,就是靠F1键一个个模块啃下来的。

3.3 数学运算模块

信号进来了,总得算一算。Simulink的数学运算模块,覆盖了从加减乘除到微积分、三角函数的所有需求。

3.4.1 基本运算

  • Add / Sum:加减法。可以设置输入个数和符号(+/-)。
  • Product / Divide:乘除法。支持标量和向量乘法。
  • Gain:比例增益。就是一个常数乘法器。电机控制里,电流采样系数、电压缩放系数,都用它。
  • Bias:加一个常数偏移。比如给传感器信号做零点校正。

3.4.2 高级运算

  • Integrator:积分器。PID控制器里的I项,就是它。注意,积分器有初始条件设置,仿真前一定要确认。
  • Derivative:微分器。PID里的D项。但实际项目中,我很少直接用Derivative,因为它对噪声太敏感了。我一般用传递函数 s/(T*s+1) 来近似微分,效果更稳。
  • Trigonometric Function:三角函数。Clark变换、Park变换里,sin和cos是常客。
  • Math Function:包括绝对值、取整、求模、指数、对数等。比如求电流矢量的幅值,就用 sqrt(u^2) 或者直接用这个模块的 magnitude 模式。

避坑指南:我曾经在做一个永磁同步电机的弱磁控制时,直接用Derivative模块对转速求导来计算加速度。结果仿真结果全是毛刺,根本没法看。后来换成带滤波的近似微分,问题才解决。所以,实际项目中慎用纯微分模块。

3.4 子系统创建

模型一复杂,满屏幕都是线和模块,谁也受不了。这时候就需要子系统出场了。

子系统,就是把一组相关的模块打包成一个“黑盒子”。它只通过输入输出端口与外界交互。这样做的好处太多了:

  • 层次化:顶层模型只显示几个子系统,逻辑清晰。
  • 模块化:一个子系统可以反复调用,比如一个“电流环PI控制器”子系统,可以在多个电机模型里复用。
  • 团队协作:不同工程师可以负责不同的子系统,最后再集成。

3.5.1 如何创建子系统?

有两种方法,都很简单:

  1. 自上而下:从Simulink库中拖一个 Subsystem 模块到模型里,然后双击进去,在里面搭建内容。
  2. 自下而上:选中你已经在模型里画好的一组模块,右键 -> Create Subsystem from Selection。Simulink会自动把它们打包,并生成对应的输入输出端口。

我个人更推荐第二种方法。先搭好功能,验证没问题了,再一键打包成子系统。这样不容易漏掉连接。

3.5.2 子系统的高级用法

  • 原子子系统 (Atomic Subsystem):强制子系统内的模块在一个任务步长内执行完毕。在生成代码时,它会被编译成一个独立的函数。这对于代码生成和实时仿真很重要。
  • 使能子系统 (Enabled Subsystem):只有外部使能信号为真时,子系统才执行。比如,只有在“启动”信号为1时,速度环才工作。
  • 触发子系统 (Triggered Subsystem):由外部信号的上升沿或下降沿触发执行一次。比如,在PWM载波周期开始时,触发一次电流采样和计算。

核心建议:从你开始搭建电机模型的第一天起,就养成使用子系统的习惯。哪怕只是一个简单的Clark变换,也把它做成子系统。相信我,当你的模型从几十个模块膨胀到几百个模块时,你会感谢这个习惯的。

3.5 本章知识体系总览

为了让你对本章内容有个整体印象,我画了一张图。它把信号类型、信号源、数学运算和子系统这四块内容串在了一起。

第3章:信号与系统基础 - 知识体系 信号类型 常用信号源 数学运算模块 子系统创建 核心逻辑说明: 1. 信号类型(标量/向量/总线)决定了信号线的粗细和连接规则。 2. 信号源(Constant/Step/Sine Wave等)为模型提供输入激励。 3. 数学运算模块(Gain/Integrator/Trig等)对信号进行变换和处理。 4. 子系统将上述元素打包,实现模块化、层次化的模型架构。 掌握这四块内容,你就具备了搭建电机控制模型的基本功。

嗯,这张图把本章的脉络理得很清楚了。信号类型是基础,信号源是输入,数学运算是处理,子系统是组织方式。四者缺一不可。