Честно говоря у нас на сайте уже была статья про двигатели. В той статье было кратко рассказано про коллекторные и шаговые двухфазные и трехфазные двигатели. Там же был и проект Quartus для управления двигателями из платы Марсоход. Здесь в этой статье я расскажу, как управлять именно этим 28byj-48 в полнофазном (full step) и полуфазном (half step) режиме. Напишем программу управления на Verilog HDL.
Двигатель делает один оборот ротора за 32 шага в полнофазном режиме или за 64 шага в полуфазном режиме. Кроме того, имеется встроенный редуктор с коэффициентом передачи примерно 1/64.
Двигатель 28byj-48 имеет 5 выводов и его схема выглядит вот так:
Условно говоря у двигателя имеется две катушки с выводами посередине, эти выводы объединены в один провод (красный) обычно подключаемый к питанию (или к земле, ). Таким образом, получаются четыре катушки, которые можно независимо включать. Вообще-то через катушки течет довольно большой ток, это еще зависит от напряжения питания. Но в общем случае напрямую к микроконтроллеру или ПЛИС их желательно подключать через драйвер двигателя. Для 28byj-48 часто применяют драйвер на базе микросхемы ULN2003:
Управляющие сигналы, четыре фазы подключаются ко входам IN2, IN2, IN3, IN4, шаговый двигатель подключается специальному 5-ти штырьковому коннектору. Еще нужно подавать питание до +12 вольт. Я питал сам мотор и драйвер двигателя от платы Марсоход с напряжением +3,6В и вполне работает.
В полнофазном режиме работы всегда включены две соседние обмотки. Это дает повышенный крутящий момент. Когда одна из обмоток выключается, то тут же включается третья и опять получаются включены две соседние.
На языке Verilog HDL такое поведение очень просто описать с помощью такой конструкции:
module fs_motor(
input wire clk,
output reg f0,
output reg f1,
output reg f2,
output reg f3
);
reg [1:0]cnt = 0;
always @(posedge clk)
cnt <= cnt+2'b01;
always @(posedge clk)
begin
f0 <= cnt==0 || cnt==3;
f1 <= cnt==0 || cnt==1;
f2 <= cnt==1 || cnt==2;
f3 <= cnt==2 || cnt==3;
end
endmodule
Счетчик cnt является двухбитным. Два бита описывают 4 состояния. Каждая катушка включена на два такта и при этом всегда включены и работают две соседние катушки. Временные диаграммы сигналов для полнофазного режима работы шагового двигателя будут вот такие:
В полуфазном режиме картина немного другая, состояний 8 поэтому счетчик нужен трехбитный:
module hs_motor(
input wire clk,
output reg f0,
output reg f1,
output reg f2,
output reg f3
);
reg [2:0]cnt = 0;
always @(posedge clk)
cnt <= cnt+2'b01;
always @(posedge clk)
begin
f0 <= cnt==7 || cnt==0 || cnt==1;
f1 <= cnt==1 || cnt==2 || cnt==3;
f2 <= cnt==3 || cnt==4 || cnt==5;
f3 <= cnt==5 || cnt==6 || cnt==7;
end
endmodule
В целом же логика описывается похожим образом, но каждая обмотка включается на три такта и есть промежуточные такты, когда включены не две, а только одна катушка. Получаются более мелкие шаги двигателя, и крутящий момент послабее будет.
Временные диаграммы выглядят вот так:
Просимулировать самостоятельно модули управления двигателей можно с помощью вот такого простого тестбенча verilog:
module tb();
reg clock = 0;
always
#10 clock = ~clock;
wire fw0, fw1, fw2, fw3;
wire hw0, hw1, hw2, hw3;
//full-step motor instance
fs_motor fsm(
.clk( clock),
.f0( fw0 ),
.f1( fw1 ),
.f2( fw2 ),
.f3( fw3 )
);
//half step motor instance
hs_motor hsm(
.clk( clock),
.f0( hw0 ),
.f1( hw1 ),
.f2( hw2 ),
.f3( hw3 )
);
initial
begin
$dumpfile("out.vcd");
$dumpvars(0,tb);
#1000;
$finish();
end
endmodule
Зачем мне понадобился этот шаговый двигатель? Я тут сделал такую игрушку - Marble Machine. И в ней спираль как раз вращается именно таким двигателем, а управление она берет из нашей платы Марсоход.
Работа моей Marble Machine:
Все пластиковые детали для этой машины напечатаны на 3D принтере FLSUN-QQ.
Подробнее...