Генерация кода для МИК32 (Генератор пилообразных сигналов)¶
В этом демонстрационном примере представлена разработка модели Engee для двухканального генератора пилообразных сигналов с последующей генерацией кода и выполнением на отладочной плате MIK32 NUKE V0.3.
Введение¶
Целевое устройство, используемое в этом демонстрационном примере - отладочная плата MIK32 NUKE V0.3 на базе микроконтроллера K1948ВК018 MIK32 Amur. В разрабатываемой в этом примере модели Engee осуществляется генерация пилообразных сигналов с передачей их на цифро-аналоговые преобразователи (ЦАП) микроконтроллера, при этом модулируемый сигнал второго ЦАП формируется с фиксированным фазовым сдвигом. Кроме того, в модели также подключается периферия контроллера. Компиляция и загрузка кода в микроконтроллер произведена из VS Code с расширением PlatformIO.
Описание модели¶
Модель этого примера - mik32_dac.engee
. Для подключения и работы с периферией микроконтроллера используются блоки C Function
. Блок счётчика Counter Free-Running
формирует пилообразный сигнал в соответствии с заданной разрядностью результирующего числа, при достижении максимальной величины счётчик обнуляется и продолжает работу.
Фазовый сдвиг сигнала для второго ЦАП организуется блоком Variable Integer Delay
- в нём задается максимальная величина буфера для сохраняемых предыдущих значений сигнала, а поступающее значение на вход d
от блока константы определяет фиксированный фазовый сдвиг сигнала.
Подключение периферии¶
Для работы с периферией МИК32 в модели используются следующие блоки C Function
: systemClockConfig
, DAC12
и DAC13
. Блоки имеют следующее назначение:
systemClockConfig
- настраивает подсистему тактирования и монитор частоты микроконтроллера;DAC12
- инициализирует ЦАП 1 и формирует выходное значение на выходе P1.12;DAC13
- инициализирует ЦАП 2 и формирует выходное значение на выходе P1.13.
ЦАП микроконтроллера основаны на двухкаскадных 6-битных резистивных матрицах, внутреннее опорное напряжение ЦАП - 1.2 В. Общая разрядность - 12 бит.
Каждый из блоков C Function
подключает заголовочный файл для соответствующей периферии из библиотеки MIK32 HAL. Блоки DAC12
и DAC13
помимо прочего подключают заголовочные файлы mik32_dac12_typedef.h
и mik32_dac13_typedef.h
для объявления имени структуры переменных ЦАП. Подключаемые заголовочные файлы содержатся в директории include/
примера. Ниже приведен пример подключения заголовочных файлов в блоке DAC12
.
Более подробное описание принципов работы кода в блоках C Function
дано в комментариях к коду.
Результаты моделирования¶
Для моделирования генератора пилообразных сигналов загрузим и запустим модель mik32_dac
:
# @markdown **Программное управление моделированием:**
# @markdown Требуется ввести только имя модели
имя_модели = "mik32_dac" # @param {type:"string"}
if имя_модели in [m.name for m in engee.get_all_models()]
модель = engee.open( имя_модели );
else
модель = engee.load( "$(@__DIR__)/"*имя_модели*".engee" );
end
данные = engee.run(модель);
Для удобства и наглядности применения в примере служебных ячеек кода используется маскирование кодовых ячеек. Следующая ячейка кода обновляется автоматически.
# @markdown **Построение графиков:**
# @markdown Библиотека Plots.jl, бэкэнд gr()
Формат = :svg # @param [":svg", ":png"] {type:"raw"}
gr(format = Формат)
Ширина = 900 # @param {type:"integer"}
Высота = 300 # @param {type:"integer"}
Сигнал_1 = "Saw" # @param {type:"string"}
Подпись_1 = "ЦАП 1" # @param {type:"string"}
Сигнал_2 = "ShiftSaw" # @param {type:"string"}
Подпись_2 = "ЦАП 2" # @param {type: "string"}
Расположение_подписей = :topleft # @param [":none", ":topleft", ":top", ":topright", ":left", ":right", ":bottomleft",":bottom",":bottomright", ":outerright", ":outerleft", ":outertop", ":outerbottom", ":outertopright", ":outertopleft", ":outerbottomright", :outerbottomleft] {type:"raw"}
Заголовок = "Сигналы ЦАП" # @param {type:"string"}
Подпись_X = "Время моделирования, с" # @param {type:"string"}
Подпись_Y = "Амплитуда сигнала" # @param {type:"string"}
plot(size = (Ширина, Высота), legend = Расположение_подписей, title=Заголовок, xlabel=Подпись_X, ylabel=Подпись_Y)
plot!(данные[Сигнал_1].time, данные[Сигнал_1].value;
label = Подпись_1, lw = 2)
plot!(данные[Сигнал_2].time, данные[Сигнал_2].value;
label = Подпись_2, st = :step, lw = 2)
Как видно из полученных графиков, пилообразные сигналы моделируются с заданной амплитудой $N=2^{12}=4095$, сигнал для второго ЦАП передается с задержкой в 1024 отсчёта.
Генерация кода¶
Сгенерируем код из модели для последующей загрузки разработанного в модели алгоритма в микроконтроллер:
# @markdown **Генерация кода:**
# @markdown Папка для результатов генерации кода будет создана в папке скрипта:
папка = "code" # @param {type:"string"}
# @markdown Генерация кода для подсистемы:
включить = false # @param {type:"boolean"}
if(включить)
подсистема = "" # @param {type:"string"}
engee.generate_code( "$(@__DIR__)/"*имя_модели*".engee", "$(@__DIR__)/"*папка;
subsystem_name = подсистема)
else
engee.generate_code( "$(@__DIR__)/"*имя_модели*".engee", "$(@__DIR__)/"*папка)
end
Полученные в указанной папке файлы - заголовочный mik32_dac.h
и исходный mik32_dac.c
мы и используем далее при сборке проекта. Сгенерированный файл основной программы main.c
в проекте использоваться не будет, для выполнения кода в среде разработки подготовлен main.cpp
, расположенной в корневой папке mik32_dac
примера.
Подготовка проекта в среде разработки¶
Среда разработки, через которую ведётся сборка проекта и его загрузка в целевое устройство - VS Code с надстройкой PlatformIO. Конфигурации среды и подключения в этом примере не рассматриваются, так как они подробно изложены на ресурсах) разработчика контроллера.
Из директории примера перенесём в проект PlatformIO сгенерированные файлы, main.cpp
, mik32_dac12_typedef.h
mik32_dac13_typedef.h
и файл конфигурации platformio.ini
.
После этого можно перейти к сборке проекта и загрузке программы.
Выполнение кода на МИК32¶
Подключим отладочную плату MIK32 NUKE V0.3 к USB-порту компьютера, после чего в PlatformIO можем наблюдать подключенное устройство. Для корректной идентификации подключения этой платы требуется USB драйвер. В примере используется драйвер libusbK
.
После успешного подключения перейдём к сборке проекта:
“PLATFORMIO -> PROJECT TASKS -> mik32v2 -> General -> Build”.
При отсутствии ошибок сборки загрузим скомпилированный код в микроконтроллер:
“PLATFORMIO -> PROJECT TASKS -> mik32v2 -> General -> Upload”.
Для снятия генерируемых на пинах P1.12
и P1.13
отладочной платы сигналах ЦАП в этом примере используется цифровой ПК-осциллограф PcoScope 2205A, результаты измерений выводятся в ПО PicoScope 7 T&M.
Как видно из осциллограмм, графики пилообразных сигналов имеют максимальную амплитуду по напряжению (1.2 В), которая соответствует заданному уровню выходного сигнала (4095). Сигнал второго ЦАП имеет заданный фазовый сдвиг.
Заключение¶
В данном примере мы рассмотрели разработку модели Engee для программы генерации пилообразных сигналов с разрешением 12 бит и фиксированным фазовым сдвигом для микроконтроллера K1948ВК018 MIK32 Amur в составе отладочной платы MIK32 NUKE V0.3. Разработанная модель встроена сгенерированными файлами в проект среды PlatformIO для VS Code с последующей сборкой, загрузкой и исполнением на целевом устройстве.