Engee 文档
Notebook

为 MIK32 生成代码(照度计)

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

简介

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

硬件部分

本示例中的照度测量使用 GL55 系列的 光敏电阻。ADC 输入信号是光敏电阻电路中限流电阻上的压降。在高照度下,光敏电阻$R_{LDR}$ 的电阻会减小,限流电阻$R_1 = 83\ Ом$ 上的压降$V_{R_1}$ 会增大。电源电压电平等于$V_{CC} = 3.3 В$ 。元件连接图如下所示。

mik32_lux_plate.png

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

型号说明

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

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]。如前所述,该信号对应于光敏电阻电路中限流电阻上的压降$V_{R_1}$ ,范围为 [0, 1.2] V。在模型块Get_LDR_Resistance 中,根据该信号,光敏电阻$R_{LDR}$ 的电阻值按以下公式计算

$$R_{LDR} = \left( \frac{V_{CC}}{V_{R_{1}}} - 1 \right ) \cdot R_1 = \left( \frac{11261}{V_{R_{1}}} - 1 \right ) \cdot 83$$

根据接收到的信号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 环境项目中,并在目标设备上进一步组装、加载和执行。

示例中使用的块