主要内容

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

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

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

概述

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

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

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

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

笔记

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

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

通过系统仿真验证行为

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

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

open_system (“rtwdemo_pmsmfoc_system”) out_system = sim(“rtwdemo_pmsmfoc_system”) rtwdemo_pmsmfoc_plotsignals (out_system.logsout)
out_system =仿真软件。SimulationOutput: logsout: [1x1 Simulink.SimulationData. log]数据集]SimulationMetadata: [1x1 Simulink.]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'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()错误= 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.2522e+03 AdcDriverUnitsToAmps: 0.0049 EncoderToMechanicalZeroOffsetRads: 0 PmsmPolePairs: 4 Simulink。CoderInfo StorageClass: 'ExportedGlobal'标识符:"对齐:-1

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

slbuild (“rtwdemo_pmsmfoc”
成功完成:rtwdemo_pmsmfoc的构建过程:构建总结已构建的顶级模型目标:模型操作重建原因================================================================================================ rtwdemo_pmsmfoc生成和编译的代码生成信息文件不存在。构建时间:0h 0m 51.795s

使用生成的报告检查生成的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比较输出端口相关的信号。

= 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)
=仿真软件。SimulationOutput: logsout: [1x1 Simulink.SimulationData. log]数据集]SimulationMetadata: [1x1 Simulink.]SimulationMetadata] ErrorMessage: [0x0 char]

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

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

创建公益诉讼实现

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

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

使用上述方法,为Spectrum Digital公司的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 API函数来响应数据。编写rtIOStreamOpen来执行一般的单板初始化,包括配置串口。

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

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

阶段3:用Simulink实现和测试连通性配置

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

  • 创建一个工具规格制作文件(target_tools.mk),它指定了编译器、链接器和存档程序的命令和选项。此生成文件包含在模板生成文件(target_tools.mk).

  • 创建一个模板makefile (ec_target.tmf),包括target_tools.mk

  • 确定可能与安装有关的参数,并将它们存储为MATLAB首选项。

  • 创建一个指定PIL实现何时有效的Simulink定制文件。

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

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

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

请注意,TI_F28xxx_SysSWDir首选项指向德州仪器提供的目录C2000实验套件应用软件sprc675.zip).这些文件不包含在嵌入式Coder中。

setpref (“examplePilF28335”“examplePilF28335Dir”fullfile (matlabroot“工具箱”“环球套票”“rtwdemos”“examplePilF28335”));setpref (“examplePilF28335”“CCSRootDir”“C: \ Program Files \德州仪器\ ccsv4”);setpref (“examplePilF28335”“TI_F28xxx_SysSWDir”“C: \ Program Files \德州仪器\ 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实现是有效的。定制文件指定哪些配置参数对应于有效的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模式模拟输出中减去normal模式模拟的输出,以验证它们在数值上是等价的:

取消注释下面的行以验证输出的数值等价性% 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 ();

结论

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

相关的话题

Baidu
map