新手上路
- 积分
- 41
- 金钱
- 41
- 注册时间
- 2020-12-3
- 在线时间
- 14 小时
|
5金钱
我要用FPGA实现电机驱动并且测速,测速选择的是光耦模块,有遮挡的时候为高电平,无遮挡时为低电平。也就是说,通过检测固定时间内测速传感器的上升沿个数来检测当前电机的速度。
我的想法是给电机绑一个长条,测量一秒钟内上升沿的个数,并且将数值发送到串口,这样就可以知道电机转速为 x转/秒。
目前计数功能,串口发送什么的都已经实现了。
但是,当我将遮挡物拿开的时候,计数并不清零,而是持续显示最新的一次测量数值,再次测量的时候还是接着上次的数值继续增加。试了一些方法,还是没有实现,不知道问题出在哪里,请大神指导一下。
目前的代码如下:
顶层模块:
- module motor(
- input sys_clk, //时钟输入,50MHz
- input sys_rst_n, //系统复位信号,下降沿有效
- input speed_val, //速度信号输入
- output uart_tx
- );
- parameter time_ones = 50_000_000;
- reg speed_reg1;
- reg speed_reg2;
- reg speed_rise;
- reg [7: 0] speed_count;
- reg [7: 0] speed_Average;
- reg [25: 0] time_cnt;
- always@(posedge sys_clk,negedge sys_rst_n)
- begin
- if(!sys_rst_n)
- begin
- speed_reg1 <= 1'b0;
- speed_reg2 <= 1'b0;
- end
- else begin
- speed_reg1 <= speed_val;
- speed_reg2 <= speed_reg1;
- end
- end
- always@(posedge sys_clk,negedge sys_rst_n)
- begin
- if(!sys_rst_n)
- speed_rise <= 1'b0;
- else if(!speed_reg2 && speed_reg1)
- speed_rise <= 1'b1;
- else
- speed_rise <= 1'b0;
- end
- always@(posedge sys_clk or negedge sys_rst_n)
- begin
- if(!sys_rst_n)
- speed_count <= 'b0;
- else if(speed_rise)
- speed_count <= speed_count + 1;
- else
- speed_count <= speed_count;
- end
- always@(posedge sys_clk or negedge sys_rst_n)
- begin
- if(!sys_rst_n)
- speed_Average <= 'b0;
- else if(time_cnt == 49999999)
- speed_Average <= 0;
- else
- speed_Average <= speed_count;
- end
- always@(posedge sys_clk,negedge sys_rst_n)
- begin
- if(!sys_rst_n)
- time_cnt <= 'b0;
- else if(time_cnt == 49999999)
- time_cnt <= 0;
- else
- time_cnt <= time_cnt + 1'b1;
- end
- /*串口显示单元*/
- reg Send_Go;
- reg [7:0]Data;
- uart_byte_tx uart_byte_tx(
- .sys_clk(sys_clk),
- .sys_rst_n(sys_rst_n),
- .Data(Data),
- .Send_Go(Send_Go),
- .Baud_set(3'd0),
- .uart_tx(uart_tx),
- .Tx_done(Tx_done)
- );
-
- reg [25:0]counter;
- always@(posedge sys_clk or negedge sys_rst_n)
- if(!sys_rst_n)
- counter <= 0;
- else if(counter == 49999999)
- counter <= 0;
- else
- counter <= counter + 1;
-
- always@(posedge sys_clk or negedge sys_rst_n)
- if(!sys_rst_n)
- Send_Go <= 0;
- else if(counter == 1)
- Send_Go <= 1;
- else
- Send_Go <= 0;
-
- always@(posedge sys_clk or negedge sys_rst_n)
- if(!sys_rst_n)
- Data <= 0;
- else if(Tx_done)
- Data <= speed_Average;
-
- endmodule
复制代码 串口发送子模块:
效果如下:
测试效果
0B之后我已经将遮挡物拿开,但是他还是继续保持0B,并没有清零。
测速模块用的这种的:
|
最佳答案
查看完整内容[请看2#楼]
你的speed_count一直没有清0,当然一直累加了。应该在每1秒到时,清0.
代码应该改成这样:
always@(posedge sys_clk or negedge sys_rst_n)
begin
if(!sys_rst_n)
speed_count
|