Engee 文档
Notebook

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

本演示展示了双通道锯齿信号发生器Engee模型的开发,随后在MIK32nuke v0.3调试板上生成和执行代码。

导言

本演示中使用的目标设备是MIK32NUKE v0调试板。3基于微控制器*[K1948VK018MIK32Amur](https://mikron.ru/products/mikrokontrollery/mk32-amur /)。 在本例中开发的Engee模型中,产生锯齿波信号并将其传输到微控制器的数模转换器(Dac),而第二DAC的调制信号以固定的相移形成。 此外,控制器的外围也连接在模型中。 代码通过PlatformIO扩展从VS Code*编译并上传到微控制器。

模型描述

这个例子的模型 - mik32_dac.engee. 以下模块用于连接和使用微控制器的外围设备: C Function. 计数器块 Counter Free-Running 按照所得数的指定位深度产生锯齿信号,当达到最大值时,计数器复位为零并继续操作。

mik32_dac_model_2.png

用于第二DAC的信号的相移由块组织 Variable Integer Delay -它为存储的先前信号值设置最大缓冲区大小,并为输入设置传入值 d 定块中确定信号的固定相移。

连接外围设备

要使用MIC32外设,该模型使用以下模块 C Function: systemClockConfig, DAC12DAC13. 这些块有以下用途:

  • systemClockConfig -调整时钟子系统和微控制器的频率监视器;
  • DAC12 -初始化DAC1并在输出P1.12处生成输出值;
  • DAC13 -初始化DAC2并在输出P1.13处生成输出值。

微控制器的Dac基于两级6位电阻阵列,DAC的内部参考电压为1.2v,总位深为12位。

每个块 C FunctionMIK32HAL库中连接相应外设的头文件。 街区 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(модель);

为了应用的方便和清楚,在服务代码单元的示例中,使用[代码掩蔽]。 ячеек](https://engee.com/helpcenter/stable/ru/interactive-scripts/language_basics/code_cell_masks.html)。代码的下一个单元格会自动更新。

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]:

从得到的图中可以看出,锯齿波信号是用给定幅度建模的。 ,用于第二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 一个例子。

开发环境中的项目准备

构建项目并将其上传到目标设备的开发环境是Vs Code,带有PlatformIO附加组件。 在本示例中不考虑环境和连接配置,因为它们在ресурсах控制器的显影剂。
从示例目录中,我们将生成的文件传输到PlatformIO项目。, main.cpp, mik32_dac12_typedef.h mik32_dac13_typedef.h 和配置文件 platformio.ini.

mik32_dac_platfotmio.png

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

在MIC32上执行代码

将调试板MIK32NUKE V0.3连接到计算机的USB端口,之后我们可以在PlatformIO中观察连接的设备。 需要USB驱动程序才能正确识别此卡的连接。 示例使用驱动程序 libusbK.

成功激活后,我们将继续构建项目。:
"PLATFORMIO->项目任务->mik32v2->常规->构建"
如果没有构建错误,我们将编译后的代码上传到微控制器。:
"PLATFORMIO->项目任务->mik32v2->常规->上传"

要删除生成的引脚 P1.12P1.13 在本例中,使用数字PC示波器PcoScope2205A进行DAC信号的调试,将测量结果输出到*PicoScope7T&M;*软件。

osc1_2.png

从波形可以看出,锯齿波信号图具有最大电压幅度(1.2V),其对应于设定的输出信号电平(4095)。 第二DAC的信号具有预设相移。

结论

在本例中,我们回顾了Engee模型的开发,该模型用于为K1948VK018MIK32Amur微控制器生成分辨率为12位的锯齿信号和固定相移的程序,作为MIK32NUKE V0.3调试板的 开发的模型与Vs CodePlatformIO环境项目中生成的文件一起嵌入,然后在目标设备上组装,下载和执行。

示例中使用的块