mage100

无刷直流电机控制---------霍尔信号测速

0
阅读(6343)

作为电机控制的2个环路之一速度环。

这里采用霍尔信号进行测速。

再来看霍尔的时序图
 
 
一次高电平对应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个检测脉冲来启动和清零计数器。
 
仿真图