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等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。
江湖偌大,继续闯荡,愿大侠一切安好,有缘再见!