Engee 文档
Notebook

为 MIC32 生成代码(锯齿波信号发生器)

该演示介绍了双通道锯齿波信号发生器的 Engee 模型的开发过程,以及代码生成和在 MIK32 NUKE V0.3 调试板上的执行过程。

简介

本演示中使用的目标设备是基于 K1948VC018 MIK32 Amur 微控制器的 MIK32 NUKE V0.3 调试板。本例中开发的Engee模型产生锯齿信号,并将其传输到微控制器的数模转换器(DAC),而第二个 DAC 的调制信号是以固定相移方式产生的。此外,模型中还连接了控制器的外设。将代码编译和加载到微控制器中是通过 VS CodePlatformIO 扩展完成的。

模型描述

本示例的模型是mik32_dac.engee 。为了与微控制器的外围设备连接和工作,使用了块C Function 。计数器块Counter Free-Running 根据所产生数字的指定位数容量生成锯齿信号,当达到最大值时,计数器复位为零并继续运行。

mik32_dac_model_2.png

第二个 DAC 的信号相移由块Variable Integer Delay 组织--它为存储的信号前值设置最大缓冲值,而从常数块输入d 的值则决定了信号的固定相移。

连接外设

为了与 MIC32 外围设备配合使用,该模型使用了以下模块C FunctionsystemClockConfigDAC12DAC13 。这些模块的作用如下: *systemClockConfig - 设置微控制器的时钟子系统和频率监控器; *DAC12 - 初始化 DAC 1 并在 P1.12 输出端生成输出值; *DAC13 - 初始化 DAC 2 并在 P1.13 输出端生成输出值。

微控制器的 DAC 基于两级 6 位电阻矩阵,内部 DAC 基准电压为 1.2 V。总位数容量为 12 位。

每个块C Function 都连接了MIK32 HAL 库中相应外设的头文件。块DAC12DAC13 连接头文件mik32_dac12_typedef.hmik32_dac13_typedef.h ,以声明 DAC 变量结构的名称。可插入的头文件包含在示例的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$ 模拟的,第二个 DAC 的信号传输延迟为 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 中。

在开发环境中准备项目

用于构建项目并将其加载到目标设备的开发环境是带有 PlatformIO 附加组件的 VS Code。本示例不考虑环境配置和连接,因为控制器开发人员的 resources)有详细说明。
从示例目录中,将生成的文件main.cpp,mik32_dac12_typedef.h mik32_dac13_typedef.h 和配置文件platformio.ini 转移到 PlatformIO 项目。

mik32_dac_platfotmio.png

之后,您就可以继续构建项目并加载程序了。

在 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.12P1.13 上产生的 DAC 信号,测量结果显示在 PicoScope 7 T&M 软件中。

osc1_2.png

从振荡图中可以看出,锯齿波信号图的电压振幅最大(1.2 V),与指定的输出信号电平(4095)相对应。第二个 DAC 的信号具有指定的相移。

结论

在本示例中,我们考虑为 K1948VK018 MIK32 Amur 微控制器(作为 MIK32 NUKE V0.3 调试板的一部分)开发 Engee 模型,用于生成具有 12 位分辨率和固定相移的锯齿信号。开发的模型通过生成的文件嵌入到 VS CodePlatformIO 环境项目中,并在目标设备上进一步组装、加载和执行。