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微控制器调试板兼容,在[相应示例]中有描述(https://engee.com/community/ru/catalogs/projects/knopka-i-svetodiod-na-stm32 )。

下图显示了驱动器的连接图。

scheme.png

根据IHM04A1板的引脚排列和原理图以及驱动程序的功能图,EN-AEN-B输入设计用于驱动程序的AB桥的硬件激活/停用。 输入IN1AIN2A控制桥A的第一和第二臂,输入IN1BIN2B控制桥B

image.png

控制输入连接到调试板的GPIO,如接线图所示。 根据电机数据,控制输入端的信号频率不超过250Hz。 有鉴于此,使用外围数字输入模块来实现控制就足够了;在本例中将不考虑PWM模块。

管理系统模型

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

image.png

街区 C Function "BUTTON_GPIO_PC13"和"LED_GPIO_PA5"已经在[STM32数字输入/输出示例]中示出(https://engee.com/community/ru/catalogs/projects/knopka-i-svetodiod-na-stm32 )。 座 C Function "NUCLEO_IHM04A1"是实现控制算法与用于控制驱动器数字输入PA10、PB4、PB5、PC1、PA0、PA1的外围设备的交互所必需的。 这个单位也实现完全步司机控制。
当块被应用于输入 enable 高信号电平也设置为GPIOPA10,PC1,其中包括两个驱动器桥。 在入口处 pulses GPIO状态PB4、PB5、PA0PA1的向量被传送到块,从而启用/禁用相应的驱动程序密钥。

在此块中,您还应该注意上一步中输入的状态存储在全局变量中。 flagflags. 这些变量在вкладке Shared Code 的块。

具有从"Contol系统"子系统生成的算法的用户程序将按如下方式工作:在信号的后沿,按下内置于板中的按钮触点后,内置于板中的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 我们也会将其添加到项目中。 在框架中使用VS Code+PlatformIO中生成的文件 stm32cube 示于[在STM32上闪烁LED]的示例(https://engee.com/community/ru/catalogs/projects/migaiushchii-svetodiod-na-stm32f4 )。

在STM32上执行代码

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

vid480.gif

通过按下NUCLEO板内置的按钮,步进电机启动和停止。

结论

在本例中,我们通过添加微控制器外围模块来完善了全步进电机控制模型。 控制算法在真实的控制对象上正常工作。