为 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 操作在 相关示例 中讨论。
下图是驱动器的接线图。

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

控制输入端与调试板 GPIO 的连接如连接图所示。根据电机数据,控制输入端的信号频率不超过 250 Hz。因此,只需使用外围数字输入模块即可实现控制,本示例不考虑 PWM 模块。
控制系统模型
与原始示例中使用的模型相比,新模型的不同之处仅在于基于C Function
块的控制器外围块和输入信号数据类型/尺寸匹配块。所有这些都包含在 "控制系统 "子系统中。

块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、PA0和PA1状态的矢量被传送到pulses
块的输入端,从而启用/禁用相应的驱动器按键。
在该程序块中,您还应注意上一步中输入的状态已存储在全局变量flag
和flags
中。这些变量在程序块的 tabShared Code
中声明。
使用子系统 "控制系统 "生成的算法的用户程序工作原理如下:在按下电路板内置按钮触点 后的信号后沿时,电路板内置的 LED 亮起,驱动桥接通,控制脉冲的顺序形成开始。电机轴顺时针旋转的脉冲序列对应于按 PB4-PB5-PA0-PA1 顺序向输入端输出的脉冲。再次按下按钮触点后,驱动桥和 LED 关闭,脉冲输出停止。
建模结果
既然我们已经对原始模型进行了修改,那么让我们再次对其进行仿真,重复原始示例的相同步骤。通过这种方式,我们可以确保算法的工作原理完全相同,并检查模块C Function
的信号工作的正确性。
加载必要的库:
using Plots
using DataFrames
plotlyjs();
运行模型
modelName = "stm32_sm_fullstep_control";
if modelName ∉ getfield.(engee.get_all_models(), :name)
engee.load( "$(@__DIR__)/$(modelName).engee");
end
model = engee.run(modelName);
读取电压和电流的瞬时值,以及转速和轴位置:
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;
绘制轴位置和转速图
plot(t, Position, layout = (2,1), ylabel = "Положение, град", legend = :none)
plot!(t, Speed, subplot = 2, ylabel = "Скорость вращения, рад/с", xlabel = "Время, c", legend = :none)
绘制相电流和电压图
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)
从结果图中可以看出,该示例模型的算法运行与原始模型完全相同。
代码生成和项目组装
让我们从子系统Control System
生成代码:
engee.generate_code("$(@__DIR__)/$(modelName).engee",
"$(@__DIR__)/code/";
subsystem_name = "Control System")
下载获得的文件,并将其添加到开发环境 VS Code + PlatformIO 中的项目中。示例用户程序的代码在文件/stm32_sm_fullstep_control/main.c
中给出,它也将被添加到项目中。在stm32cube
框架中使用 VS Code + PlatformIO 中生成的文件的工作情况见示例 闪烁 STM32 上的 LED。
在 STM32 上执行代码
将代码加载到微控制器后,我们开始执行程序。

按下集成在 NUCLEO 板上的按钮,步进电机就会启动或停止。
输出
在本示例中,我们通过添加微控制器外设模块,完善了全步进电机控制模型。控制算法在实际控制对象上运行正常。