В этом примере вы посмотрите алгоритм векторного управления (FOC) для синхронной машины с постоянными магнитами (PMSM). Вы протестируете алгоритм управления с системной симуляцией с обратным циклом, а затем сгенерируете HDL-код для алгоритма управления. Вы также увидите, как заданы настраиваемые параметры данные и как генерируются соответствующие сущности HDL-портов.
Пример разбит так, что можно сгенерировать код для алгоритма управления, а также проверить поведение алгоритма управления с помощью испытательного стенда симуляции. Simscape (TM) Electrical (TM) требуется для запуска системной симуляции тестовой модели hdlcoderFocCurrentTestBench.slx, но не требуется для генерации кода из модели алгоритма управления hdlcoderFocCurrentFixptHdl.slx.
В этом примере ФОК используется для регулирования тока фазы для управления крутящим моментом электрической машины. Можно симулировать испытательный стенд, чтобы исследовать поведение системы. Во время симуляции решатель может генерировать предупреждения, связанные с пересечением нуля, когда скоростная нагрузка резко изменяется. Можно отключить эти предупреждения во время симуляции.
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 Amp step current и изменяется скорость нагрузки между заблокированным ротором (нулем), + 100 рад/сек и -100 рад/сек. Текущая команда представляет квадратурную команду тока для нефлицентного PMSM. (Контроллер регулирует постоянный ток до нуля.) Обратите внимание, что для этого двигателя и контроллера электромагнитный крутящий момент тесно соответствует измеренному квадратурному току двигателя.
В Motor_And_Load подсистеме вы увидите математическую модель управляемых компонентов. Среднее значение модель инвертора используется для управления моделью уравнения постоянного параметра dq напряжения PMSM, которая соединяется с скоростью нагрузкой.
if hasSimPowerSystems open_system('hdlcoderFocCurrentTestBench/Motor_And_Load') end
Алгоритм управления током FOC задан в отдельной модели. В алгоритме управления электрические уравнения машины проецируются из трехфазной стационарной системы координат на двухфазную фазу вращающейся системы координат с помощью преобразований Кларка и Парка. Это упрощает управление путем удаления зависимостей времени и положения. Модуляция векторов Пространства позволяет контроллеру достичь большего напряжения на фазах, чем если бы использовались только синусоидальные выходы обратного преобразования Кларка.
load_system('hdlcoderFocCurrentFixptHdl'); open_system('hdlcoderFocCurrentFixptHdl/FOC_Current_Control')
И контроллер, и объект (т.е. двигатель и нагрузка) ссылаются на данные из рабочей области MATLAB ®. Файл определения данных создает эти данные и автоматически запускается в коллбэк PreLoadFcn системной тестовой модели.
edit('hdlcoderFocCurrentFixptHdlData.m')
При просмотре этого файла заметьте, что параметры param Current Control P и param Current Control I заданы как Simulink. Parameters, чей класс памяти установлен на 'Exported Global'. Это говорит HDL Coder генерировать порты сущностей для этих параметров вместо постоянных значений.
Перед генерацией HDL-кода важно убедиться, что модель соответствует определенным важным настройкам для генерации HDL-кода. Ниже приведены некоторые из основных шагов:
Создайте подсистему DUT: Для генерации HDL-кода всегда лучше создать подсистему DUT (Design Under Test), из которой генерируется HDL-код. Эта подсистема служит для нескольких целей, включая то, что она является держателем для настроек оптимизации HDL.
Setup для 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'... ### Applying HDL optimizations on the model 'hdlcoderFocCurrentFixptHdl'... ### Begin model generation. ### Model generation complete. ### Generating new validation model: <a href="matlab:open_system('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/Max/Max as hdlsrc/hdlcoderFocCurrentFixptHdl/Max.vhd. ### Working on hdlcoderFocCurrentFixptHdl/FOC_Current_Control/Space_Vector_Modulation/Min/Min as hdlsrc/hdlcoderFocCurrentFixptHdl/Min.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('/tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/hdlsrc/hdlcoderFocCurrentFixptHdl/html/hdlcoderFocCurrentFixptHdl_codegen_rpt.html');">hdlcoderFocCurrentFixptHdl_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples0/tp2ea99964/hdlsrc/hdlcoderFocCurrentFixptHdl/FOC_Current_Control_report.html ### HDL check for 'hdlcoderFocCurrentFixptHdl' complete with 0 errors, 0 warnings, and 0 messages. ### HDL code generation complete.
Заметьте в сгенерированном файле hdlcoder Foc Current Fixpt Hdl.vhd, что у сущности есть порты для param Current Control P и param Current Control I.