为 MIC32 生成代码(锯齿波信号发生器)¶
该演示介绍了双通道锯齿波信号发生器的 Engee 模型的开发过程,以及代码生成和在 MIK32 NUKE V0.3 调试板上的执行过程。
简介¶
本演示中使用的目标设备是基于 K1948VC018 MIK32 Amur 微控制器的 MIK32 NUKE V0.3 调试板。本例中开发的Engee模型产生锯齿信号,并将其传输到微控制器的数模转换器(DAC),而第二个 DAC 的调制信号是以固定相移方式产生的。此外,模型中还连接了控制器的外设。将代码编译和加载到微控制器中是通过 VS Code 和 PlatformIO 扩展完成的。
模型描述¶
本示例的模型是mik32_dac.engee
。为了与微控制器的外围设备连接和工作,使用了块C Function
。计数器块Counter Free-Running
根据所产生数字的指定位数容量生成锯齿信号,当达到最大值时,计数器复位为零并继续运行。
第二个 DAC 的信号相移由块Variable Integer Delay
组织--它为存储的信号前值设置最大缓冲值,而从常数块输入d
的值则决定了信号的固定相移。
连接外设¶
为了与 MIC32 外围设备配合使用,该模型使用了以下模块C Function
:systemClockConfig
、DAC12
和DAC13
。这些模块的作用如下:
*systemClockConfig
- 设置微控制器的时钟子系统和频率监控器;
*DAC12
- 初始化 DAC 1 并在 P1.12 输出端生成输出值;
*DAC13
- 初始化 DAC 2 并在 P1.13 输出端生成输出值。
微控制器的 DAC 基于两级 6 位电阻矩阵,内部 DAC 基准电压为 1.2 V。总位数容量为 12 位。
每个块C Function
都连接了MIK32 HAL 库中相应外设的头文件。块DAC12
和DAC13
连接头文件mik32_dac12_typedef.h
和mik32_dac13_typedef.h
,以声明 DAC 变量结构的名称。可插入的头文件包含在示例的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$ 模拟的,第二个 DAC 的信号传输延迟为 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
中。
在开发环境中准备项目¶
用于构建项目并将其加载到目标设备的开发环境是带有 PlatformIO 附加组件的 VS Code。本示例不考虑环境配置和连接,因为控制器开发人员的 resources)有详细说明。
从示例目录中,将生成的文件main.cpp
,mik32_dac12_typedef.h
mik32_dac13_typedef.h
和配置文件platformio.ini
转移到 PlatformIO 项目。
之后,您就可以继续构建项目并加载程序了。
在 MIK32 上执行代码¶
让我们将调试板 MIK32 NUKE V0.3 连接到计算机的 USB 端口,然后在 PlatformIO 中观察连接的设备。要正确识别调试板的连接,需要使用 USB 驱动程序。示例中使用的驱动程序是libusbK
。
连接成功后,开始构建项目:
"PLATFORMIO -> PROJECT TASKS -> mik32v2 -> General -> Build ".
如果没有编译错误,将编译好的代码加载到微控制器中:
"PLATFORMIO -> PROJECT TASKS -> mik32v2 -> General -> Upload ".
在本示例中,使用数字 PC 示波器 PcoScope 2205A 捕捉调试板引脚P1.12
和P1.13
上产生的 DAC 信号,测量结果显示在 PicoScope 7 T&M 软件中。
从振荡图中可以看出,锯齿波信号图的电压振幅最大(1.2 V),与指定的输出信号电平(4095)相对应。第二个 DAC 的信号具有指定的相移。
结论¶
在本示例中,我们考虑为 K1948VK018 MIK32 Amur 微控制器(作为 MIK32 NUKE V0.3 调试板的一部分)开发 Engee 模型,用于生成具有 12 位分辨率和固定相移的锯齿信号。开发的模型通过生成的文件嵌入到 VS Code 的 PlatformIO 环境项目中,并在目标设备上进一步组装、加载和执行。