Моделирование алгоритма 23550 в матлаб
Go to file
2025-01-18 20:41:38 +03:00
Inu #5 С двигателем не все гладко, но ПЧ запускается, напряжение без двигателя трехуровневное 2025-01-18 20:07:11 +03:00
.gitignore init2 2024-12-27 10:55:18 +03:00
allmex.m #5 С двигателем не все гладко, но ПЧ запускается, напряжение без двигателя трехуровневное 2025-01-18 20:07:11 +03:00
am_two_wind.mexw64 init 2024-12-27 10:50:32 +03:00
asynchronous_machine.p init 2024-12-27 10:50:32 +03:00
electr_mach.slx init 2024-12-27 10:50:32 +03:00
init.m #5 С двигателем не все гладко, но ПЧ запускается, напряжение без двигателя трехуровневное 2025-01-18 20:07:11 +03:00
inu_23550.slx Добавлены библиотеки DSP281x 2025-01-16 15:39:04 +03:00
README.md Обновить README.md 2025-01-18 20:41:38 +03:00

MATLAB 23550

СОДЕРЖАНИЕ

Общая структура симулятора

Код для компиляции S-Function лежит в папке Inu. В ней содержатся:

  • Оболочка МК (файлы в корне): код S-Function, который запускает код программы
  • Оболочка программы (app_wrapper): связывает программу и S-Function
  • Программа МК (Src): программа для симуляции
  • Симуляция плат (beta) (xilinx_wrapper): моделирует внешние платы (пока только ШИМ)

Далее приведена структура симулятора. Инструкция для портирования другого кода в MATLAB приведена ниже

Описание стуктуры симулятора

Здесь содержиться описание трех блоков симулятора:

Оболочка МК

В этой папке содержиться оболочка (англ. wrapper) для запуска и контроля симуляции микроконтроллеров в MATLAB (любого МК, не только TMS). Оболочка представляет собой S-Function - блок в Simulink, который работает по скомпилированому коду. Компиляция происходит с помощью MSVC-компилятора.

S-Function работает особым образом: на шаге n она запускает скомпилированный код и ждет пока этот код выполниться. Только когда завершается выполнение кода, S-Function переходит на следующий шаг n+1.

Но программа МК это бесконечный цикл, который никогда не завершается. Поэтому есть несколько особенностей в выполнении такого кода в виде S-Function:

  • Для симуляции создается отдельный поток для программы МК. Этот поток запускается в начале текущего шага симуляции, выполняется какое-то время, а потом приостанавливается. Это позволяет коду S-Function завершиться и перейти на следующий шаг.
  • Необходимо закрыть поток программы МК в конце симуляции. Для этого используется особый дефайн для while. Этот дефайн помимо условия while, проверяет условие окончания симуляции. И если симуляцию надо завершить, все бесконечные циклы while() пропускаются и поток доходит до конца функции main() и завершает себя.

Всего оболочка содержит 4 файла:

  • mcu_wrapper.c - код, который запускает код МК и симулирует периферию. В нем содержаться функции для запуска/остановки потока программы МК, считывании входов и запись входов S-Function.
  • MCU.c          - код для компиляции S-Function в MATLAB. Вызывает функции из mcu_wrapper.c
  • mcu_wrapper_conf.h - общий для mcu_wrapper.c и MCU.c заголовочный файл. Содержит настройки для блока S-Function, а также дефайны для управления потоком программы МК.
  • run_mex.bat       - скрипт для компиляции кода компилятором MSVC. В нем прописываются пути для заголовочных файлов .h, указываются файлы исходного кода .c и прописываются дефайны для компиляции.

Конфигурации оболочки:

  • RUN_APP_MAIN_FUNC_THREAD - создание и запуск отдельного потока для main()
  • DEKSTOP_CYCLES_FOR_MCU_APP - количество циклов пустого for(;;), в течении которого будет работать поток main()
  • MCU_CORE_CLOCK - частота симулируемого процессора (пока нигде не используется)
  • IN_PORT_WIDTH - размерность входного вектора S-Function
  • IN_PORT_NUMB - количество входных векторов S-Function
  • OUT_PORT_WIDTH - размерность выходного вектора S-Function
  • OUT_PORT_NUMB - количество выходных векторов S-Function

Note: дефайн RUN_APP_MAIN_FUNC_THREAD пока выключен и поток для main() не используется)

Note for future: разные вектора можно использовать для разных плат

Оболочка программы

Оболочка для программы позволяет имитировать реальный алгоритм программы. Она инициализирует её, запускает необходимые для её работы функции и связывает её с входами/выходами S-Function

Ниже приведен перечень всех файлов и краткое описание зачем они нужны:

  • app_includes.h - Содержит ARM дефайны для компиляции в MSVC.
  • app_init.c/.h - инициализация программы
  • app_io.c/.h        - запись/считывание входов/выходов S-Function в программу
  • app_wrapper.c/.h      - вызов функций из программы и создание заглушек для ненужных функций
  • def.h - дефайны для симуляции программы в симулинке (осталось от улитковского)

Также в папке \app_wrapper\device_support находяться стандартные библиотеки для TMS, но переделанные под компилятор MSVC (удален volatile, добавлены заглушки для interrupt, asm, cregister, добавлен код для симуляции IQlib).

Код пользователя

Данная папка содержит исходный код приложения МК. При этом стандартные библиотеки, которые общие для всех проектов следует помещать в папку с оболочкой программы. Чтобы не редактировать исходники общих библиотек в каждом проекте.

Симуляция плат

Модули в этой папке моделируют внешние платы. Пока более-менее сделан только ШИМ, но в будущем планируется расширение и вывод их в отельные S-Function. Чтобы сделать подобие корзины.

adc_sim

adc_sim.c/.h - симуляция АЦП (пока просто заготовка)

pwm_sim

pwm_sim.c/.h - симуляция ШИМ Поддерживает два режимы формирования ШИМ:

  • для каждого таймера отдельно (PWM_SIMULATION_MODE_REGULAR_PWM)
  • через линии ТК для всей фазы разом (PWM_SIMULATION_MODE_TK_LINES).

Инструкция

Общий алгоритм портирования кода для симуляции в MATLAB приведен ниже. В инструкции есть ссылки на более подробное описание действий.

  1. Портировать код для MATLAB (можно начать с портирования без изменений и далее действовать от шага 2)
  2. Проверить компилируеться ли код. А далее:
    • если есть ошибки при компиляции, исправить их и вернуться на шаг 2.
    • если ошибок нет, перейти на шаг 3.
  3. Проверить нормально ли запускается и работает симуляция с МК. А далее:
    • если симуляции вылетает, то необходимо исправить ошибки в режиме отладки и вернуться на шаг 3.
    • если симуляция нормально запускается только один раз, и не завершается или не запускается второй раз, то необходимо исправить ошибки в режиме отладки и вернуться на шаг 3.
    • если симуляция работает, не вылетает и перезапускается, то перейти на шаг 4.
  4. Оценить результаты симуляции. А далее:
    • если симуляция сходится с реальностью - то всё работает корректно.
    • если нет - необходимо разбираться в алгоритме и после исправить его и перейти на шаг 2.

Портирование кода

Для начала необходимо весь пользовательский код портировать в отдельную папку для удобства. Например в "\Src".

Далее в "run_bat.mex" надо прописать пути для заголовочных файлов (\Includes) и все необходимые для симуляции программы исходники. Все файлы исходников ".c" прописывать не обязательно. Если нужно отладить какой-то отдельный модуль программы, можно попробовать ограничиться им, и при возникновении ошибок подключать новые исходники.

Как скомпилировать код

Для компиляции кода необходимо открыть файл mexing.m. Это MATLAB-скрипт, который запускает скрипт "run_bat.mex" для компиляции. Есть возможность компиляции кода для отладки

Как запустить отладку

Для отладки симуляции необходимо приписать в mexing.m в вызове run_mex.bat слово debug, тогда код скомпилируется для дебага. После этого необходимо открыть Visual Studio, открыть папку проекта (там должны быть все исходники программы и симулятора). И подключиться к MATLAB.exe.

Теперь можно поставить точку в исходном коде симулятора или программы МК и запустить симуляцию. Когда MATLAB дойдет до этого места, симуляция остановиться и в Visual Studio можно будет посмотреть все переменные, пройти код по строкам и в общем делать всё то, что можно делать в режиме отладки.

Для отладки необходимо сначала подключится к процессу, а потом уже запускать симуляцию. Также отладка рабоатет только один раз. При повторном запуске симуляции остановки не произойдет. Поэтому перед каждой отладкой надо перекомпилировать код.

Ошибки

Ошибки при компиляции

Самые распространеные ошибки компилятора при портировании нового кода - это ошибки из-за неподключенных исходных файлов. Для исправления ошибок необходимо подключить требуемые модули или создавать заглушки.

Также еще могут быть ошибки связанные с разными компиляторами и отсутствия ключевых слов в MSVC, например, ошибки с volatile, interrupt, asm... в библиотеках DPS. Для исправления ошибок надо или удалять эти ключевые слова или создавать для них заглушки-define

Ошибки при симуляции

Обычно это исключения при чтении по недоступному адресу. Надо выяснить на какой строке произошло исключение и смотреть по какому адресу произошла попытка чтения и по какому адресу надо на самом деле считывать. И после этого скорректировать код так, чтобы адрес брался корректный.

Это обычно неинициализированные указатели или некоторые функции (напр. ReadMemory/WriteMemory когда пытаются считать что-то по адрессам "несуществующей" шины)