Engee 文档
Notebook

MIC32(光表)代码生成

本演示展示了基于光敏电阻的光表的Engee模型的开发,然后在MIK32NUKE v0.3调试板上生成和执行代码。

导言

本演示中使用的目标设备是MIK32NUKE v0调试板。3基于微控制器*[K1948VK018MIK32Amur](https://mikron.ru/products/mikrokontrollery/mk32-amur /)。 在本示例中开发的Engee模型中,使用来自控制器的模数转换器(ADC)的模拟信号计算照度,并连接控制器的外围设备。 代码通过PlatformIO扩展从VS Code*编译并上传到微控制器。

硬件部分

本例中的照度测量是使用[фоторезистора](https://ru.wikipedia.org/wiki/Фоторезистор )来自GL55家族。 ADC的输入信号为光敏电阻电路中限流电阻两端的压降。 在高光照条件下,光敏电阻的电阻 减小,并且电压降 在限流电阻上 增加。 电源电压电平为 . 元件的连接图如下所示。

mik32_lux_plate.png

该电路由调试板(触点)供电 3V3, GND). 从电路接收的模拟信号被发送到4个微控制器的ADC(ADC1.4),联系 P0.7.

模型描述

这个例子的模型 - mik32_adc_lux.engee. 以下模块用于连接和使用微控制器的外围设备: C Function. 模拟时间块 Clock 传输到块 ADC4 电流模拟时间来模拟电阻上的测量值 仿真过程中的电压下降。

mik32_lux_model.png

为了计算模型中的照度,有一个子系统用于计算光敏电阻的电阻。 Get_LDR_Resistance 和[近似一维函数]块(https://engee.com/helpcenter/stable/ru/base-lib-tables/1d-lookup-table.htmlilluminance_from_resistance.

连接外围设备

要使用MIC32外设,该模型使用以下模块 C Function: systemClockConfig, EnableInterrupts, ADC4USART1_print. 这些块中的每一个都连接来自MIK32HAL库的相应外设的头文件。 座 EnableInterrupts 除其他外,它将头文件与中断处理函数连接起来,并 USART1_print -头文件 stdlib.h 用于将整数格式转换为字符串的C标准库。
要连接的头文件包含在目录中 include/ 一个例子。 以下是在块中连接HAL库头文件的示例 systemClockConfig.

mik32_lux_include.png

下表提供了有关块用途的信息。 C Function 和它们连接的MIK32HAL库文件。

/C Function/用途|可插拔头文件|
| :--------------------: | :----------- | :-----------: |
| systemClockConfig /初始化HAL库,配置时钟子系统和MC频率监视器| 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 在代码的注释中给出。

照度的计算

内置的MIC32Adc具有12位位深度,因此从ADC接收的信号 ADCvalue 接受[0,4095]范围内的值。 如前所述,该信号对应于电压降。 在范围[0,1.2]V的光敏电阻电路中的限流电阻上。 Get_LDR_Resistance 根据该信号,计算光敏电阻电阻。 根据公式

基于接收到的信号 Ohm1-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 一个例子。

开发环境中的项目准备

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

mik32_lux_platfotmio_2.png

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

在MIC32上执行代码

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

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

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

mik32_lux_2.gif

当光电二极管上的照度发生变化时(通过在其上照射手电筒或对其进行遮光),来自该单元的相应照度值被输出到串行端口。 Lookup Table 模特。

结论

在本例中,我们研究了基于ADC信号的Engee模型的开发,并将结果值输出到K1948VK018MIK32Amur微控制器上的串行端口,作为MIK32NUKE V0.3调试板的一部分。 开发的模型与Vs CodePlatformIO环境项目中生成的文件一起嵌入,然后在目标设备上组装,下载和执行。

示例中使用的块