前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FPGA控制_步进电机模块使用说明

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

原创
作者头像
FPGA技术江湖
修改2021-04-14 14:18:44
8590
修改2021-04-14 14:18:44
举报
文章被收录于专栏:FPGA技术江湖FPGA技术江湖

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等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • FPGA控制_步进电机模块使用说明
  • 一、步进电机简介
  • 二、步进电机的种类
  • 三、步进电机控制的FPGA实现
  • 四、步进电机驱动模块
  • 五、FPGA控制代码分享
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档