一次高电平对应180度的电气角度。如果对高电平进行计数,计数值就对应180度的电气角度。计数时间就是时钟周期与计数值的积,这就得到电气速度。相对应机械角度要查看电机的磁极对数,电气速度/磁极对数就是相应的机械速度。
利用霍尔信号测速的方法有分两种。一种就是如我之前说的对高电平计数,还有一种就是固定一个时间内对霍尔信号的高电平计数。同样也可得到速度。
这部分我参考了很多资料。最后选用一种对2相霍尔信号取与非,得到一个一个霍尔开关状态下的高电平,用计数器对这个高电平计数的方法。
这部分具体效果如果只能等实际测定后才能下结论。
程序如下:
odule speed_get(clk,rst_n,hall_a,hall_b,speed
);
input clk;
input rst_n;
input hall_a;
input hall_b;
//input hall_c;
output [15:0] speed;
reg hall_ar1,hall_ar2;
reg hall_br1,hall_br2;
//reg hall_cr1,hall_cr2;
always @(posedge clk or negedge rst_n)
if(!rst_n)begin
hall_ar1 <= 1'b0;
hall_ar2 <= 1'b0;
hall_br1 <= 1'b0;
hall_br2 <= 1'b0;
end
else begin
hall_ar1 <= hall_a;
hall_ar2 <= hall_ar1;
hall_br1 <= hall_b;
hall_br2 <= hall_br1;
end
wire hall_speed = hall_ar2 &&(~ hall_br2);
reg hall_speed1;
always @(posedge clk or negedge rst_n)
if(!rst_n)begin
hall_speed1 <= 1'b0;
end
else begin
hall_speed1 <= hall_speed;
end
wire hall_neg = hall_speed1 && ~hall_speed;
wire hall_pos = ~hall_speed1 && hall_speed;
reg [15:0]cnt_speed;
reg [15:0]speed_reg;
reg [1:0] state;
always @(posedge clk or negedge rst_n)
if(!rst_n) begin
cnt_speed <= 16'b0;
state <= 2'b00;
end
else begin
case(state)
2'b00:begin
if(hall_pos) state <= 2'b1;
else state <= 1'b0;
end
2'b01:begin
cnt_speed <= cnt_speed + 1'b1;
if(hall_neg)
state <= 2'b11;
else state <= 2'b01;
end
2'b11:begin
speed_reg <= cnt_speed;
cnt_speed <= 16'b0;
state <= 2'b00;
end
default:state <= 2'b00;
endcase
end
assign speed = speed_reg;
endmodule
对于这个高电平,我做了边沿检测处理,用这2个检测脉冲来启动和清零计数器。
仿真图: