verilog设计步进电机

该文章描述了一个Verilog模块,用于控制四相单双八拍步进电机。设计基于100MHz系统时钟,通过计数器产生250Hz的频率,实现了电机的正反向转动。代码中包含了状态机逻辑来切换电机的八种不同步进状态。
摘要由CSDN通过智能技术生成

要求:用100MHZ系统时钟设计四相单双八拍步进电机

 设计代码:

//四相单双八拍步进电机
module StepMotorPorts (
	input Clk,
	input Rst_n,
	input Turn,//Turn==1 为正向转动 Turn==0 为反向转动
	output reg [3:0]StepDrive
);
//实现250hz的计数
reg [18:0]cnt;//为步进电机提供250hz的频率 系统时钟100Mhz 计数值100000000/250=400000
always @(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		cnt <= 0;
	else if( cnt == 19'd399999 )
		cnt <= 0;
	else 	
		cnt <= cnt + 1;

//250hz时钟使能
reg Clk_en;
always @(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		Clk_en <= 0;
	else if( cnt == 19'd399999 )
		Clk_en <= 1;
	else 
		Clk_en <= 0;

//共八种状态 即八拍
reg [2:0]State;
always @(posedge Clk or negedge Rst_n)
	if(!Rst_n)begin
		State <= 3'b000;
		StepDrive <= 4'b0001;
	end
	else if(Clk_en)
		begin
			if(Turn)
				State <= State + 3'b1;
			else if( Turn == 0 )
				State <= State - 3'b1;
		end
	else case(State)
				3'b000: StepDrive <= 4'b0001;//A
				3'b001: StepDrive <= 4'b0011;//AB
				3'b010: StepDrive <= 4'b0010;//B
				3'b011: StepDrive <= 4'b0110;//BC
				3'b100: StepDrive <= 4'b0100;//C
				3'b101: StepDrive <= 4'b1100;//CD
				3'b110: StepDrive <= 4'b1000;//D
				3'b111: StepDrive <= 4'b1001;//DA
			endcase
endmodule

测试代码:我以Turn == 1 正向进行测试

`timescale 1ns / 1ns
module StepMoterPorts_tb();

reg Clk;
reg Rst_n;
reg Turn;
wire [3:0]StepDrive;

StepMotorPorts StepMotorPorts(
	.Clk(Clk),
	.Rst_n(Rst_n),
	.Turn(Turn),
	.StepDrive(StepDrive)
);

initial Clk = 1;
always #5 Clk = ~Clk; //产生时钟

initial begin
	Rst_n = 0;
	#201;
	Rst_n = 1;
	Turn = 1;
	#40000000;
	$stop;
end

endmodule

波形图:

28BYJ-48步进电机(EP4CE6)FPGA控制Verilog逻辑源码Quartus工程文件+文档资料, 28BYJ-48步进电机步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。您可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 2. 步进电机规格: 步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。 3. 实现原理 当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行 module STEP_MOTO_V1_0 ( //input input sys_clk , input sys_rst_n , input [2:0] key , output reg mot_out_a , output reg mot_out_b , output reg mot_out_c , output reg mot_out_d ); //reg define //reg [8-1:0] counter ; //reg [8-1:0] count ; reg [25:0] clk_cnt ; reg [ 2:0] step_cnt ; //wire wire step_en ; //wire define //parameter define /******************************************************************************************************* ** Main Program ** ********************************************************************************************************/ // gen a time counter , 5500000 * 20ns always @(posedge sys_clk or negedge sys_rst_n) begin if (sys_rst_n ==1'b0) clk_cnt <= 26'b0; else if (key[1]==1'd0 && key[2]==1'd1 && clk_cnt == 26'd250000 ) clk_cnt <= 26'b0; else if ( key[1]==1'd1 && key[2]==1'd0 && clk_cnt == 26'd600000 ) clk_cnt <= 26'b0; else if (clk_cnt == 26'd400000 ) clk_cnt <= 26'b0; else clk_cnt <= clk_cnt + 26'b1; end // step enable is active 500000 * 20ns assign step_en = ( clk_cnt == 26'b0 ) ? 1:0 ; always @(posedge step_en or negedge sys_rst_n) begin if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏澄啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值