4.3 KiB
4.3 KiB
Интеграция с 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, но текущая реализация уже позволяет проверить каналы, телеметрию и начальные измерительные импульсы.