Engee 文档
Notebook

步进电机控制

此模型演示如何共享块步进电机驱动器(Stepper motor**driver)步进电机允许您研究按位置和速度控制永磁步进电机的过程。

所研究的步进电机的步进角为1.8度。 在位置控制模式下,Ref输入设置所需的步数。 在速度控制模式下,Ref输入确定每秒所需的步数。

image.png

该系统级模型非常适合研究步进电机的动力学,以及检查在给定负载下工作时是否会跳过步骤。 它可以用来调试电机控制器,以提高步骤的准确性。 控制器(在一种情况下部分地,在另一种情况下完全地)被实现为现成的步进电机控制模块,其代码可以加载到微控制器上。

模拟结果

我们来研究当控制信号发生变化时,电机轴旋转的角度是如何变化的。 轴位置控制算法采用若干步骤形式的命令,并将其转换为控制步进电机驱动器的脉冲序列。 角速度图中的跳跃发生在轴固定在给定位置时。

In [ ]:
model = engee.open("stepper-motor-with-position-control.engee")
data_p = engee.run(model)

degPerStep = 1.8;
angle_measured = data_p["Угол вала"]
angle_command = data_p["Управление"]
shaft_speed = data_p["Stepper Motor.rod_flange.w"]

p1 = plot(angle_measured.time, (rad2deg.(angle_measured.value) .+ 0.5*degPerStep)./degPerStep,
          label="Измеренный", lw=2, ls=:solid, titlefont=font(10), guidefont=font(8))
plot!( p1, angle_command.time, angle_command.value, ls=:dash, label="Заданный", lc=:red)
plot!(p1, title="Угол поворота вала (кол-во шагов)", ylabel="№ шага")

plot(
    p1,
    plot(shaft_speed.time, shaft_speed.value, label=false, lw=2,
         xlabel="Время (с)", ylabel="Скорость (градусы/сек)", title="Угловая скорость вала"),
    titlefont=font(10), guidefont=font(8), layout=(2,1)
)
Out[0]:

现在让我们研究一下当受速度控制时,轴的旋转角度是如何变化的。 速度控制算法采用每秒步数形式的命令,并将其转换为控制步进电机驱动器的脉冲序列。 角速度图中的跳跃在移动到下一步骤时发生。

In [ ]:
Pkg.add("NumericalIntegration")
In [ ]:
using NumericalIntegration
In [ ]:
model = engee.open("stepper-motor-with-speed-control.engee")
data = engee.run(model)

degPerStep = 1.8;
angle_measured = data["Угол вала"]
angle_command = data["Управление"]
shaft_speed = data["Stepper Motor.rod_flange.w"]

p2 = plot(angle_measured.time, (rad2deg.(angle_measured.value) .+ 0.5*degPerStep)./degPerStep, lw=2, ls=:solid, label="Измеренный")
plot!( p2, angle_command.time, cumul_integrate(angle_command.time,angle_command.value), ls=:dash, label="Заданный", lc=:red)
plot!(p2, title="Угол поворота вала (кол-во шагов)", ylabel="№ шага")

plot(
    p2,
    plot(shaft_speed.time, shaft_speed.value, label=false, lw=2,
         xlabel="Время (с)", ylabel="Скорость (градусы/сек)", title="Угловая скорость вала"),
    titlefont=font(10), guidefont=font(8), layout=(2,1)
)
Out[0]:

下图显示了步进电机驱动器端子的状况如何与轴的运动相关。 每次ENA信号超过开启阈值电压(使能阈值电压)时驱动器都会启动一个步进。

In [ ]:
t = data_p["Stepper Motor Driver.p_a.v"].time;
pA = data_p["Stepper Motor Driver.p_a.v"].value;
nA = data_p["Stepper Motor Driver.n_a.v"].value;
pB = data_p["Stepper Motor Driver.p_b.v"].value;
nB = data_p["Stepper Motor Driver.n_b.v"].value;
ENA = data_p["Stepper Motor Driver.enable_port.v"].value;
REV = data_p["Stepper Motor Driver.reverse_port.v"].value;

p3 = plot(t, pA, label="Pin A+", lw=2, yticks=([-5,0,5],["-5V", "0V", "+5V"]))
plot!(p3, t, nA, label="Pin A-", lw=2)
plot!(p3, t, pB, label="Pin B+", lw=2, ls=:dash)
plot!(p3, t, nB, label="Pin B-", lw=2, ls=:dash)
plot!(p3, t, ENA.-12, label="Pin ENA", lw=2)
plot!(p3, t, REV.-12, label="Pin REV", lw=2)
plot!(p3, xlabel="Время (с)", title="Напряжение на выводах драйвера шагового двигателя",
      guidefont=font(8), titlefont=font(11))
Out[0]:
In [ ]:
plot(p1) # Повтор графика для сопоставления
Out[0]:

结论

为了专注于开发控制算法,我们使用了驱动器和空载步进电机的高级模型。 构建的图形使我们能够估计控制的反应速度和正确性,通过修改模型,我们可以研究系统跳过步骤的趋势。