28BYJ 48

Честно говоря у нас на сайте уже была статья про двигатели. В той статье было кратко рассказано про коллекторные и шаговые двухфазные и трехфазные двигатели. Там же был и проект Quartus для управления двигателями из платы Марсоход. Здесь в этой статье я расскажу, как управлять именно этим 28byj-48 в полнофазном (full step) и полуфазном (half step) режиме. Напишем программу управления на Verilog HDL.

Двигатель делает один оборот ротора за 32 шага в полнофазном режиме или за 64 шага в полуфазном режиме. Кроме того, имеется встроенный редуктор с коэффициентом передачи примерно 1/64.

Двигатель 28byj-48 имеет 5 выводов и его схема выглядит вот так:

step motor schema

Условно говоря у двигателя имеется две катушки с выводами посередине, эти выводы объединены в один провод (красный) обычно подключаемый к питанию (или к земле, ). Таким образом, получаются четыре катушки, которые можно независимо включать. Вообще-то через катушки течет довольно большой ток, это еще зависит от напряжения питания. Но в общем случае напрямую к микроконтроллеру или ПЛИС их желательно подключать через драйвер двигателя. Для 28byj-48 часто применяют драйвер на базе микросхемы ULN2003:

UNL2003 board

Управляющие сигналы, четыре фазы подключаются ко входам 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 состояния. Каждая катушка включена на два такта и при этом всегда включены и работают две соседние катушки. Временные диаграммы сигналов для полнофазного режима работы шагового двигателя будут вот такие:

full step mode step motor waveform

В полуфазном режиме картина немного другая, состояний 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


В целом же логика описывается похожим образом, но каждая обмотка включается на три такта и есть промежуточные такты, когда включены не две, а только одна катушка. Получаются более мелкие шаги двигателя, и крутящий момент послабее будет.

Временные диаграммы выглядят вот так:

half step mode step motor waveform

Просимулировать самостоятельно модули управления двигателей можно с помощью вот такого простого тестбенча 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.

 

 


Добавить комментарий