为 MIK32 生成代码(照度计)¶
该演示介绍了基于光敏电阻的照度计的Engee模型的开发过程,以及代码生成和在MIK32 NUKE V0.3 调试板上的执行过程。
简介¶
本演示中使用的目标设备是基于 K1948VC018 MIK32 Amur 微控制器的 MIK32 NUKE V0.3 调试板。本例中开发的 Engee 模型使用控制器模数转换器 (ADC) 的模拟信号执行照度计算,并连接控制器外设。代码通过 VS Code 和 PlatformIO 扩展编译并加载到微控制器中。
硬件部分¶
本示例中的照度测量使用 GL55 系列的 光敏电阻。ADC 输入信号是光敏电阻电路中限流电阻上的压降。在高照度下,光敏电阻$R_{LDR}$ 的电阻会减小,限流电阻$R_1 = 83\ Ом$ 上的压降$V_{R_1}$ 会增大。电源电压电平等于$V_{CC} = 3.3 В$ 。元件连接图如下所示。
电路由调试板供电(引脚3V3
,GND
)。从电路接收到的模拟信号被送入微控制器的 ADC 4 (ADC1.4
) 的P0.7
引脚。
型号说明¶
本例的模型是mik32_adc_lux.engee
。块C Function
用于连接和操作微控制器的外设。仿真时间块Clock
将电流仿真时间传输到块ADC4
,以仿真仿真期间在电阻$R_1$ 上测得的压降。
为了计算照度,模型包括一个计算光敏电阻电阻的子系统Get_LDR_Resistance
和一个近似一维函数 块illuminance_from_resistance
。
连接外围设备¶
为了与 MIC32 外围设备配合使用,该模型使用了以下模块C Function
:systemClockConfig
,EnableInterrupts
,ADC4
和USART1_print
。每个模块都连接了 MIK32 HAL 库中相应外设的头文件。块EnableInterrupts
除其他外连接了具有中断处理功能的头文件,USART1_print
连接了将整数格式转换为字符串的标准 C 库的头文件stdlib.h
。
要连接的头文件包含在示例的include/
目录中。下面是在块systemClockConfig
中连接 HAL 库头文件的示例。
下表列出了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
参数化并连接照度和电阻的近似函数由以下几点决定:
Освещенность = [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 = ("Освещенность, Лк"))
这些要点来自 GL55 系列光敏电阻器的数据表。
建模结果¶
模拟照度计 下载并运行 模型mik32_adc_lux.engee
:
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
中选择了 "最接近 "的近似方法,因此计算结果中的照度将只取在程序块表格中输入的值。
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)
从得到的图表中可以看出,ADC 信号的变化会导致计算出的照度信号发生相应的变化。
代码生成¶
从模型中生成代码,然后将模型中开发的算法加载到微控制器中:
engee.generate_code( "$(@__DIR__)/mik32_adc_lux.engee",
"$(@__DIR__)/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 上执行代码¶
让我们将调试板 MIK32 NUKE V0.3 连接到计算机的 USB 端口,然后在 PlatformIO 中观察连接的设备。要正确识别调试板的连接,需要使用 USB 驱动程序。示例中使用的驱动程序是libusbK
。
连接成功后,开始构建项目:
"PLATFORMIO -> PROJECT TASKS -> mik32v2 -> General -> Build ".
如果没有编译错误,将编译好的代码加载到微控制器中:
"PLATFORMIO -> PROJECT TASKS -> mik32v2 -> General -> Upload ".
为了输出计算结果,我们使用 SerialPlot 程序中的图形生成器,该程序从串行端口接收数据。
当光电二极管上的光照度发生变化时(用手电筒照射或遮光),Lookup Table
模型块中与等级相适应的光照度值就会输出到串行端口。
结论¶
在本示例中,我们考虑在 K1948VK018 MIK32 Amur 微控制器(作为 MIK32 NUKE V0.3 调试板的一部分)上,根据 ADC 信号开发照度计算程序的 Engee 模型,并将获得的值输出到串行端口。开发的模型通过生成的文件嵌入到 VS Code 的 PlatformIO 环境项目中,并在目标设备上进一步组装、加载和执行。