В умном доме всегда найдётся место, где можно применить моторизованные системы. Это регулируемые столы, автоматические двери, окна, электронные замки, лестничные подъёмники, калитки, ворота, жалюзи, маркизы, антенные позиционеры, ротаторы солнечных панелей и т. д.

Здесь представлен проект контроллера для четырёх двигателей постоянного тока, выполненный в основном с помощью кодогенерации GitHub Copilot в VS Code. Аппаратной основой является плата универсального контроллера двигателей MC80.

Плата может запускать каждый двигатель вперёд и назад с произвольной скоростью по заданному закону ускорения и замедления, без толчков и рывков (что актуально для конвейерных линий, подъёмных механизмов и проч.). В данном проекте управление может быть локальное, ручное, с ПК или дистанционное по шине CAN. Но возможности платы этим не исчерпываются.

Быстродействия платы хватает, чтобы обеспечить частоту модуляции до 32 кГц для всех двигателей одновременно с работой алгоритмов управления скоростью и сетевым взаимодействием.

В параметрах можно задавать три профиля разгона и торможения индивидуально для каждого двигателя.

Профиль с S-кривой обеспечивает отсутствие толчков, линейное нарастание обеспечивает меньший выброс тока. Об опасностях при управлении DC двигателями было в этой статье.

Схема подключения моторов
Схема подключения моторов

Как разрабатывалась плата, описано здесь.

Электрическая схема

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

Правда, она была сделана дедовским способом, без использования ИИ.

Верхний уровень архитектуры платы
Верхний уровень архитектуры платы
Микроконтроллер R7FA8M1AHECFB#AA0. Cortex-M85. 2M Flash, 1M RAM, 12K EEPROM,  480Mhz, 1.68 to 3.6 V, LQFP144 -4, -40℃ to +125℃
Микроконтроллер R7FA8M1AHECFB#AA0. Cortex-M85. 2M Flash, 1M RAM, 12K EEPROM, 480Mhz, 1.68 to 3.6 V, LQFP144 -4, -40℃ to +125℃
Периферийные узлы
Периферийные узлы
Подсистема питания и аналоговые мультиплексоры. Подключение двух идентичных подсистем драйверов двигателей.
Подсистема питания и аналоговые мультиплексоры. Подключение двух идентичных подсистем драйверов двигателей.
Одна из двух идентичных подсистем драйверов двигателей
Одна из двух идентичных подсистем драйверов двигателей

Интерфейсов у платы много, но новый микроконтроллер не хотелось делать в BGA, но и TQFP самый большой не хотелось ставить. Поэтому пришлось использовать расширители ввода-вывода и аналоговые мультиплексоры. Наблюдательный читатель может даже заметить, что ESP32 и SD-карта делят один интерфейс SDIO.

Схема драйверов моторов универсальная и может применяться и для DC-двигателей, и для BLDC (Brushless DC), и для PMSM (Permanent-Magnet Synchronous Motor) с сенсорным и бессенсорным управлением. На операционных усилителях U17, U18 собрана схема для измерения очень малых скоростей вращения, на которых обычные дискретные энкодеры плохо работают.

На плате есть и 3D-акселерометр с гироскопом на случай, если плата будет работать на движущихся платформах.

Экономия пинов микроконтроллера привела к тому, что на одной шине SPI висят дисплей, микросхемы драйверов моторов TMC6200 и расширитель ввода-вывода MCP23S17.

Важный нюанс — на плате нет узла гасителя обратной ЭДС, возникающей при торможении моторов. Поэтому надо учитывать, что при превышении напряжения уровня 33 В произойдёт пробой трансила D2. Работа совместно с аккумулятором обычно решает проблему перенапряжения, но испытания на стенде без аккумулятора должны проводиться с осторожностью.

Стенд для испытаний контроллера моторов.
Стенд для испытаний контроллера моторов.

С чего начинается разработка софта

Начинается она с базовой инициализации микроконтроллера в специальной среде Smart Configurator. Здесь пока ИИ применяем фрагментарно, просто чтобы объяснил про чип и терминологию. Smart Configurator от Renesas продолжает оставаться одним из лучших в отрасли. Ну потому собственно и были выбраны микроконтрооры серии RA8, а не какие-то скажем STM32.

Вид окна Smart Configurator
Вид окна Smart Configurator
Набираем по полной программный стек включающий Azure RTOS ThreadX с драйверами
  • Selected software components

        Custom Board Support Files  

    v5.8.0

        Arm CMSIS Version 6 - Core (M)  

    v6.1.0+fsp.5.8.0

        Board support package for R7FA8M1AHECFB  

    v5.8.0

        Board support package for RA8M1  

    v5.8.0

        Board support package for RA8M1 - FSP Data  

    v5.8.0

        Board support package for RA8M1 - Events  

    v5.8.0

        Azure RTOS ThreadX  

    v6.4.0+fsp.5.8.0

        Board Support Package Common Files  

    v5.8.0

        Asynchronous General Purpose Timer  

    v5.8.0

        Direct Memory Access Controller  

    v5.8.0

        Data Transfer Controller  

    v5.8.0

        Event Link Controller  

    v5.8.0

        Ethernet PHY  

    v5.8.0

        Ethernet  

    v5.8.0

        Flash Memory High Performance  

    v5.8.0

        I/O Port  

    v5.8.0

        Octa Serial Peripheral Interface Flash  

    v5.8.0

        Renesas Securyty IP on RA8 (RSIP7) Key Injection  

    v5.8.0

        Real Time Clock  

    v5.8.0

        Secure Cryptography Engine on RA8 (RSIP7) Compatibility Mode  

    v5.8.0

        SD/MMC Host Interface  

    v5.8.0

        Serial Peripheral Interface  

    v5.8.0

        USB Basic  

    v5.8.0

        FileX Block Media I/O Interface for RA  

    v5.8.0

        SD/MMC Memory Implementation  

    v5.8.0

        NetX Duo Ethernet Driver  

    v5.8.0

        NetX Secure Crypto H/W Acceleration  

    v5.8.0

        Azure RTOS ThreadX Port  

    v5.8.0

        Porting layer for USBX  

    v5.8.0

        LevelX NOR SPI Port  

    v5.8.0

        FileX LevelX NOR I/O Interface for RA  

    v5.8.0

        Azure RTOS FileX  

    v6.4.0+fsp.5.8.0

        Azure RTOS LevelX  

    v6.4.0+fsp.5.8.0

        Azure RTOS USBX PCDC  

    v6.4.0+fsp.5.8.0

        Azure RTOS NetX Duo  

    v6.4.0+renesas.0.fsp.5.8.0

        Azure RTOS NetX Crypto  

    v6.4.0+renesas.0.fsp.5.8.0

        Azure RTOS NetX Secure  

    v6.4.0+renesas.0.fsp.5.8.0

        Azure RTOS NetX FileX Servers  

    v6.4.0+renesas.0.fsp.5.8.0

        NetX Duo BSD Support  

    v6.4.0+renesas.0.fsp.5.8.0

        Controller Area Network - Flexible Data  

    v5.8.0

        USB Composite  

    v5.8.0

        Block Media RAM Implementation  

    v5.8.0

        Azure RTOS USBX PMSC  

    v6.4.0+fsp.5.8.0

От работы Smart Configurator нам достаются директории ra, ra_cfg, ra_gen со всеми исходниками промежуточного софта и драйверами. Не скажу, что процесс лёгкий. Приходится повозиться, пока подберёшь рабочую конфигурацию.

А с этого места мы перестаем писать код руками

Естественно, в Smart Configurator невозможно создать нормальный законченный продукт. В нём нет массы необходимых фичей. Эту массу я беру из своего фреймворка, который был представлен в репозитории контроллера MC50. Копипастим и начинаем рефакторинг в VS Code под новое API для FSP RA8M1.

Для удачной компиляции в VS Code надо поставить расширения GitHub Copilot и IAR Build. Если установлены расширения STM32Cube, их нужно отключить, поскольку они будут конфликтовать с расширением IAR и мешать нормально просматривать код.

Первое, чем надо заняться, берясь за работу с GitHub Copilot, — это создать подробный файл инструкций для агента. Мой файл здесь. От того, насколько ясно и непротиворечиво написан этот файл, зависит, как сильно будет «тупить» агент при итерациях написания и рефакторинга кода.
Лучшим агентом на данный момент безусловно является Claude Sonnet 4.

Новый способ создания базы данных параметров

Использование агентов сразу привело к значительным изменениям в подходе к организации базы данных параметров. Раньше я использовал базу данных MS Access из пакета MS Office 365. Это было довольно удобно, поскольку там хороший UI таблиц, позволяющий легко делать рефакторинг и генерацию исходников на C. Правда, ещё пришлось написать приложение на Delphi, чтобы сделать рефакторинг и ввод параметров ещё удобнее. В проекте MC50 это можно увидеть в директории ParametersGenerator.
Теперь же, когда агенты с лёгкостью понимают структуру базы в JSON и могут безошибочно её рефакторить, дополнять и удалять, стало удобнее держать базу в текстовом формате JSON.
База данных параметров для этого проекта находится в этом файле. Из него генерируются скриптами файлы MC80_Params.c и MC80_Params.h. Сами скрипты находятся здесь .
Главный скрипт этот - Generate_params_c_h_from_ParamsDB_txt.py
Помимо него есть скрипт Check_DB_format_field_consistency.py, проверяющий консистентность базы (мало ли агент ошибётся). Сами скрипты также написаны агентом Claude Sonnet 4.

Остаётся непонятным, помогает ли агенту дополнительное описание базы данных или он одинаково тратит время, что с описанием, что без, но на всякий случай я сделал агентам ещё и описание базы данных — ParamsDB_Schema_Description.md. И вставляю его в контекст при запросах.

Идея, как организовать управление параметрами по шине CAN.

Если управляем платой по шине CAN, то, естественно, хотим управлять по этой же шине и всеми параметрами. Но параметров достаточно много — как дать им идентификаторы? Перенумеровать? Но если постоянно рефакторим и в контроллере, и в управляющей системе, нумерация может перестать совпадать — можно просто забыть её обновить. А ещё может понадобиться оставить поддержку предыдущих версий наборов параметров. Нумерация быстро перестанет быть последовательной и консистентной.

И агент дал идею — применить хеши от названий переменных. И тут же дал скрипт. Теперь в сгенерированных .c файлах есть две таблицы с хэшами. Таблица param_hash_table предназначена для быстрого поиска индекса параметра по значению хэша при приеме пакетов, таблица param_index_to_hash_table предназначена для быстрого взятия хэша по индексу параметра при отправке пакетов. Хэши вычисляются из имени переменной взятием CRC16 от строки имени переменной. Там же есть функция быстрого бинарного поиска хэша в таблице.

Теперь в пакетах по CAN находятся не индексы параметров (которые могут различаться у центрального контроллера и у платы управления двигателями), а 16-битные хэши параметров. Коллизии хэшей не проверяются: вместо этого запускается скрипт Check_DB_format_field_consistency.py, который подтверждает отсутствие коллизий.

Первичная отладка в терминале

Агент написал мне пару отличных програмных модулей отладки в терминале через USB VCOM порт.
Во-первых, окно просмотра состояния задач RTOS:

Потом окно наблюдения за расходом динамической памяти:

И конечно, окно управления двигателями:

Терминал написать проще всего и он не требует особого софта на ПК. Но приходит время смотреть графики и тут в дело вступает FreeMaster.

FreeMaster для управления двигателями

Панель управления FreMaster является HTML страницей со специальным API к протоколу FreeMaster. Этот протокол не зависит от среды передачи и может работать как поверх COM, VCOM, так и через TCP/IP. И конечно, панель управления FreMaster тоже была написана агентом Claude Sonnet.

Окно панели управления FreeMaster
Окно панели управления FreeMaster

Вопросы компиляции и отладки.

Агенты отлично генерят код, но и парсят, и рефакторят XML — тоже на удивление хорошо. В директории проекта есть скрипт Populate_MC80_4DC_Proj_ewp.py. Он должен перекомпоновать файл рабочего пространства IAR, чтобы вставить туда новые исходники и убрать удалённые. Но агенты без проблем могут напрямую рефакторить файл рабочего пространства IAR без необходимости в дополнительных скриптах.

Однако от другого интересного скрипта — Make_R7FA8M1AH_SVD_MOD.py — отказываться не стоит. Этот скрипт берёт оригинальный файл описания регистров R7FA8M1AH.svd и преобразует его в R7FA8M1AH_mod.svd. В новом файле вместо ничего не значащих имён каналов прерываний IELx вставлены имена настоящих векторов прерываний, назначенных в проекте. В семействе RA8 нет фиксированных номеров векторов для прерываний от периферии, и векторы имеют просто безымянные номера, по которым они отображаются в тайм-лайне IAR C-Spy. Это крайне неудобно. А вот агент создал нам прекрасный скрипт, решающий эту проблему.

К сожалению работа трассировочного по движка через ETM в IAR для RA8 не реализована. Поэтому, чтобы запустить трассировку я применял отладчик Ozone от Segger. Для этого в проекте лежит файл Ozone.jdebug

Тем, у кого нет отладочного JTAG/SWD-адаптера, можно залить прошивку в микроконтроллер через USB с помощью бесплатной программы Renesas Flash Programmer. Но перед подачей питания нужно нажать и удерживать кнопку ручного энкодера на плате — микроконтроллер перейдёт в режим заводского загрузчика.

Весь проект располагается здесь - https://github.com/Indemsys/MC80_4DC

Комментарии (1)


  1. sergeyssv
    09.07.2025 15:44

    Супер !