主要内容

永磁同步电机的磁场定向控制

这个例子展示了从电机控制算法生成C代码的基本工作流和关键api,以及验证其编译行为和执行时间。当您将C代码与与电机硬件接口的嵌入式软件集成时,您将使用Processor-in-the-loop (PIL)模拟,以获得C代码将按预期执行的信心。尽管该工作流为特定的处理器使用电机控制应用程序,但您实际上可以将该工作流应用于任何应用程序或处理器。

我们用一个永磁同步电机的磁场定向控制算法来说明这个工作流程。这种控制技术在混合动力汽车、制造机械和工业自动化的电机驱动系统中很常见。

概述

在本例中,从控制算法模型生成和验证C代码,您可以将其与附加的嵌入式软件集成到电机硬件接口。

您将使用仿真环境建模和验证闭环电机控制系统的行为。一旦控制系统行为符合规范,您将从控制器模型生成C代码。在检查代码之后,您将使用在循环中的处理器(PIL)测试来评估其功能行为和执行时间。

为了方便PIL测试,您将选择测试信号来锻炼控制器模型并建立参考输出。您将查看德克萨斯仪器™F28335处理器的PIL实现示例,该处理器通过串行连接与主机上的Simulink®通信。金宝app您可以使用这个示例作为起点,为您自己的处理器创建PIL实现。您将在PIL模式下运行控制器模型,以测量执行时间,并根据模拟参考输出验证在嵌入式处理器上运行的代码的执行行为。

在嵌入式处理器的最终实现中,您将将生成的控制器C代码与附加的嵌入式软件集成在一起,例如外设和中断,这些软件需要与电机硬件进行接口。

笔记

  • 模拟风景™ “通过系统模拟验证行为”一节中的系统模拟需要电气设备。其他任务不需要电气设备。

  • Texas Instruments™F28335 PIL实现是一种参考方法,可以应用于几乎任何处理器。然而,如果您希望直接使用此实现,您将需要来自Texas Instruments™的额外支持文件、编译器和工具。金宝app你可以在本例的“创建PIL实施和注册与Simulink®”部分找到更多信息。金宝app这个参考PIL实现不需要Embedded Coder®的德州仪器C2000™Embedded Target特性,但鼓励C2000™用户使用德克萨斯仪器C2000支持包金宝app扩展浏览器

通过系统仿真验证行为

在本节中,您将在闭环系统仿真中验证控制器。

系统模型测试台由测试输入、嵌入式处理器、电力电子和电机硬件以及可视化组成。您可以使用系统模型来运行控制器并探索其预期行为。您可以使用以下命令来执行模型并绘制记录的信号。

开放式系统(“rtwdemo_pmsmfoc_system”) out_system = sim(“rtwdemo_pmsmfoc_system”)rtwdemo\u pmsmfoc\u绘图仪信号(out\u system.logsout)
out_system =仿金宝app真软件。Simulink.SimulationData. simulat金宝appiondata . simulationdata . simulationdata . simulationdata . simulationdata . simulationdata . simulationdata . simulationdata。Simulink. Simulink数据集金宝appSimulationMetadata]错误信息:[0x0 char]

图中显示电机是静止的,直到摩托信号是正确的。电机然后在一个开环旋转,直到一个已知的位置被检测到,这是由编码器指数脉冲指示的。然后控制器切换到闭环运行,电机达到稳态速度。

探索模型架构

在本节中,您将探索模型体系结构,包括如何指定数据、如何将控制器从测试台中分区以及如何调度控制器。该体系结构有利于系统模拟、算法代码生成和PIL测试。

数据定义文件创建仿真和代码生成所需的MATLAB®数据。文件中自动运行该数据文件PreLoadFcn系统测试台模型的回调。

编辑(“rtwdemo_pmsmfoc_data.m”

在系统测试平台模型中,嵌入式处理器被建模为外设和控制器软件的组合。

开放式系统(rtwdemo_pmsmfoc_system /嵌入式处理器的

控制器软件由单独的型号指定。在这个模型中,Mode_Scheduler子系统使用statflow®来调度Motor_Control算法的不同运行模式。

开放式系统(“rtwdemo_pmsmfoc”

在Motor_Control子系统中,传感器信号被转换为工程单元,并传递给核心控制器算法。控制器算法计算电压。然后将电压转换为驱动器信号。

开放式系统(“rtwdemo_pmsmfoc / Motor_Control”

主控制律是一种面向场的控制器。控制器有一个低速率的外环控制速度,和一个高速率的内环控制电流。

开放式系统(“rtwdemo_pmsmfoc / Motor_Control / Field_Oriented_Controller”

速度控制器外回路以当前控制回路时间的倍数执行。您可以查看指定这些采样时间的MATLAB®变量:

流('高速率采样时间= %f秒\n'ctrlConst.TsHi)流('低速率采样时间=%f秒\n'ctrlConst.TsLo)
高速率采样时间=0.000040秒低速率采样时间=0.005000秒

注意,控制器算法的最高速率是25khz。

流('高频频率= %5.0f Hz\n'1 / ctrlConst.TsHi)
高频率= 25000 Hz

生成控制器C代码以集成到嵌入式应用程序中

在本节中,您将生成并可视化地检查控制器的C代码函数。

为了简化集成,将控制器模型配置为单任务模式,以便可以使用一个函数调用来调用生成的代码。这个函数处理较低和较高的速率。生成的控制器函数必须在高速率采样时间执行。

函数原型在模型配置参数中指定,输入和输出端口作为参数传递。可以查看控制器算法的功能规格。

mdlFcn = RTW.getFunctionSpecification (“rtwdemo_pmsmfoc”);disp (mdlFcn.getPreview (“init”) disp (mdlFcn.getPreview (“步骤”))
Controller_Init () error = Controller (motor_on, command_type, current_request, * sensors, * pwm_compare)

通过在生成的代码中使用全局结构,可以访问面向字段的控制器的比例增益和积分增益。该全局结构在数据定义文件中指定。

disp (ctrlParams.Value) disp (ctrlParams.CoderInfo)
Current_P: 10 Current_I: 10000 Velocity_P: 0.0050 Velocity_I: 0.0150 Position_P: 0.1000 Position_I: 0.6000 StartupAcceleration: 1 StartupCurrent: 0.2000 RampToStopVelocity: 20 AdcZeroOffsetDriverUnits: 2.2523e+03 AdcDriverUnitsToAmps: 0.0049 EncoderToMechanicalZeroOffsetRads: 0 PmsmPolePairs: 4 金宝appSimulink。标识符:“对齐:-1

您可以从模型生成C代码,如下所示。

slbuild (“rtwdemo_pmsmfoc”
### Starting build procedure for: rtwdemo_pmsmfoc模型重建行动的原因  ================================================================================================ rtwdemo_pmsmfoc代码生成和编译代码生成信息文件不存在。建造时间:0小时0米59.217秒

使用生成的报告检查生成的C代码文件,并验证生成了正确的步骤和初始化函数。还要验证参数结构是否被创建为全局变量。

建立控制器模型的参考行为

在本节中,您将建立测试输入和参考输出,以帮助验证PIL测试期间的行为和概要文件执行时间。您将创建控制器模型的本地副本,然后加载一组测试输入信号,这些信号在控制器中执行不同的模式。然后,您将配置控制器模型,将这些记录的信号附加到输入端口,执行控制器模型,并将输出端口信号记录到工作空间。

用于建立参考行为和测试环境的控制器模型的配置参数将会改变,如下所述。用于指定控制器模型的设计和生成产品代码的块和参数将不会改变。但是,为了避免修改已安装控制器模型的任何部分,请保存模型并将其名称更改为rtwdemo_pmsmfoc_local.slx

save_system (“rtwdemo_pmsmfoc”“rtwdemo\u pmsmfoc\u local.slx”)封闭系统(“rtwdemo_pmsmfoc_system”, 0);close_system (“rtwdemo_pmsmfoc”, 0);
在slmsgviewer.renameTab上omCallMethod失败

要分析执行时间,请选择一组将在控制器内执行相关路径的测试输入。获取这些测试输入和参考输出的一种方法是从系统仿真模型中记录它们。

在。motor_on = out_system.logsout.getElement (“motor_on”) . values;in.command_type = out_system.logsout.getElement (“command_type”).Values;in.command\u value=out\u system.logsout.getElement(“command_value”) . values;在。传感器= out_system.logsout.getElement (“传感器”) . values;显示(在)
In = struct with fields: motor_on: [1×1 timeseries] command_type: [1×1 timeseries] command_value: [1×1 timeseries] sensors: [1×1结构]

这些信号现在可以连接到输入端口并导入到控制器模型中,这样它就可以直接独立于系统模型执行了。这种方法的优点是控制器模型可以作为独立组件进行测试和验证,从而促进重用和与其他系统模型或闭环测试平台的集成。为了详细阐述或准备控制器模型进行测试,可以在MATLAB®工作空间中更改其配置参数以附加输入信号和日志信号。这些更改可以在模型的Configuration Parameters对话框中图形化地进行,也可以通过编程方式进行,如下所示。

设置参数(“rtwdemo_pmsmfoc_local”...“加载外部输入”“上”...“ExternalInput””。Motor_on, in.command_type, in.command_value, in.sensors'...“StopTime”“0.06”...“ZeroInternalMemoryAtStartup”“上”...“SimulationMode”“正常”)保存系统(“rtwdemo\u pmsmfoc\u local.slx”

现在可以执行控制器模型,并绘制与PWM比较输出端口相关联的信号。

= sim卡(“rtwdemo_pmsmfoc_local”) controller_mode = out. logout . getelement (“controller_mode”) . values;pwm_compare_ref = out.logsout.getElement (“pwm_compare”) . values;rtwdemo_pmsmfoc_plotpwmcompare (controller_mode pwm_compare_ref)
=仿真软件。金宝appSimulink.SimulationData. simulat金宝appiondata . simulationdata . simulationdata . simulationdata . simulationdata . simulationdata . simulationdata . simulationdata。Simulink. Simulink数据集金宝appSimulationMetadata]错误信息:[0x0 char]

记录的输出将作为PIL测试的参考行为。

注意,这个图在每个时间步骤中都注释了关于控制器模式的信息。该模式信息在解释执行分析信息时非常有用。

创建公益诉讼实现

在本节中,您将学习并使用一个PIL实现示例。您将从回顾Embedded Coder®的先决帮助文档开始。然后,您将复制示例PIL实现到您的本地目录,并使用Simulink®注册它。金宝app您将回顾用于开发PIL实施的方法,并可以探索相关文件以获得额外的见解。如果您使用的是Spectrum Digital Inc. eZdsp F28335板与Code Composer v4和串行连接,您将能够配置此PIL实现直接与控制器模型工作。如果您使用不同的处理器,您可以使用这个PIL实现作为起点来创建您自己的实现。

创建自定义PIL实现的基础描述在为Simulink创建PIL目标连接配置金宝app.在PIL测试期间,您应该熟悉使用rtiostream API来促进Simulink®(主机端)和嵌入式处理器(目标端)之间的通信的基本概念。金宝app请注意,Embedded Coder®提供了用于默认TCP/IP实现的主机端驱动程序(适用于Simulink®支持的所有平台),以及用于串行通信的Windows®专用版本。金宝app金宝app生成的代码是使用makefile完成的,如自定义模板生成文件.要创建PIL实现,您需要在嵌入式环境中执行几个任务,包括编写目标端通信驱动程序,编写makefile来构建生成的代码,以及自动下载和执行构建的可执行文件。

使用上述方法,为Spectrum Digital Inc. eZdsp F28335板创建了PIL实现。下面是在此实现中使用的目标连接性API组件的摘要。

  • Host-Side沟通—主机端连接驱动配置为使用串口通信。

  • 目标端通信-目标端通信是使用手写的串行实现的rtiostream功能和定时器访问功能。

  • 构建过程-使用基于makefile的方法来构建可执行应用程序。

  • 发射器-使用Code Composer Studio™v4 (CCSv4)的调试服务器脚本(DSS)工具下载和运行可执行文件。

公益诉讼的实施经过三个阶段的迭代发展。下面是对这些阶段和在这些阶段中执行的任务的描述。您可能会发现,在开发自己的PIL实现时,遵循类似的方法是有帮助的

阶段1:用CCSv4创建串行通信应用程序

  • 安装CCSv4,确认CCSv4能够与F28335 eZdsp板连接。

  • 编写一个发送和接收串行数据的嵌入式应用程序。

  • 测试上位机与嵌入式应用程序之间的串行通信。

  • 确定编译器、链接器和archiver使用makefile构建应用程序的命令和选项。

  • 使用DSS实用程序从Windows®命令提示符下载并运行应用程序。

第二阶段:使用MATLAB®实现和测试嵌入式串行流并启动自动化

  • 扩展串行应用程序,以实现rtiostream API函数,用于返回数据。编写rtIOStreamOpen来执行通用板初始化,包括配置串口。

  • 使用rtiostream_wrapper函数验证MATLAB®中的嵌入式处理器发送和接收串行数据。

  • 从MATLAB®下载并运行应用程序,使用系统命令调用DSS实用程序。

阶段3:使用Simulink®实现和测试连接性配置金宝app

  • 创建一个连接配置串行通信问题吗?看看交换机配置日志类,指定目标端代码文件从rtiostream应用程序应该包括在构建过程中,指定如何访问一个定时器,用于收集分析数据,调用DSS和集成工具启动嵌入式应用程序。

  • 创建工具规范生成文件(target_tools.mk)它指定编译器、链接器和archiver的命令和选项。此makefile包含在模板makefile中(target_tools.mk).

  • 创建一个模板生成文件(ec_target.tmf),包括target_tools.mk

  • 识别可能依赖于安装的参数,并将其存储为MATLAB®首选项。

  • 创建一个Simul金宝appink®定制文件,指定PIL实施何时有效

与此PIL实现相关的文件包含在Embedded Coder®中,但不在MATLAB®路径上。要浏览这些文件,可以将它们复制到本地目录中。您可以通过将此目录添加到MATLAB®路径并刷新Simulink®自定义设置来注册此PIL实现。金宝app

%拷贝文件(fullfile (matlabroot,“工具箱”,“环球套票”、“rtwdemos”,“examplePilF28335”),“examplePilF28335”,“f”)目录(genpath (fullfile (matlabroot,“工具箱”“环球套票”“rtwdemos”“examplePilF28335”))) sl_refresh_customizations

MATLAB®首选项用于指定路径信息和主机串口COM端口号。如果您直接使用此PIL实现,则必须根据您的配置指定这些首选项。

请注意,TI_F28xxx_SysSWDir首选项指向Texas Instruments提供的目录™ 在他们的C2000™实验者工具包应用软件sprc675.zip).这些文件不包括在嵌入式编码器®。

setpref (“examplePilF28335”'示例PILF2835DIR',完整文件(matlabroot,“工具箱”“环球套票”“rtwdemos”“examplePilF28335”));setpref (“examplePilF28335”“CCSRootDir”“C: \ Program Files \德州仪器\ ccsv4”);setpref (“examplePilF28335”“TI_F28xxx_SysSWDir”“C: \ Program Files \德州仪器\ TI_F28xxx_SysSW”);setpref (“examplePilF28335”“targetConfigFile”,完整文件(matlabroot,“工具箱”“环球套票”“rtwdemos”“examplePilF28335”“f28335_ezdsp.ccxml”));setpref (“examplePilF28335”“波特率”, 115200);setpref (“examplePilF28335”“cpuClockRateMHz”, 150); setpref(“examplePilF28335”“boardConfigPLL”10);setpref (“examplePilF28335”“相称”“COM4为”);

PIL的执行现在已经准备好可以使用了。

为PIL测试准备控制器模型

在本节中,您将配置控制器模型以使用PIL实现。您将查看用于注册PIL实现的定制文件,设置模型的配置参数以使用PIL实现,并启用日志控制器输出和执行分析数据。

当您开始在PIL模式下的模拟时,Simulink®将检查是否有任何注册PIL实现是金宝app有效的。定制文件指定哪些配置参数对应一个有效的PIL实现。您可以通过调用以下命令来探索此实现的定制文件。

编辑(fullfile (matlabroot,“工具箱”“环球套票”“rtwdemos”“examplePilF28335”“sl_customization.m”));

请注意,此文件指定了使用此PIL实现所需的硬件设备和模板生成文件的设置。您可以修改控制器模型中的配置参数以匹配这些设置。这些更改可以在模型的“配置参数”对话框中以图形方式进行,也可以以编程方式进行,如图所示在下面

设置参数(“rtwdemo_pmsmfoc_local”...“ProdHWDeviceType”德州仪器- > C2000的...“TemplateMakefile”“ec_target.tmf”...“GenCodeOnly”“关”...“SimulationMode”'循环中的处理器(pil)'

您可以在PIL测试期间通过将模拟输出值记录为变量来指定收集执行分析信息pilOut并将执行分析信息记录为变量executionProfile.这些更改可以在模型的Configuration Parameters对话框中图形化地进行,也可以通过编程方式进行,如下所示。

设置参数(“rtwdemo_pmsmfoc_local”...“CodeExecutionProfiling”“上”...“CodeExecutionProfileVariable”“executionProfile”...“CodeProfilingSaveOptions”“AllData”);save_system (“rtwdemo\u pmsmfoc\u local.slx”

控制器模型现在可以在PIL模式下运行了。

测试生成代码的行为和执行时间

在本节中,您将在PIL模式下运行控制器模型,并探索行为和执行分析结果。您将验证已编译控制器代码的行为是否与参考模拟行为相匹配,然后验证代码的执行是否满足时间要求。

您可以运行模型并绘制PIL模拟结果。当您第一次启动模型时,Embedded Coder®将生成算法代码,将算法代码与串行通信接口代码链接,构建嵌入式应用程序,将应用程序下载到板上,并开始目标模拟。请注意,dur在后续的PIL模拟中,仅当模型发生变化时才会重新生成代码。由于串行通信接口相关的开销,PIL模拟的运行速度可能比正常模式下的模型慢。

下面的MATLAB®命令被故意注释掉,因为它们需要连接到硬件和使用前面描述的嵌入式开发工具。如果您已经连接了硬件并安装了嵌入式开发工具,那么取消注释并执行这些行来运行模型,绘制结果,并验证行为在数值上与在正常模式下运行的模拟是等价的。否则,继续回顾本节学习PIL执行分析选项。

%取消注释下面的行以运行模拟并绘制结果%如果存在('slprj','dir'), rmdir('slprj','s');结束% out = sim('rtwdemo_pmsmfoc_local')% pwm_compare_pil = out.logsout.getElement('pwm_compare').Values;%rtwdemo\U pmsmfoc\U plotpwmcompare\U pil(控制器模式、pwm\U比较\U pil、执行配置文件)

上面的图是控制器的输出,PWM比较。请注意,PIL模式下的输出看起来与“为控制器模型建立参考行为”一节中所示的正常模式下的仿真输出是一样的。您可以从PIL模式模拟输出中减去正常模式模拟输出,以验证它们在数值上是等价的:

%取消下面一行的注释,以验证输出的数值等效性%PilErrorWithToReference=总和(abs(脉宽调制比较比较比较数据-脉宽调制比较比较比较比较数据))
pilErrorWithRespectToReference =
0 0 0

下图是在每个模拟时间步执行控制器模型所花费的时间量状态所需时间最少。由于控制器为多速率单任务,因此执行时间会出现小的周期性峰值。周期性峰值对应于在同一任务中运行基本速率和5毫秒速率代码所需的时间。

由于控制器必须在嵌入式处理器上以25khz的速度执行,算法必须在40微秒内完成执行(减去其他代码的额外净空要求,这些代码也可能在最终的应用程序上执行)。分析结果表明,算法将在分配给嵌入式环境配置的时间内执行。

生成的代码现在被验证为提供数值上等效的结果,并满足此测试用例的执行时间要求。

close_system (“rtwdemo_pmsmfoc_local”, 0);close_system (“power_utile”, 0);

在此PIL实现中使用的MATLAB®首选项在MATLAB®会话之间是持久的。如果您想删除这些首选项,请运行以下命令。

rmpref (“examplePilF28335”);rmexamplePilF28335hooks ();

结论

本示例展示了使用永磁同步电机磁场定向控制算法的系统级仿真和算法代码生成,以探索控制器算法的功能行为。本示例还展示了针对任何嵌入式处理器的目标集成、功能测试和执行评测的通用方法。一旦算法行为正确,从控制器模型生成代码,在目标处理器上测试并分析。现在验证算法代码,并可与与电机硬件接口的嵌入式软件集成,以进行进一步测试。

相关的话题