МИК32: Генератор пилообразных сигналов

Автор
avatar-alexevsalexevs
Notebook

Генерация кода для МИК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 формирует пилообразный сигнал в соответствии с заданной разрядностью результирующего числа, при достижении максимальной величины счётчик обнуляется и продолжает работу.

mik32_dac_model_2.png

Фазовый сдвиг сигнала для второго ЦАП организуется блоком 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.

mik32_dac_include.png

Более подробное описание принципов работы кода в блоках C Function дано в комментариях к коду.

Результаты моделирования

Для моделирования генератора пилообразных сигналов загрузим и запустим модель mik32_dac:

In [ ]:
# @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(модель);

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

In [ ]:
# @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)
Out[0]:

Как видно из полученных графиков, пилообразные сигналы моделируются с заданной амплитудой $N=2^{12}=4095$, сигнал для второго ЦАП передается с задержкой в 1024 отсчёта.

Генерация кода

Сгенерируем код из модели для последующей загрузки разработанного в модели алгоритма в микроконтроллер:

In [ ]:
# @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
[ Info: Generated code and artifacts: /user/start/examples/codegen/mik32_dac/code

Полученные в указанной папке файлы - заголовочный 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.

mik32_dac_platfotmio.png

После этого можно перейти к сборке проекта и загрузке программы.

Выполнение кода на МИК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.

osc1_2.png

Как видно из осциллограмм, графики пилообразных сигналов имеют максимальную амплитуду по напряжению (1.2 В), которая соответствует заданному уровню выходного сигнала (4095). Сигнал второго ЦАП имеет заданный фазовый сдвиг.

Заключение

В данном примере мы рассмотрели разработку модели Engee для программы генерации пилообразных сигналов с разрешением 12 бит и фиксированным фазовым сдвигом для микроконтроллера K1948ВК018 MIK32 Amur в составе отладочной платы MIK32 NUKE V0.3. Разработанная модель встроена сгенерированными файлами в проект среды PlatformIO для VS Code с последующей сборкой, загрузкой и исполнением на целевом устройстве.