4、信号采集与处理:霍尔信号捕获方法、边沿检测算法、速度计算原理、M法与T法测速

好,咱们进入第四章。这一章讲的是速度环的「眼睛」和「尺子」——怎么把霍尔传感器的物理信号变成单片机认识的数字,再算出电机转得有多快。

说实话,很多新手调不好速度环,问题往往不在PID参数上,而是速度反馈本身就不准。你想想看,如果测速本身就忽快忽慢,那控制器再怎么调也是白搭。所以这一章的内容,是后面所有调参工作的基础。

核心要点:霍尔信号采集的实时性、边沿检测的可靠性、速度计算的精度,三者缺一不可。任何一个环节出问题,速度环都会「抽风」。

4.1 霍尔信号捕获方法

霍尔传感器输出的是开关信号,高电平表示有磁场,低电平表示没有。三个霍尔元件(HA、HB、HC)组合起来,就能给出转子位置信息。

捕获这些信号,我一般用两种方式:

  • 外部中断捕获:把三个霍尔信号接到MCU的外部中断引脚上,每个边沿都触发中断。这种方式响应最快,但中断频率高的时候会占用大量CPU时间。
  • 定时器输入捕获:利用定时器的捕获通道,记录边沿发生的时间戳。这种方式适合需要精确测量时间间隔的场景。

我个人习惯用外部中断+定时器时间戳的组合。中断来了,先读霍尔状态,再读定时器的计数值,这样既保证了实时性,又能拿到精确的时间信息。

小技巧:如果MCU中断资源紧张,可以用一个外部中断引脚加一个GPIO查询的方式。比如只把HA接到中断引脚上,HB和HC用普通IO口,中断触发后再去读另外两个的状态。我在一个低成本项目里就这么干过,省了两个中断通道。

4.2 边沿检测算法

霍尔信号最怕什么?抖动。电机启动瞬间、换相瞬间、或者受到外部干扰时,霍尔信号上会出现毛刺。如果不做处理,一个正常的换相事件可能被误判成好几次。

边沿检测的核心就是「去抖」和「确认」。

我常用的方法有两种:

  1. 软件延时去抖:检测到边沿后,先不急着响应,等个几十微秒再读一次。如果状态没变,就确认是有效边沿。这个方法简单,但会引入延迟。
  2. 连续采样确认:连续采样N次,如果N次中有M次(比如3次中有2次)状态一致,就认为边沿有效。这个方法抗干扰能力强,适合噪声大的环境。

我曾经在一个工业风机项目里遇到过一个问题:电机启动时霍尔信号抖动特别厉害,用延时去抖怎么都调不好。后来换成连续采样确认,把采样窗口设成100微秒,问题就解决了。嗯,这里要注意,采样窗口不能太长,否则会错过真正的换相事件。

// 连续采样确认边沿示例代码
uint8_t Hall_Debounce(uint8_t current_state) {
    static uint8_t stable_state = 0;
    static uint8_t count = 0;
    const uint8_t THRESHOLD = 3;  // 连续3次一致才确认
    
    if (current_state == stable_state) {
        count++;
        if (count >= THRESHOLD) {
            count = THRESHOLD;  // 防止溢出
            return stable_state;
        }
    } else {
        count = 0;
        stable_state = current_state;
    }
    
    return 0xFF;  // 返回无效状态,表示未确认
}

4.3 速度计算原理

速度计算说白了就是「距离除以时间」。在电机控制里,距离就是转子转过的角度,时间就是转过这个角度所用的时间。

霍尔传感器每60度电角度换相一次(对于三相无刷直流电机),所以每次霍尔状态变化,转子就转过了60度电角度。如果我们能测出两次换相之间的时间间隔,速度就出来了。

公式很简单:

速度 = 60度 / 时间间隔

但实际工程里,我们通常用每分钟转数(RPM)来表示速度。所以需要做单位换算:

RPM = (60 / 时间间隔_秒) / (极对数 * 6)

为什么除以极对数乘以6?因为一个电周期对应一对磁极,而一个机械周期有极对数个电周期。每次霍尔变化是60度电角度,一个电周期有6次变化。所以机械转速 = 电频率 / 极对数。

注意:极对数这个参数一定要设对。我见过有人把4对极的电机设成2对极,结果算出来的速度翻了一倍,PID怎么调都震荡。后来查了半天才发现是这里错了。

4.4 M法与T法测速

测速方法主要有两种:M法和T法。很多教材讲得挺玄乎,其实说白了就是两种不同的「数数」方式。

方法 原理 适用场景 精度特点
M法 固定时间内数脉冲个数 高速 高速时精度高,低速时误差大
T法 测量相邻脉冲的时间间隔 低速 低速时精度高,高速时误差大

M法测速:

设定一个固定的采样周期(比如10ms),在这个周期内数一下霍尔状态变化了多少次。次数乘以每次变化对应的角度,再除以时间,就是速度。

优点:实现简单,适合高速。缺点:低速时脉冲少,一个脉冲的误差就会导致很大的速度波动。

T法测速:

测量两次霍尔变化之间的时间间隔。用固定的角度(60度电角度)除以这个时间间隔,得到瞬时速度。

优点:低速时精度很高。缺点:高速时时间间隔太短,定时器分辨率不够的话误差会很大。

我在实际项目中怎么选?看转速范围。如果电机经常工作在1000RPM以上,我用M法。如果经常在几百转甚至几十转,我用T法。如果转速范围很宽,那就M法和T法结合——高速用M法,低速用T法,中间做个平滑切换。

实战经验:我做过一个伺服项目,要求从1RPM到3000RPM都能精确测速。最后用了M/T法结合:当转速高于500RPM时用M法,低于500RPM时用T法,切换点附近做加权平均。效果还不错,速度波动控制在±1RPM以内。

下面这张图能帮你理清整个信号采集与速度计算的流程:

霍尔信号采集与速度计算流程图 霍尔传感器 (HA/HB/HC) 信号捕获:外部中断 / 输入捕获 边沿检测:去抖 + 确认 转速判断 低速 T法:测量时间间隔 高速 M法:固定时间数脉冲 说明:根据实际转速范围选择M法或T法,宽范围应用可M/T法结合并在切换点做平滑过渡

最后说一句,测速方法选好了,代码写对了,但实际跑起来可能还是有问题。别急,先拿示波器看看霍尔信号的波形,确认边沿是不是干净。很多时候,问题出在硬件上,而不是算法上。