
В умном доме всегда найдётся место, где можно применить моторизованные системы. Это регулируемые столы, автоматические двери, окна, электронные замки, лестничные подъёмники, калитки, ворота, жалюзи, маркизы, антенные позиционеры, ротаторы солнечных панелей и т. д.
Здесь представлен проект контроллера для четырёх двигателей постоянного тока, выполненный в основном с помощью кодогенерации GitHub Copilot в VS Code. Аппаратной основой является плата универсального контроллера двигателей MC80.
Плата может запускать каждый двигатель вперёд и назад с произвольной скоростью по заданному закону ускорения и замедления, без толчков и рывков (что актуально для конвейерных линий, подъёмных механизмов и проч.). В данном проекте управление может быть локальное, ручное, с ПК или дистанционное по шине CAN. Но возможности платы этим не исчерпываются.
Быстродействия платы хватает, чтобы обеспечить частоту модуляции до 32 кГц для всех двигателей одновременно с работой алгоритмов управления скоростью и сетевым взаимодействием.
В параметрах можно задавать три профиля разгона и торможения индивидуально для каждого двигателя.

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

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





Интерфейсов у платы много, но новый микроконтроллер не хотелось делать в 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.

Набираем по полной программный стек включающий 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.

Вопросы компиляции и отладки.
Агенты отлично генерят код, но и парсят, и рефакторят 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
sergeyssv
Супер !