Files
motor_params/AD_Keil_Project/AD_docs/SIMULINK_INTEGRATION.md

4.3 KiB
Raw Blame History

Интеграция с Simulink

Где модель

Основная модель:

F:\set\workspace\setcorp\set506\AD\Inu_im_1wnd_3lvl\inu_im_1wnd_3lvl.slx

Версия для R2021b:

F:\set\workspace\setcorp\set506\AD\Inu_im_1wnd_3lvl\inu_im_1wnd_3lvl_r2021b.slx

Инструкция запуска модели находится в:

AD_Keil_Project\AD_docs\SIMULINK_MODEL_RUN_HELP.md

Что найдено

Артефакт Статус
Inu_im_1wnd_3lvl/inu_im_1wnd_3lvl.slx найден
Inu_im_1wnd_3lvl/inu_im_1wnd_3lvl_r2021b.slx найден
Inu_im_1wnd_3lvl/Inu/wrapper_inu.c найден
Inu_im_1wnd_3lvl/Inu/controller.c найден
сгенерированный ERT-код model.c/.h не найден

Сейчас Keil-проект не является прямой автогенерацией из Simulink. В нём сделан C-интерфейс, через который можно связать модель, хост или ручной код с измерениями и командами.

C-интерфейс

Файлы:

  • Core/Inc/simulink_interface.h;
  • Core/Src/simulink_interface.c;
  • Core/Inc/ad_parameter_identification.h;
  • Core/Src/ad_parameter_identification.c.

Основные функции:

void SimulinkInterface_Init(void);
void SimulinkInterface_SetMeasurements(const AD_Measurements_t *meas);
void SimulinkInterface_SetCommand(const AD_Command_t *command);
void SimulinkInterface_StepFast(void);
void SimulinkInterface_StepSlow(void);
void SimulinkInterface_PackTelemetry(void);

Команда от модели к MCU

Использовать SimulinkInterface_OutputBus_t.command:

typedef struct
{
    uint8_t enable;
    uint8_t test_mode;
    uint8_t reset_faults;
    uint16_t pwm_polarity_flags;
    uint16_t pwm_timing_mode;
    uint16_t motor_control_type;
    uint16_t rotation_ramp_time_ms;
    float pwm_duty_limit;
    float rotation_frequency_Hz;
    float rotation_modulation;
    float current_limit_A;
    float voltage_limit_V;
    float undervoltage_limit_V;
    float speed_limit_rpm;
    float temperature_limit_C;
} AD_Command_t;

Минимальные условия для силового режима:

  • enable = 1;
  • test_mode равен одному из режимов 1, 3, 6..14;
  • current_limit_A > 0;
  • voltage_limit_V > 0;
  • сборка с AD_PROJECT_POWER_TEST_ENABLE=1;
  • нет активной аварии.

Режимы для модели

Код Режим
0 AD_PARAM_ID_MODE_IDLE
1 AD_PARAM_ID_MODE_STATOR_RESISTANCE
2 AD_PARAM_ID_MODE_NO_LOAD_MAGNETIZING
3 AD_PARAM_ID_MODE_LOCKED_ROTOR_LEAKAGE
4 AD_PARAM_ID_MODE_INERTIA_FRICTION
5 AD_PARAM_ID_MODE_DATA_LOGGING
6 AD_PARAM_ID_MODE_PWM_TEST_UH
7 AD_PARAM_ID_MODE_PWM_TEST_UL
8 AD_PARAM_ID_MODE_PWM_TEST_VH
9 AD_PARAM_ID_MODE_PWM_TEST_VL
10 AD_PARAM_ID_MODE_PWM_TEST_WH
11 AD_PARAM_ID_MODE_PWM_TEST_WL
12 AD_PARAM_ID_MODE_PWM_TEST_ALL
13 AD_PARAM_ID_MODE_AUTO_IDENTIFICATION
14 AD_PARAM_ID_MODE_ROTATION_3HZ

Данные от MCU к модели

Использовать SimulinkInterface_InputBus_t:

  • measurements - токи, DC-звено, скорость, температура, время;
  • motor_parameters - оценённые параметры двигателя;
  • param_id_status - флаги состояния;
  • param_id_faults - флаги ошибок;
  • param_id_mode - фактический режим.

Результаты измерений считаются действительными только по motor_parameters.valid_mask.

Частоты вызова

В текущем Keil-проекте:

  • SimulinkInterface_StepFast() вызывается на каждой итерации AD_Project_Loop();
  • SimulinkInterface_StepSlow() вызывается раз в 10 мс.

Для настоящего привода быстрый шаг лучше переносить в прерывание ADC/PWM, но текущая реализация уже позволяет проверить каналы, телеметрию и начальные измерительные импульсы.