永磁同步电机的磁场定向控制
在此示例中,您将查看永磁同步电机 (PMSM) 的磁场定向控制 (FOC) 算法。您将使用闭环系统对测试控制算法进行仿真,然后为控制算法生成 HDL 代码。您还将了解如何指定可调参数数据,以及如何生成对应的 HDL 端口实体。
简介
该示例经过分区,以便您可以为控制算法生成代码,并使用仿真测试平台验证控制算法的行为。运行系统仿真测试平台模型 hdlcoderFocCurrentTestBench.slx 需要 Simscape™ Electrical™,但从控制算法模型 hdlcoderFocCurrentFixptHdl.slx 生成代码不需要它。
通过仿真验证行为
在此示例中,FOC 用于调节相电流以控制电机的扭矩。您可以对测试平台进行仿真来探索系统的行为。在仿真期间,当负载速度突然变化时,求解器可能会生成与过零相关的警告。您可以在仿真期间禁用这些警告。
hasSimPowerSystems = license ('test', 'Power_System_Blocks'); if hasSimPowerSystems open_system('hdlcoderFocCurrentTestBench') set_param('hdlcoderFocCurrentTestBench','IgnoredZcDiagnostic','none'); sim('hdlcoderFocCurrentTestBench') set_param('hdlcoderFocCurrentTestBench','IgnoredZcDiagnostic','warn'); end


示波器显示,系统请求了一个 1 安培的阶跃电流指令,并且负载速度在堵转(零)、+100 弧度/秒和 -100 弧度/秒之间变化。电流指令表示对非凸极 PMSM 的正交电流指令。(控制器将直流调节为零。)请注意,对于此电机和控制器,电磁转矩紧密跟随测得的电机正交电流。
浏览被控对象设定
在 Motor_And_Load 子系统中,您将看到被控组件的数学模型。逆变器的平均模型用于驱动 PMSM 的常量参数 dq 电压方程模型,该模型连接到速度负载。
if hasSimPowerSystems open_system('hdlcoderFocCurrentTestBench/Motor_And_Load') end

浏览控制算法设定
FOC 电流控制算法在单独的模型中指定。在控制算法中,使用克拉克和帕克变换将机器的电气方程从三相静止参考系投影到两相旋转参考系。这种方式通过消除时间和位置依赖关系而简化了控制。与仅使用克拉克逆变换的正弦输出相比,空间矢量调制使控制器能够在各相上实现更高的电压。
load_system('hdlcoderFocCurrentFixptHdl'); open_system('hdlcoderFocCurrentFixptHdl/FOC_Current_Control')

浏览数据设定
控制器和被控对象(即电机和负载)都引用 MATLAB 工作区中的数据。数据定义文件创建此数据,并在系统测试平台模型的 PreLoadFcn 回调中自动运行。
%edit('hdlcoderFocCurrentFixptHdlData.m') %
当您查看此文件时,请注意参数 paramCurrentControlP 和 paramCurrentControlI 指定为 Simulink.Parameters,其存储类设置为 ExportedGlobal。这会告诉 HDL Coder 为这些参数生成实体端口,而不是常量值。
为控制算法生成 HDL 代码
在生成 HDL 代码之前,确保模型遵循某些重要的 HDL 代码生成设置至关重要。以下是一些主要步骤:
创建一个 DUT 子系统:对于 HDL 代码生成,最好创建一个 DUT(在测设计)子系统,从中生成 HDL 代码。此子系统有若干用途,包括作为 HDL 优化设置的占位符。
为 HDL 进行设置:为了准备好进行 HDL 代码生成,必须设置某些求解器设置和模型设置。
hdlsetup命令负责所有这些设置,应在 HDL 代码生成之前运行该命令。
检查采样时间:应用 HDL 优化要求所有模块采样时间都被推断为离散。需要注意的主要模块类型是常量,默认情况下它们会推断 inf 采样时间。我们可以找到这些模块,并将其采样时间显式设置为
-1,以便它们获得正确的反向传播采样时间。
% You can generate and review the HDL code for the controller. makehdl('hdlcoderFocCurrentFixptHdl/FOC_Current_Control');
### Generating HDL for 'hdlcoderFocCurrentFixptHdl/FOC_Current_Control'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderFocCurrentFixptHdl', { 'HDL Code Generation' } )">hdlcoderFocCurrentFixptHdl</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderFocCurrentFixptHdl'.
### Begin compilation of the model 'hdlcoderFocCurrentFixptHdl'...
### Begin compilation of the model 'hdlcoderFocCurrentFixptHdl'...
### Working on the model 'hdlcoderFocCurrentFixptHdl'...
### Working on... <a href="matlab:configset.internal.open('hdlcoderFocCurrentFixptHdl', 'GenerateModel')">GenerateModel</a>
### Begin model generation 'gm_hdlcoderFocCurrentFixptHdl' ....
### Rendering DUT with optimization related changes (IO, Area, Pipelining)...
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('hdlsrc/hdlcoderFocCurrentFixptHdl/gm_hdlcoderFocCurrentFixptHdl_vnl')">gm_hdlcoderFocCurrentFixptHdl_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderFocCurrentFixptHdl'.
### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control/Clarke_Transform as hdlsrc/hdlcoderFocCurrentFixptHdl/Clarke_Transform.vhd.
### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control/Saturate_Output as hdlsrc/hdlcoderFocCurrentFixptHdl/Saturate_Output.vhd.
### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control/DQ_Current_Control/D_Current_Control as hdlsrc/hdlcoderFocCurrentFixptHdl/D_Current_Control.vhd.
### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control/DQ_Current_Control as hdlsrc/hdlcoderFocCurrentFixptHdl/DQ_Current_Control.vhd.
### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control/Inverse_Clarke_Transform as hdlsrc/hdlcoderFocCurrentFixptHdl/Inverse_Clarke_Transform.vhd.
### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control/Inverse_Park_Transform as hdlsrc/hdlcoderFocCurrentFixptHdl/Inverse_Park_Transform.vhd.
### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control/Park_Transform as hdlsrc/hdlcoderFocCurrentFixptHdl/Park_Transform.vhd.
### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control/Sine_Cosine/Sine_Cosine_LUT as hdlsrc/hdlcoderFocCurrentFixptHdl/Sine_Cosine_LUT.vhd.
### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control/Sine_Cosine as hdlsrc/hdlcoderFocCurrentFixptHdl/Sine_Cosine.vhd.
### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control/Space_Vector_Modulation as hdlsrc/hdlcoderFocCurrentFixptHdl/Space_Vector_Modulation.vhd.
### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control as hdlsrc/hdlcoderFocCurrentFixptHdl/FOC_Current_Control.vhd.
### Generating package file hdlsrc/hdlcoderFocCurrentFixptHdl/FOC_Current_Control_pkg.vhd.
### Code Generation for 'hdlcoderFocCurrentFixptHdl' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/home/amoses/Documents/MATLAB/ExampleManager/amoses.Bdoc23b.j2313133.field_example/hdlcoder-ex38994846/hdlsrc/hdlcoderFocCurrentFixptHdl/html/hdlcoderFocCurrentFixptHdl_codegen_rpt.html')">hdlcoderFocCurrentFixptHdl_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///home/amoses/Documents/MATLAB/ExampleManager/amoses.Bdoc23b.j2313133.field_example/hdlcoder-ex38994846/hdlsrc/hdlcoderFocCurrentFixptHdl/FOC_Current_Control_report.html
### HDL check for 'hdlcoderFocCurrentFixptHdl' complete with 0 errors, 1 warnings, and 0 messages.
### HDL code generation complete.
请注意,生成的 hdlcoderFocCurrentFixptHdl.vhd 文件中,实体具有 paramCurrentControlP 和 paramCurrentControlI 的端口。