主要内容

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

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

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

概述

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

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

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

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

笔记

  • 在“通过系统仿真验证行为”一节中,系统仿真需要Simscape™Electrical。其他任务不需要它。

  • Texas Instruments™F28335 PIL实现是一种可以应用于几乎任何处理器的参考方法。但是,如果您希望直接使用此实现,则需要来自Texas Instruments™的额外支持文件、编译器和工具。金宝app您可以在本示例的“创建PIL实现并注册Simulink®”部分中找到有关这些内容的更多信息。金宝app本参考PIL实现不需要Embedded Coder®的德州仪器C2000™嵌入式目标特性,但鼓励C2000™用户使用德州仪器C2000支持包安装金宝app扩展浏览器

通过系统仿真验证行为

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

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

open_system (“rtwdemo_pmsmfoc_system”) out_system = sim(“rtwdemo_pmsmfoc_system”) rtwdemo_pmsmfoc_plotsignals (out_system.logsout)
out_system = 金宝appSimulink。SimulationOutput: logsout: [1x1 金宝appSimulink.SimulationData.]数据集]SimulationMetadata: [1x1 Simul金宝appink.]SimulationMetadata] ErrorMessage: [0x0 char]

图显示,电机是静止的,直到motor_on信号为真。然后电机在开环中旋转,直到检测到已知的位置,这是由编码器索引脉冲指示的。然后控制器转换到闭环操作,电机达到稳态速度。

探索模型架构

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

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

编辑(“rtwdemo_pmsmfoc_data.m”

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

open_system (rtwdemo_pmsmfoc_system /嵌入式处理器的

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

open_system (“rtwdemo_pmsmfoc”

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

open_system (“rtwdemo_pmsmfoc / Motor_Control”

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

open_system (“rtwdemo_pmsmfoc / Motor_Control / Field_Oriented_Controller”

速度控制器外部循环的执行是当前控制循环时间的倍数。您可以查看MATLAB®变量,其中指定这些采样时间:

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

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

流('高频率= %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。CoderInfo StorageClass: 'ExportedGlobal'标识符:"对齐:-1

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

slbuild (“rtwdemo_pmsmfoc”
###开始构建过程:rtwdemo_pmsmfoc成功完成构建过程:rtwdemo_pmsmfoc构建摘要顶级模型目标构建:模型动作重建原因================================================================================================ rtwdemo_pmsmfoc生成和编译的代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 59.217s

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

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

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

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

save_system (“rtwdemo_pmsmfoc”“rtwdemo_pmsmfoc_local.slx”) close_system (“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_value = out_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 struct]

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

set_param (“rtwdemo_pmsmfoc_local”...“LoadExternalInput”“上”...“ExternalInput””。Motor_on, in.command_type, in.command_value, in.sensors...“StopTime”“0.06”...“ZeroInternalMemoryAtStartup”“上”...“SimulationMode”“正常”) save_system (“rtwdemo_pmsmfoc_local.slx”

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

Out = sim(“rtwdemo_pmsmfoc_local”) controller_mode = out.logsout.getElement(“controller_mode”) . values;pwm_compare_ref = out.logsout.getElement(“pwm_compare”) . values;rtwdemo_pmsmfoc_plotpwmcompare (controller_mode pwm_compare_ref)
out = 金宝appSimulink。SimulationOutput: logsout: [1x1 金宝appSimulink.SimulationData.]数据集]SimulationMetadata: [1x1 Simul金宝appink.]SimulationMetadata] ErrorMessage: [0x0 char]

日志输出将被用作PIL测试的参考行为。

请注意,在每个时间步骤中,图中标注了关于控制器模式的信息。在解释执行概要信息时,此模式信息将非常有用。

创建PIL实现

在本节中,您将学习并使用一个示例PIL实现。您将从审查嵌入式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实现分三个阶段进行迭代开发。下面是对这些阶段以及在这些阶段中执行的任务的描述。在开发自己的PIL实现时,您可能会发现遵循类似的方法很有帮助

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

  • 安装CCSv4,验证CCSv4可以与F28335 eZdsp板连接。

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

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

  • 识别用于编译器、链接器和归档器的命令和选项,以便使用makefile构建应用程序。

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

第二阶段:用MATLAB®实现和测试嵌入式串行rtiostream和发射自动化

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

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

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

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

  • 创建一个连接性配置类来配置主机端串行通信,指定构建过程中应该包括来自rtiostream应用程序的哪些目标端代码文件,指定如何访问将用于收集分析数据的计时器,并集成调用DSS实用程序来启动嵌入式应用程序。

  • 创建工具规格制作文件(target_tools.mk),指定编译器、链接器和存档器的命令和选项。该生成文件包含在模板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).这些文件不包括在嵌入式Coder®。

setpref (“examplePilF28335”“examplePilF28335Dir”fullfile (matlabroot“工具箱”“环球套票”“rtwdemos”“examplePilF28335”));setpref (“examplePilF28335”“CCSRootDir”'C:\Program Files\Texas Instruments\ccsv4');setpref (“examplePilF28335”“TI_F28xxx_SysSWDir”'C:\Program Files\Texas Instruments\TI_F28xxx_SysSW');setpref (“examplePilF28335”“targetConfigFile”fullfile (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实现所需的硬件设备和模板makefile的设置。您可以修改控制器模型中的配置参数以匹配这些设置。这些更改可以在模型的Configuration Parameters对话框中以图形化的方式进行,或者如下所示以编程的方式进行。

set_param (“rtwdemo_pmsmfoc_local”...“ProdHWDeviceType”德州仪器- > C2000的...“TemplateMakefile”“ec_target.tmf”...“GenCodeOnly”“关闭”...“SimulationMode”“processor-in-the-loop(公益诉讼)

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

set_param (“rtwdemo_pmsmfoc_local”...“CodeExecutionProfiling”“上”...“CodeExecutionProfileVariable”“executionProfile”...“CodeProfilingSaveOptions”“AllData”);save_system (“rtwdemo_pmsmfoc_local.slx”

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

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

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

您可以运行模型并绘制PIL模拟结果。当您第一次启动模型时,Embedded Coder®将为算法生成代码,将算法代码与串行通信接口代码链接起来,构建嵌入式应用程序,将应用程序下载到板上,并开始对目标模拟。注意,在随后的PIL模拟过程中,只有在模型更改时才会重新生成代码。由于与串行通信接口相关的开销,PIL模拟可能比正常模式下的模型运行得慢。

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

%取消以下行注释以运行模拟并绘制结果% if exists ('slprj','dir'), rmdir('slprj','s');结束% out = sim('rtwdemo_pmsmfoc_local')% pwm_compare_pil = out.logsout.getElement('pwm_compare').Values;% rtwdemo_pmsmfoc_plotpwmcompare_pil(controller_mode, pwm_compare_pil, executionProfile)

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

%取消注释以验证输出的数值等价性% pilErrorWithRespectToReference = sum(abs(pwm_compare_pil.)数据- pwm_compare_pil.Data))
pilErrorWithRespectToReference =
0 0 0

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

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

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

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

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

rmpref (“examplePilF28335”);rmexamplePilF28335hooks ();

结论

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

相关的话题