一、工程简介
1、 本工程实现的功能:用FPGA通过两个按键控制步进电机的启动和停止,硬件包括:黑金开发板、步进电机和Vince步进电机驱动器和电脑。
2、FPGA通过控制电机驱动器来控制步进电机的旋转,通过控制脉冲个数来控制电机角位移量,控制发送脉冲频率来控制电机的速度和加速度。
3、FPGA与Vince步进电机驱动器之间的通讯协议采用RS232电平标准的串口通信(UART),FPGA发送给驱动器的命令是32位数据或64位的,因此串口模块还实现了32转8位数据的功能。
4.我的电机用在下图中:
二、顶层设计
motor顶层包括3个子模块:2个按键模块(key_ctrl)和一个电机模块(motor_ctrl)。顶层如图一所示。
这块模块要特别注意:motor模块复位端口rst_n的接线,如果不接,那么key_ctrl模块的rst_n必须接高电平,否则电机无法启动,原因是直接接motor模块的外部rst_n,电平不稳定,会导致这个key_ctrl模块一直处于复位状态,可用SignalTap II抓取一下rst_n信号就一目了然了。
module motor (
input wire clk,
input wire rst_n,
input wire key1,
input wire key2,
output wire TXD
);
wire key_flag1;
wire key_flag2; // key_flag2 = 0 in general
//================ key1 control motor stop =============================
key_ctrl key_ctrl_inst1 (
.clk (clk ),
.rst_n (1'b1 ),
.key (key1 ),
.key_flag (key_flag1 )
);
//=========================================================================
//================ key2 control motor start/reset =========================
key_ctrl key_ctrl_inst2 (
.clk (clk ),
.rst_n (1'b1 ), // if rst_n connected to port rst_n,rst_n must be allocated pins.
.key (key2 ),
.key_flag (key_flag2 )
);
//========================================================================
motor_ctrl motor_ctrl_inst(
.clk (clk ),
.rst_n (~ key_flag2),
.motor_end (key_flag1 ),
.TXD (TXD )
);
endmodule
三、架构设计
1、key_ctrl模块
该模块分为两个部分:按键消抖和边缘检测。其中中间信号key_wave的脉宽由按键按下的时间长短来决定,key_ctrl模块顶层如下:
module key_ctrl (
input wire clk,
input wire rst_n,
input wire key,
output wire key_flag
);
wire key_wave;
key_filter key_filter_inst(
.clk (clk ),
.rst_n (rst_n ),
.key (key ),
.key_wave (key_wave )
);
edge_check edge_check_inst(
.clk (clk ),
.rst_n (rst_n ),
.key (key_wave ),
.flag_pos (),
.flag_neg (key_flag )
);
endmodule
(1)按键消抖模块(key_filter)
按键按下的标准:按下时间超过5ms。按键的状态可以分为4个:松开(KEY_OFF)、闭合抖动(ON_SHAKE)、闭合(K