Engee 文档
Notebook

为 MIK32 生成代码(照度计)

该演示介绍了基于光敏电阻的照度计的Engee模型的开发过程,以及代码生成和在MIK32 NUKE V0.3 调试板上的执行过程。

简介

本演示中使用的目标设备是基于 K1948VC018 MIK32 Amur 微控制器的 MIK32 NUKE V0.3 调试板。本例中开发的 Engee 模型使用控制器模数转换器 (ADC) 的模拟信号执行照度计算,并连接控制器外设。代码通过 VS CodePlatformIO 扩展编译并加载到微控制器中。

硬件部分

本示例中的照度测量使用 GL55 系列的 光敏电阻。ADC 输入信号是光敏电阻电路中限流电阻上的压降。在高照度下,光敏电阻 的电阻会减小,限流电阻 上的压降 会增大。电源电压电平等于 。元件连接图如下所示。

mik32_lux_plate.png

电路由调试板供电(引脚3V3,GND )。从电路接收到的模拟信号被送入微控制器的 ADC 4 (ADC1.4) 的P0.7 引脚。

型号说明

本例的模型是mik32_adc_lux.engee 。块C Function 用于连接和操作微控制器的外设。仿真时间块Clock 将电流仿真时间传输到块ADC4 ,以仿真仿真期间在电阻 上测得的压降。

mik32_lux_model.png

为了计算照度,模型包括一个计算光敏电阻电阻的子系统Get_LDR_Resistance 和一个近似一维函数illuminance_from_resistance

连接外围设备

为了与 MIC32 外围设备配合使用,该模型使用了以下模块C FunctionsystemClockConfig,EnableInterrupts,ADC4USART1_print 。每个模块都连接了 MIK32 HAL 库中相应外设的头文件。块EnableInterrupts 除其他外连接了具有中断处理功能的头文件,USART1_print 连接了将整数格式转换为字符串的标准 C 库的头文件stdlib.h
要连接的头文件包含在示例的include/ 目录中。下面是在块systemClockConfig 中连接 HAL 库头文件的示例。

mik32_lux_include.png

下表列出了C Function 块及其连接的 MIK32 HAL 库文件的分配信息。

| ** 块C Function** | ** 用途** | ** 要插入的头文件** | ** 文件夹
| :--------------------: | :----------- | :-----------: |
systemClockConfig | 初始化 HAL 库,配置时钟子系统和频率监控器 |mik32_hal.h | | | | | | | | | |
|EnableInterrupts | 启用硬件中断,连接中断处理 |mik32_hal_irq.h mik32_hal_adc_isr.h | |
|ADC4 | 设置 ADC 并获取新值 |mik32_hal_adc.h |
|USART1_print | 设置 USART 并向其发送信息 |mik32_hal_usart.h |

关于C Function 代码块中代码运行原理的更详细说明,请参阅代码注释。

照度计算

MIC32 内置的 ADC 具有 12 位数字容量,因此从 ADC 接收到的信号ADCvalue 取值范围为 [0, 4095]。如前所述,该信号对应于光敏电阻电路中限流电阻上的压降 ,范围为 [0, 1.2] V。在模型块Get_LDR_Resistance 中,根据该信号,光敏电阻 的电阻值按以下公式计算

根据接收到的信号Ohm ,块1-D Lookup Table illuminance_from_resistance 生成输出照度信号Lux 。由模块illuminance_from_resistance 参数化并连接照度和电阻的近似函数由以下几点决定:

In [ ]:
Освещенность = [4624,1895,1412,1129,929,773,646,538,445,363,290,223,162,107,55,7];
Сопротивление = [1,50,100,150,200,250,300,350,400,450,500,550,600,650,700,750];

using Plots, LaTeXStrings
gr( size = (400, 400), legend=:top, format=:svg )

plot(Сопротивление, Освещенность;
     label = L"Lux = f(R_{LDR})", marker = (:circle, 3, :blue),
     xaxis = ("Сопротивление фотодиода, Ом"), yaxis = ("Освещенность, Лк"))
Out[0]:

这些要点来自 GL55 系列光敏电阻器的数据表。

建模结果

模拟照度计 下载并运行 模型mik32_adc_lux.engee

In [ ]:
if "mik32_adc_lux" in [m.name for m in engee.get_all_models()]
    m = engee.open( "mik32_adc_lux" );
else
    m = engee.load( "$(@__DIR__)/mik32_adc_lux.engee" );
end

данные = engee.run(m);

根据获得的模拟数据绘制信号图:从 ADC(模拟正弦压降变化)获得的值和计算得出的照度。由于在程序块1-D Lookup Table 中选择了 "最接近 "的近似方法,因此计算结果中的照度将只取在程序块表格中输入的值。

In [ ]:
gr( size = (800, 300), legend=:top, format=:svg )
plot(данные["ADCvalue"].time, данные["ADCvalue"].value;
     label = "Данные АЦП", lw = 2)
plot!(данные["Lux"].time, данные["Lux"].value*4;
      label = "Освещенность, 4⋅лк", st = :step, lw = 2)
Out[0]:

从得到的图表中可以看出,ADC 信号的变化会导致计算出的照度信号发生相应的变化。

代码生成

从模型中生成代码,然后将模型中开发的算法加载到微控制器中:

In [ ]:
engee.generate_code( "$(@__DIR__)/mik32_adc_lux.engee",
                     "$(@__DIR__)/mik32_adc_lux_code")
[ Info: Generated code and artifacts: /user/testing_room/mik32_adc_lux/mik32_adc_lux_code

mik32_adc_lux_code 文件夹中创建的文件 - 头文件mik32_adc_lux.h 和源文件mik32_adc_lux.c 将在构建项目时继续使用。生成的主程序文件main.c 不会在项目中使用,而是在main.cpp 准备的开发环境中执行代码,该环境位于示例的根文件夹mik32_adc_lux 中。

在开发环境中准备项目

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

mik32_lux_platfotmio_2.png

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

在 MIK32 上执行代码

让我们将调试板 MIK32 NUKE V0.3 连接到计算机的 USB 端口,然后在 PlatformIO 中观察连接的设备。要正确识别调试板的连接,需要使用 USB 驱动程序。示例中使用的驱动程序是libusbK

连接成功后,开始构建项目:
"PLATFORMIO -> PROJECT TASKS -> mik32v2 -> General -> Build ".
如果没有编译错误,将编译好的代码加载到微控制器中:
"PLATFORMIO -> PROJECT TASKS -> mik32v2 -> General -> Upload ".

为了输出计算结果,我们使用 SerialPlot 程序中的图形生成器,该程序从串行端口接收数据。

mik32_lux_2.gif

当光电二极管上的光照度发生变化时(用手电筒照射或遮光),Lookup Table 模型块中与等级相适应的光照度值就会输出到串行端口。

结论

在本示例中,我们考虑在 K1948VK018 MIK32 Amur 微控制器(作为 MIK32 NUKE V0.3 调试板的一部分)上,根据 ADC 信号开发照度计算程序的 Engee 模型,并将获得的值输出到串行端口。开发的模型通过生成的文件嵌入到 VS CodePlatformIO 环境项目中,并在目标设备上进一步组装、加载和执行。

示例中使用的块