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。这几个参数你肯定眼熟,我就不啰嗦了。
具体搭建步骤:
- 拖一个 Integrator 模块,用来积分电流变化率,得到电枢电流 Ia。
- 再拖一个 Integrator,积分转速变化率,得到机械角速度 ω。
- 用 Gain 模块设置电阻 Ra、电感 La、转动惯量 J、阻尼系数 B。
- 用 Constant 模块给定电枢电压 Ua 和负载转矩 Tl。
- 用 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上的。
你需要做这几件事:
安装RTI库:确保你的MATLAB里已经装好了dSPACE的RTI库。一般在安装dSPACE软件时会自动集成,但偶尔会有版本不匹配的问题。我遇到过最坑的一次,是MATLAB升级后RTI没跟着升,结果编译报了一堆莫名其妙的链接错误。
替换I/O模块:把模型里的 Constant 和 Scope 换成RTI对应的硬件接口模块。比如:
- 用 DS1103ADC 或 DS2102DAC 模块来替代输入输出。
- 用 RTI Data Store 模块来在模型内部传递信号。
警告: 千万不要直接把Simulink标准I/O模块用在RTI模型里。它们不会生成硬件代码,只会让你的模型在编译时报错。我曾经有个学员,折腾了一下午没搞定,最后发现是Scope模块没换掉。
- 设置求解器:在Model Configuration Parameters里,把求解器设为 Fixed-step,步长根据你的实时任务需求来定。电机模型一般用 50μs 到 100μs 的步长就够用了。步长太小,CPU负担重;步长太大,模型精度不够。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 求解器类型 | Fixed-step | 实时仿真必须固定步长 |
| 步长 | 50e-6 ~ 100e-6 | 电机模型常用范围 |
| 求解器算法 | ode4 (Runge-Kutta) | 精度和稳定性均衡 |
4.4 生成代码并下载到SCALEXIO
配置完成后,点击 Build 按钮。RTI会自动做三件事:
- 把Simulink模型转换成C代码。
- 调用dSPACE的编译器,编译成可执行文件。
- 生成一个 .sdf 文件(系统描述文件),里面包含了模型的所有I/O映射和参数信息。
编译过程大概需要几十秒到几分钟,取决于模型复杂度。如果一切顺利,你会看到MATLAB命令行里出现 Build process completed successfully 的提示。
然后打开 ControlDesk,新建一个实验项目:
- 加载刚才生成的 .sdf 文件。
- 把模型里的变量(比如 Ua、Ia、ω)拖到仪表盘上。
- 点击 Start 按钮,模型就开始在SCALEXIO上实时运行了。
小技巧: 我习惯在ControlDesk里同时放一个数值显示和一个示波器。数值显示看当前值,示波器看变化趋势。这样调试时一眼就能发现问题。
4.5 验证实时性——别被假象骗了
模型跑起来了,怎么知道它是不是真的在实时运行?
最简单的方法:在模型里加一个 计时器。比如用RTI的 Timer 模块,记录每个步长的实际执行时间。如果这个时间始终小于你设定的步长,那就说明实时性没问题。
具体做法:
- 在模型里插入一个 RTI Timer Start 模块,放在模型计算开始处。
- 再放一个 RTI Timer Stop 模块,放在模型计算结束处。
- 把Timer的输出接到一个DAC通道上,用示波器观察。
正常情况下,你会看到一个稳定的方波,宽度等于实际执行时间。如果这个宽度忽大忽小,甚至偶尔超过步长,那就说明模型超时了。
重点: 实时性验证不是一次性的。每次修改模型后,都要重新检查执行时间。我曾经在项目里加了一个复杂的查表模块,结果执行时间从60μs飙到了120μs,步长设的是100μs,直接导致任务超时。幸好及时发现,不然测试数据全废了。
4.6 常见问题与避坑指南
这一路走下来,你可能会遇到几个典型问题:
编译报错:找不到RTI库
检查MATLAB路径设置,确保RTI的安装目录在搜索路径里。有时候重装dSPACE软件能解决。下载后模型不运行
看看SCALEXIO的电源指示灯是否正常。我遇到过好几次,机柜后面的电源线松了,折腾半天才发现。示波器显示波形异常
可能是采样率设置不对。把ControlDesk里示波器的采样率调低一点,或者用硬件触发模式。
嗯,这一章的内容就到这里。你跟着做一遍,应该能跑通第一个实时模型。下一章我们会深入RTI的配置细节,讲讲怎么用I/O模块和中断来构建更复杂的实时系统。