4、第一个实时模型:用Simulink创建电机模型,RTI生成代码,下载到SCALEXIO并运行

好,咱们直接动手。这一章,我会带你走完一个完整的闭环——从Simulink里画一个电机模型,到用RTI把它变成dSPACE能跑的代码,最后下载到SCALEXIO上,亲眼看看它是不是真的在实时跑。

说实话,我第一次做这个流程的时候,心里也没底。模型明明在电脑上仿真得好好的,一上硬件就各种报错。后来才发现,很多坑其实是可以提前避开的。今天我就把这些经验揉碎了讲给你听。

4.1 为什么选电机模型作为第一个例子?

电机模型在实时仿真里太常见了。你想想看,不管是做新能源汽车电控测试,还是工业伺服驱动验证,电机都是核心被控对象。而且电机模型本身不复杂——一个二阶系统加个反电动势,就能跑出像模像样的响应曲线。

我个人习惯用直流电机模型作为入门。原因很简单:参数少,物理意义清晰,调试起来不费劲。等你把这个跑通了,再换永磁同步电机或者异步电机,无非是多加几个方程的事。

4.2 在Simulink里搭建电机模型

打开Simulink,新建一个空白模型。咱们要搭的是一个他励直流电机的电枢回路模型,核心方程就两个:

电枢回路:Ua = Ra * Ia + La * dIa/dt + E
机械方程:Te - Tl = J * dω/dt + B * ω

其中E = Ke * ω,Te = Kt * Ia。这几个参数你肯定眼熟,我就不啰嗦了。

具体搭建步骤:

  1. 拖一个 Integrator 模块,用来积分电流变化率,得到电枢电流 Ia。
  2. 再拖一个 Integrator,积分转速变化率,得到机械角速度 ω。
  3. Gain 模块设置电阻 Ra、电感 La、转动惯量 J、阻尼系数 B。
  4. Constant 模块给定电枢电压 Ua 和负载转矩 Tl。
  5. Product 模块计算反电动势 E = Ke * ω 和电磁转矩 Te = Kt * Ia。

嗯,这里要注意:千万别把Ke和Kt搞混了。虽然数值上在SI单位制里相等,但物理意义完全不同。我在项目里见过有人直接用一个常数代替,结果模型在低速时对,高速时全错。

连线完成后,你的模型应该长这样:

[Ua] --> [求和] --> [1/(La*s+Ra)] --> [Ia] --> [Kt] --> [求和] --> [1/(J*s+B)] --> [ω]
        ↑                      ↓                              ↑
        [E] <-- [Ke] <-------- [ω]                           [Tl]

最后加几个 Scope 或者 To Workspace 模块,把 Ia 和 ω 引出来观察。

4.3 配置RTI,准备生成dSPACE代码

模型搭好了,接下来是关键一步——告诉Simulink,这个模型不是用来在电脑上仿真的,而是要跑到SCALEXIO上的。

你需要做这几件事:

  1. 安装RTI库:确保你的MATLAB里已经装好了dSPACE的RTI库。一般在安装dSPACE软件时会自动集成,但偶尔会有版本不匹配的问题。我遇到过最坑的一次,是MATLAB升级后RTI没跟着升,结果编译报了一堆莫名其妙的链接错误。

  2. 替换I/O模块:把模型里的 Constant 和 Scope 换成RTI对应的硬件接口模块。比如:

    • DS1103ADCDS2102DAC 模块来替代输入输出。
    • RTI Data Store 模块来在模型内部传递信号。

警告: 千万不要直接把Simulink标准I/O模块用在RTI模型里。它们不会生成硬件代码,只会让你的模型在编译时报错。我曾经有个学员,折腾了一下午没搞定,最后发现是Scope模块没换掉。

  1. 设置求解器:在Model Configuration Parameters里,把求解器设为 Fixed-step,步长根据你的实时任务需求来定。电机模型一般用 50μs 到 100μs 的步长就够用了。步长太小,CPU负担重;步长太大,模型精度不够。
参数 推荐值 说明
求解器类型 Fixed-step 实时仿真必须固定步长
步长 50e-6 ~ 100e-6 电机模型常用范围
求解器算法 ode4 (Runge-Kutta) 精度和稳定性均衡

4.4 生成代码并下载到SCALEXIO

配置完成后,点击 Build 按钮。RTI会自动做三件事:

  1. 把Simulink模型转换成C代码。
  2. 调用dSPACE的编译器,编译成可执行文件。
  3. 生成一个 .sdf 文件(系统描述文件),里面包含了模型的所有I/O映射和参数信息。

编译过程大概需要几十秒到几分钟,取决于模型复杂度。如果一切顺利,你会看到MATLAB命令行里出现 Build process completed successfully 的提示。

然后打开 ControlDesk,新建一个实验项目:

  • 加载刚才生成的 .sdf 文件。
  • 把模型里的变量(比如 Ua、Ia、ω)拖到仪表盘上。
  • 点击 Start 按钮,模型就开始在SCALEXIO上实时运行了。

小技巧: 我习惯在ControlDesk里同时放一个数值显示和一个示波器。数值显示看当前值,示波器看变化趋势。这样调试时一眼就能发现问题。

4.5 验证实时性——别被假象骗了

模型跑起来了,怎么知道它是不是真的在实时运行?

最简单的方法:在模型里加一个 计时器。比如用RTI的 Timer 模块,记录每个步长的实际执行时间。如果这个时间始终小于你设定的步长,那就说明实时性没问题。

具体做法:

  1. 在模型里插入一个 RTI Timer Start 模块,放在模型计算开始处。
  2. 再放一个 RTI Timer Stop 模块,放在模型计算结束处。
  3. 把Timer的输出接到一个DAC通道上,用示波器观察。

正常情况下,你会看到一个稳定的方波,宽度等于实际执行时间。如果这个宽度忽大忽小,甚至偶尔超过步长,那就说明模型超时了。

重点: 实时性验证不是一次性的。每次修改模型后,都要重新检查执行时间。我曾经在项目里加了一个复杂的查表模块,结果执行时间从60μs飙到了120μs,步长设的是100μs,直接导致任务超时。幸好及时发现,不然测试数据全废了。

4.6 常见问题与避坑指南

这一路走下来,你可能会遇到几个典型问题:

  • 编译报错:找不到RTI库
    检查MATLAB路径设置,确保RTI的安装目录在搜索路径里。有时候重装dSPACE软件能解决。

  • 下载后模型不运行
    看看SCALEXIO的电源指示灯是否正常。我遇到过好几次,机柜后面的电源线松了,折腾半天才发现。

  • 示波器显示波形异常
    可能是采样率设置不对。把ControlDesk里示波器的采样率调低一点,或者用硬件触发模式。

嗯,这一章的内容就到这里。你跟着做一遍,应该能跑通第一个实时模型。下一章我们会深入RTI的配置细节,讲讲怎么用I/O模块和中断来构建更复杂的实时系统。