Engee 文档
Notebook

为 STM32 生成代码(全步进电机控制)

简介

本演示实现了[双极步进电机的全步控制]示例的硬件实施(https://engee.com/community/ru/catalogs/projects/polnoshagovoe-upravleniia-shagovym-dvigatelem/edit)。

硬件

本示例的控制对象是17HS1352-P4130双极步进电机,这在仿真示例中已经说明。使用基于 X-NUCLEO-IHM04A1 扩展板的双全桥 MOSFET 驱动器 L6206PD 作为逆变器。该板与 STM NUCLEO F446RE 调试微控制器板兼容,其数字 I/O 操作在 相关示例 中讨论。

下图是驱动器的接线图。

scheme.png

根据 IHM04A1 电路板的引脚分配和电路图以及驱动器的功能图,输入端 EN-AEN-B 用于驱动器 AB 电桥的硬件开关。输入端 IN1AIN2A 控制 A 桥的第一臂和第二臂,输入端 IN1BIN2B - 控制 B 桥。

image.png

控制输入端与调试板 GPIO 的连接如连接图所示。根据电机数据,控制输入端的信号频率不超过 250 Hz。因此,只需使用外围数字输入模块即可实现控制,本示例不考虑 PWM 模块。

控制系统模型

与原始示例中使用的模型相比,新模型的不同之处仅在于基于C Function 块的控制器外围块和输入信号数据类型/尺寸匹配块。所有这些都包含在 "控制系统 "子系统中。

image.png

C Function "BUTTON_GPIO_PC13 "和 "LED_GPIO_PA5 "已在STM32 数字 I/O 示例中展示。块C Function "NUCLEO_IHM04A1 "是实现控制算法与用于控制驱动器的外设(数字输入PA10、PB4、PB5、PC1、PA0、PA1)交互所必需的。此外,该模块还实现了对驱动器的全步控制。
enable 块输入端输入高电平信号时,GPIO PA10、PC1 上也会设置一个高电平,从而启用驱动器的两个桥。GPIOPB4、PB5、PA0PA1状态的矢量被传送到pulses 块的输入端,从而启用/禁用相应的驱动器按键。

在该程序块中,您还应注意上一步中输入的状态已存储在全局变量flagflags 中。这些变量在程序块的 tabShared Code 中声明。

使用子系统 "控制系统 "生成的算法的用户程序工作原理如下:在按下电路板内置按钮触点 后的信号后沿时,电路板内置的 LED 亮起,驱动桥接通,控制脉冲的顺序形成开始。电机轴顺时针旋转的脉冲序列对应于按 PB4-PB5-PA0-PA1 顺序向输入端输出的脉冲。再次按下按钮触点后,驱动桥和 LED 关闭,脉冲输出停止。

建模结果

既然我们已经对原始模型进行了修改,那么让我们再次对其进行仿真,重复原始示例的相同步骤。通过这种方式,我们可以确保算法的工作原理完全相同,并检查模块C Function 的信号工作的正确性。

加载必要的库:

In [ ]:
using Plots
using DataFrames
plotlyjs();

运行模型

In [ ]:
modelName = "stm32_sm_fullstep_control";
if modelName  getfield.(engee.get_all_models(), :name)
    engee.load( "$(@__DIR__)/$(modelName).engee");
end

model = engee.run(modelName);

读取电压和电流的瞬时值,以及转速和轴位置:

In [ ]:
t = model["Speed"].time;
Ia = model["Ia"].value;
Ib = model["Ib"].value;
Va = model["Va"].value;
Vb = model["Vb"].value;
Speed = model["Speed"].value;
Position = model["Position"].value;

绘制轴位置和转速图

In [ ]:
plot(t, Position, layout = (2,1), ylabel = "Положение, град", legend = :none)
plot!(t, Speed, subplot = 2, ylabel = "Скорость вращения, рад/с", xlabel = "Время, c", legend = :none)
Out[0]:

绘制相电流和电压图

In [ ]:
plot(t, [Va Vb], label = ["Va" "Vb"], ylabel = "Фазные напряжения, В", color = [:red :blue], layout = (2,1), subplot = 1)
plot!(t, [Ia Ib], label = ["Ia" "Ib"], ylabel = "Фазные токи, А", xlabel = "Время, c", color = [:green :black], subplot = 2)
Out[0]:

从结果图中可以看出,该示例模型的算法运行与原始模型完全相同。

代码生成和项目组装

让我们从子系统Control System 生成代码:

In [ ]:
engee.generate_code("$(@__DIR__)/$(modelName).engee",
                    "$(@__DIR__)/code/";
                    subsystem_name = "Control System")
[ Info: Generated code and artifacts: /user/start/examples/codegen/stm32_sm_fullstep_control/code

下载获得的文件,并将其添加到开发环境 VS Code + PlatformIO 中的项目中。示例用户程序的代码在文件/stm32_sm_fullstep_control/main.c 中给出,它也将被添加到项目中。在stm32cube 框架中使用 VS Code + PlatformIO 中生成的文件的工作情况见示例 闪烁 STM32 上的 LED

在 STM32 上执行代码

将代码加载到微控制器后,我们开始执行程序。

vid480.gif

按下集成在 NUCLEO 板上的按钮,步进电机就会启动或停止。

输出

在本示例中,我们通过添加微控制器外设模块,完善了全步进电机控制模型。控制算法在实际控制对象上运行正常。