FPGA控制_步进电机模块使用说明

2021-04-14 14:18:44 浏览数 (1)

FPGA控制_步进电机模块使用说明

今天给大侠带来步进电机模块使用说明,话不多说,上货。

一、步进电机简介

步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

二、步进电机的种类

目前常用的步进电机有三类:

(1)反应式步进电动机(VR):它的结构简单,生产成本低,步距角可以做的相当小,但动态性能相对较差;

(2)永磁式步进电动机(PM):它的出力大,动态性能好;但步距角一般比较大;

(3)混合步进电动机(HB):它综合了反应式和永磁式两者的优点,步距角小,出力大,动态性能好,是性能较好的一类步进电动机。

三、步进电机控制的FPGA实现

我们实验中所使用的步进电机为四相步进电机,型号为28BYJ-48。

转子小齿数为64。系统中采用四路I/O进行并行控制,FPGA直接发出多相脉冲信号,在通过功率放大后,进入步进电机的各相绕组。这样就不再需要脉冲分配器。脉冲分配器的功能可以由纯软件的方法实现。

四相步距电机的控制方法有四相单四拍,四相单、双八拍和四相双四拍三种控制方式。步距角的计算公式为:

其中:m为相数,控制方法是四相单四拍和四相双四拍时C为1,控制方法是四相单、双八拍时C为2,Zk为转子小齿数。本系统中采用的是四相单、双八拍控制方法,所以步距角为360°/512。但步进电机经过一个1/8的减速器引出,实际的步距角应为360°/512/8。

试验中使用EXI/O的高四位控制四相步进电机的四个相。按照四相单、双八拍控制方法,电机正转时的控制顺序为A→AB→B→BC→C→CD→D→DA。EXI/O的高四位的值参见下表。

上表电机正转时,FPGA四位IO口的值反转时,只要将控制信号按相反的顺序给出即可。

步进电机的频率不能太快,也不能太慢。在200Hz附近最好。频率太快是转动不起来的。

注:为什么步进电机高于一定速度就无法启动:

步进电机有一个技术参数:空载启动频率,即步进电机在空载情况下能够正常启动的脉冲频率,如果脉冲频率高于该值,电机不能正常启动,可能发生丢步或堵转。在有负载的情况下,启动频率应更低。如果要使电机达到高速转动,脉冲频率应该有加速过程,即启动频率较低,然后按一定加速度升到所希望的高频(电机转速从低速升到高速)。

四、步进电机驱动模块

<1>、模块实物图以及电路图,如下图。

<2>、ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。由于芯片管脚输出驱动能力不够,所以需要uln2003芯片来驱动,增加其驱动能力。

视频演示如下:

https://mp.weixin.qq.com/s/m7sVCNBUPqBgLgKBC_34oA

五、FPGA控制代码分享

代码语言:javascript复制
module step_motor_v1(clk, rst_n, key_en, key_dir, step_port);

  input              clk;
  input              rst_n;
  input              key_en;
  input              key_dir;

  output  reg [3:0] step_port;
  
  parameter t = 97600;

  reg [17:0] cnt;
  reg [2:0] state;
  reg en;
  
  always @ (posedge clk, negedge rst_n)
  begin
    if(rst_n == 1'b0)
      cnt <= 18'
d0;
    else if(key_en)
      begin
        if(cnt == t - 1)
          cnt <= 18'd0;
        else  
          cnt <= cnt   1'
b1;
      end
    else
      cnt <= cnt;
  end
  
  always @ (posedge clk, negedge rst_n)
  begin
    if(rst_n == 1'b0)
      state <= 3'
d0;
    else if(key_en && cnt == t - 1)
      begin
        if(key_dir)
          state <= state   1'b1;
        else
          state <= state - 1'
b1;
      end
    else
      state <= state;
  end
  
 always @ (posedge clk, negedge rst_n)
  begin
    if(rst_n == 1'b0)
      step_port <= 4'
d0;
    else if(key_en && cnt == t - 1)
      case(state)
        3'b000  :  step_port <= 4'b0001;
        3'b001  :  step_port <= 4'b0011;
        3'b010  :  step_port <= 4'b0010;
        3'b011  :  step_port <= 4'b0110;
        3'b100  :  step_port <= 4'b0100;
        3'b101  :  step_port <= 4'b1100;
        3'b110  :  step_port <= 4'b1000;
        3'b111  :  step_port <= 4'b1001;
      endcase
    else
      step_port <= step_port;
  end

endmodule

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

江湖偌大,继续闯荡,愿大侠一切安好,有缘再见!

0 人点赞