3. Simulink模型基础:创建第一个电机控制模型、配置求解器与步长、添加RTI模块库、I/O模块的拖拽与配置

好,咱们正式开始动手了。前面两章聊了dSPACE的硬件和软件生态,可能你觉得有点虚。这一章,咱们直接打开Simulink,搭一个能跑的电机控制模型出来。

我个人习惯,学新东西一定要先跑通一个最简单的例子。哪怕只是让一个灯亮起来,也比看十页手册强。所以这一章的目标很明确:创建一个电机控制模型,配置好求解器,然后把RTI模块库用起来,最后把I/O模块拖进去配好。做完这些,你的dSPACE就算是真正“活”了。

3.1 创建第一个电机控制模型

打开MATLAB,在命令行敲 simulink,新建一个空白模型。嗯,这一步太基础了,但我见过有人卡在这里——其实你直接点工具栏上的“New”图标也行。

模型建好之后,我建议你先保存,取个名字比如 motor_control_demo.slx。为什么?因为dSPACE的RTI模块库加载之后,模型如果没保存,有时候会报一些莫名其妙的路径错误。这是我踩过的坑,先存一下省心。

接下来,咱们搭一个最简单的电机控制框架:

  • 一个正弦波信号源,模拟速度指令
  • 一个PI控制器,做闭环调节
  • 一个PWM生成模块,输出到电机
  • 一个电流采样模块,反馈回来

说白了,这就是个典型的“速度环”结构。你从Simulink的Library Browser里拖出这些模块就行。注意,这里的PI控制器我建议用离散域的,因为dSPACE是数字系统,连续域的在硬件上跑不了。

核心要点:模型里的所有模块,最终都要能转换成C代码。所以尽量用Simulink自带的“离散”模块,别用连续积分器。

3.2 配置求解器与步长

模型搭好了,接下来这一步很关键——求解器配置。很多人觉得求解器是仿真才用的东西,跑硬件就不管了。其实不是,dSPACE的实时系统同样需要你指定求解器类型和步长。

打开菜单 Simulation → Model Configuration Parameters,找到 Solver 选项卡。这里我直接说我的经验:

  • 求解器类型:选“Fixed-step”。变步长在实时系统里是灾难,因为每一步的计算时间不确定,硬件会跑飞。
  • 求解器方法:选“discrete (no continuous states)”。如果你的模型里没有连续状态,这个最干净。
  • 固定步长:设成100微秒(1e-4)。为什么是这个值?电机控制的电流环通常需要10kHz左右的更新率,100微秒正好对应10kHz。当然,如果你的硬件性能强,可以设到50微秒,但别低于20微秒,否则DS1103这种老平台会扛不住。

小技巧:我曾经在一个项目里把步长设成了10微秒,结果模型一跑就报“overrun”。后来查手册才发现,DS1103的ADC采样最快也要20微秒。你想想看,步长设得比硬件还快,那不是白搭吗?

配置好之后,点Apply。嗯,这里要注意,步长一旦确定,你模型里所有离散模块的采样时间都要跟它匹配。比如PI控制器的采样时间,最好也设成1e-4,或者它的整数倍。

3.3 添加RTI模块库

求解器配好了,接下来咱们把dSPACE的“灵魂”请进来——RTI模块库

在MATLAB命令行输入 rti,回车。你会看到一个专门的dSPACE模块库弹出来。如果你用的是DS1103,里面会有 DS1103 Master 之类的分类。我记得第一次看到这个库的时候,感觉就像打开了新世界的大门——原来硬件接口都封装成模块了,直接拖拽就行。

怎么添加到模型里?很简单:

  1. 从RTI库中找到你需要的模块,比如 DS1103ADC_C5(ADC采样模块)
  2. 直接拖到你的模型里
  3. 它会自动链接到dSPACE的硬件驱动

这里有个坑:RTI模块不能跟普通的Simulink模块随便混用。比如你拖了一个ADC模块,它的输出是硬件引脚上的真实电压值,单位是伏特。但你的PI控制器可能期望的是标幺值(pu)。所以中间要加一个比例转换模块,把伏特转成标幺。

警告:RTI模块库里的模块,双击打开后通常有一个“Base Address”或“Channel”参数。这个必须跟你硬件上的接线一致。我曾经有一次把ADC通道0和通道1搞反了,结果电流采样一直不对,查了整整一下午。

3.4 I/O模块的拖拽与配置

好,现在咱们来实际操作一下。假设你要用DS1103采集一个电流信号,然后输出PWM波控制电机。你需要拖拽以下I/O模块:

功能 模块名称 关键参数
电流采样 DS1103ADC_C5 Channel = 0, Range = ±10V
PWM输出 DS1103DAC_C1 Channel = 0, Output = ±10V
编码器输入 DS1103ENC_SETUP Resolution = 1024, Mode = Quadrature

拖拽的时候,我建议你按信号流向排列:左边放输入(ADC、ENC),中间放控制算法(PI、坐标变换),右边放输出(DAC、PWM)。这样模型看起来一目了然,调试的时候也方便。

配置模块时,双击打开,你会看到一堆参数。别慌,大部分保持默认就行。你需要改的只有:

  • 通道号:对应硬件上的物理引脚
  • 量程:比如ADC是±10V还是±5V,取决于你的传感器
  • 采样时间:一般设成跟步长一致,或者步长的整数倍

避坑指南:我曾经在配置PWM模块时,忘了设“Dead Time”(死区时间),结果上电一瞬间,上下桥臂直通,直接把MOSFET炸了。嗯,从那以后,我每次配PWM都会先检查死区时间,至少设成2微秒。

配置完成后,你的模型应该长这样:左边是ADC和编码器模块,中间是PI控制器和PWM生成逻辑,右边是DAC输出模块。信号线用不同颜色区分——红色表示模拟量,蓝色表示数字量,这是我个人的习惯,方便排查问题。

3.5 模型检查与保存

最后一步,检查模型有没有错误。在Simulink里按 Ctrl+D,或者点菜单 Simulation → Update Diagram。如果没有任何报错,恭喜你,模型已经准备好了。

保存模型。注意,dSPACE的模型文件后缀是 .slx,跟普通Simulink模型一样。但建议你单独建一个文件夹,把模型、数据文件、脚本都放一起,方便管理。

这一章的内容就到这里。你可能会觉得,不就是拖几个模块、配几个参数吗?有什么难的?但说实话,我见过太多人卡在这些“简单”的步骤上。求解器步长设错了,模型跑不起来;I/O通道配反了,信号全乱套。所以,别嫌啰嗦,每一步都做扎实了,后面才能飞起来。

下一章,咱们会把这个模型编译成实时代码,然后下载到DS1103上,真正让电机转起来。到时候你会发现,前面这些基础工作,每一分钟都没白花。