4、霍尔信号建模:120°与60°霍尔布局、换相表生成、霍尔信号跳变沿检测

霍尔传感器,说白了就是电机里告诉你「转子现在转到哪了」的眼睛。做无刷直流电机控制,第一步就得把这双眼睛的脾气摸透。我刚开始接触霍尔信号时,总觉得不就是三个高低电平嘛,后来在项目里吃过亏才明白——霍尔布局差一度,电机就抖一下,换相表错一位,电流就炸一次。

这一节,咱们就把霍尔信号的建模掰开揉碎了讲。从两种常见的布局方式开始,再到换相表的自动生成,最后聊一聊跳变沿检测的硬件实现。

4.1 120°与60°霍尔布局

霍尔传感器在电机定子上的安装位置,决定了你看到的信号长什么样。目前主流有两种布局:120°电气角和60°电气角。

核心区别一句话:120°布局下,任意时刻只有一个霍尔信号跳变;60°布局下,任意时刻有两个霍尔信号同时跳变。这个差异直接影响换相逻辑的复杂度。

4.1.1 120°布局

三个霍尔传感器在空间上相隔120°电气角。转子每转过一圈(360°电气角),每个霍尔输出一个高电平和一个低电平,各占180°。三个信号彼此错开120°,组合起来就是6个状态。

我习惯用一张表来记录这个关系:

电气角度 HA HB HC 状态编号
0° ~ 60° 1 0 1 5 (101)
60° ~ 120° 1 0 0 4 (100)
120° ~ 180° 1 1 0 6 (110)
180° ~ 240° 0 1 0 2 (010)
240° ~ 300° 0 1 1 3 (011)
300° ~ 360° 0 0 1 1 (001)

你看,状态编号是按二进制排列的,但顺序不是递增的。这个顺序就是换相的依据。我在FPGA里验证时,经常用这个表做查表法,速度快,逻辑也清晰。

4.1.2 60°布局

60°布局下,三个霍尔传感器相隔60°。每个霍尔信号的高电平只占120°,低电平占240°。三个信号组合起来,同样得到6个状态,但状态切换的规律和120°布局不一样。

嗯,这里要注意:60°布局的换相表不能直接从120°的表推导出来,必须重新计算。我曾经在项目里偷懒,想直接改个偏移量就完事,结果电机转起来一顿一顿的,查了半天才发现是换相表错了。

电气角度 HA HB HC 状态编号
0° ~ 60° 1 0 0 4 (100)
60° ~ 120° 1 1 0 6 (110)
120° ~ 180° 0 1 0 2 (010)
180° ~ 240° 0 1 1 3 (011)
240° ~ 300° 0 0 1 1 (001)
300° ~ 360° 1 0 1 5 (101)

个人经验:如果你在做电机控制芯片的FPGA验证,建议把两种布局的换相表都做成参数化的。这样在验证不同电机型号时,只需要改一个参数,不用重新写逻辑。我自己的验证环境里,就用了一个 HALL_LAYOUT 参数,120°还是60°,一行代码搞定。

4.2 换相表生成

换相表,就是把霍尔状态映射到三相桥臂的导通组合。说白了,就是告诉逆变器:现在该让哪两个管子导通,哪个管子关断。

对于三相六步换相,每个状态对应一个导通组合。以120°布局为例,假设我们采用上管PWM、下管常通的调制方式,换相表长这样:

霍尔状态 A+ A- B+ B- C+ C-
101 (5) 1 0 0 1 0 0
100 (4) 1 0 0 0 0 1
110 (6) 0 0 1 0 0 1
010 (2) 0 1 1 0 0 0
011 (3) 0 1 0 0 1 0
001 (1) 0 0 0 1 1 0

你想想看,这个表其实就是一个6×6的查找矩阵。在FPGA里实现时,我通常用case语句或者ROM来存。用ROM的好处是,换相表可以随时更新,调试时特别方便。

下面是我在Verilog里常用的换相表生成方式:

// 120°布局换相表,使用case语句实现
always @(*) begin
    case (hall_state)
        3'b101: pwm_out = 6'b100100;  // A+ B- 导通
        3'b100: pwm_out = 6'b100001;  // A+ C- 导通
        3'b110: pwm_out = 6'b010001;  // B+ C- 导通
        3'b010: pwm_out = 6'b011000;  // B+ A- 导通
        3'b011: pwm_out = 6'b001010;  // C+ A- 导通
        3'b001: pwm_out = 6'b001100;  // C+ B- 导通
        default: pwm_out = 6'b000000; // 无效状态,全部关断
    endcase
end

避坑指南:我曾经在验证时发现,电机在低速时偶尔会出现霍尔状态跳变异常,比如从101直接跳到001,中间跳过了100。这种情况如果不做滤波,换相表会输出错误的导通组合,导致电流尖峰。所以,换相表前面一定要加一个状态机做合法性检查,或者至少做一个去抖处理。

4.3 霍尔信号跳变沿检测

换相的核心触发事件,就是霍尔信号的跳变沿。每次霍尔状态变化,都意味着转子转过了60°电气角,需要立即更新换相输出。

跳变沿检测在数字电路里是个基本功,但用在霍尔信号上有个坑——霍尔信号本身有毛刺。电机运行时,电磁干扰会耦合到霍尔线上,产生虚假跳变。如果不处理,换相逻辑会被频繁误触发。

我常用的做法是三级同步加边沿检测:

  1. 三级同步器:把霍尔信号同步到系统时钟域,消除亚稳态。
  2. 去抖滤波:连续采样N个周期,信号稳定后才认为有效。
  3. 边沿检测:用寄存器打一拍,检测上升沿或下降沿。

下面是一个典型的Verilog实现:

// 三级同步 + 边沿检测
reg [2:0] hall_sync;
reg [2:0] hall_delay;

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        hall_sync  <= 3'b000;
        hall_delay <= 3'b000;
    end else begin
        hall_sync  <= {hall_sync[1:0], hall_raw};
        hall_delay <= hall_sync[2];
    end
end

// 检测任意一位的跳变
wire hall_edge = (hall_sync[2] != hall_delay);

嗯,这里要注意:hall_raw 是三个霍尔信号的组合,我习惯打包成一个3位向量来处理。这样边沿检测只需要一个异或门,资源省不少。

4.3.1 跳变沿触发的换相流程

检测到跳变沿后,换相逻辑的完整流程是这样的:

  • 读取当前霍尔状态
  • 查换相表,得到目标导通组合
  • 更新PWM输出
  • 记录当前状态,用于下一次跳变判断

这个流程必须在几个时钟周期内完成,否则换相延迟会导致转矩脉动。我在FPGA里实测过,从霍尔跳变到PWM更新,最好控制在5个时钟周期以内。对于50MHz的系统时钟,也就是100ns,完全来得及。

个人习惯:我会在换相完成的同时,拉高一个标志位,持续一个时钟周期。这个标志位可以用来触发电流采样、速度计算等后续任务。相当于用换相事件做了一次同步,省掉了额外的定时器。

4.4 霍尔信号建模的SVG流程图

下面这张图把霍尔信号建模的完整流程串起来了。从霍尔布局选择开始,到换相表生成,再到跳变沿检测和换相执行,每一步都对应着具体的硬件模块。

霍尔信号建模与换相逻辑流程图 霍尔信号建模与换相逻辑流程图 霍尔布局选择 120°布局换相表 60°布局换相表 换相表存储(ROM/Case) 霍尔信号跳变沿检测 三级同步 + 去抖滤波 + 边沿检测 换相执行:更新PWM输出 等待下一次跳变 开始 循环 选择布局方式 生成对应换相表

这张图把整个流程分成了五个阶段。你从顶部往下看,先选布局,再生成换相表,然后存起来,等霍尔跳变一来就查表换相。最后回到等待状态,形成一个闭环。

我个人觉得,这个流程里最容易出问题的地方是跳变沿检测。如果去抖参数设得太小,毛刺会误触发;设得太大,又会延迟换相。我一般根据电机的最高转速来算,保证在最高转速下,去抖时间不超过电气周期的1/20。

举个例子,一个电机最高转速3000rpm,极对数为4,那么电气频率就是200Hz,周期5ms。去抖时间我通常设在50μs到100μs之间,也就是电气周期的1%到2%。这个值既能滤掉大部分干扰,又不会明显影响换相精度。

总结一下:霍尔信号建模的核心就三件事——选对布局、生成正确的换相表、可靠地检测跳变沿。这三件事做好了,电机就能平稳地转起来。剩下的就是调PID参数和优化效率了,那是后面章节的内容。