|
- module stepper( //四相八拍28BYJ-48步进电机驱动模块
- //电机转子64个节拍转一圈 每个节拍转5.625度 输出轴减速比为64,则4096个节拍转一圈
- input clk, //节拍时钟 频率越高旋转越快 (最高1Khz,再高可能无法转动)
- input rst, //异步低电平复位 (停转复位使绕组断电)
- input to, //旋转方向 0:顺时针 1:逆时针
- output reg [3:0] out //节拍输出,接步进电机 (ULN2003需5V供电)
- );
- reg [2:0] i;
- initial i = 3'd0;
- wire [3:0] beat [7:0];
- assign beat[0] = 4'b0001;
- assign beat[1] = 4'b0011;
- assign beat[2] = 4'b0010;
- assign beat[3] = 4'b0110;
- assign beat[4] = 4'b0100;
- assign beat[5] = 4'b1100;
- assign beat[6] = 4'b1000;
- assign beat[7] = 4'b1001;
- always @(posedge clk or negedge rst) begin
- if(!rst) begin
- i <= 3'd0;
- out <= 4'b0000;
- end else begin
- i <= to ? (i + 3'd1) : (i - 3'd1);
- out <= beat[i];
- end
- end
- endmodule
- `define fosc 50000000 //有源晶振频率
- module main(
- input clk, //有源晶振时钟
- output [3:0] out //接步进电机
- );
- integer i;
- integer j;
- reg motor_clk; //步进电机时钟 1Khz
- reg to; //步进电机旋转方向
- always @(posedge clk) begin
- i = i + 1;
- if(i >= `fosc/1000/2) begin
- i = 0;
- motor_clk <= !motor_clk;
- end
- end
- always @(posedge motor_clk) begin
- j = j + 1;
- if(j >= 4096) begin
- j = 0;
- to <= !to;
- end
- end
- stepper m1(
- .clk(motor_clk),
- .rst(1'd1),
- .to(to),
- .out(out)
- );
- endmodule
复制代码 |
|