3、霍尔传感器与位置检测

好,咱们进入第三章。这一章讲的是窗帘电机的「眼睛」——霍尔传感器。

你想想看,电机在转,你怎么知道窗帘走到哪了?开到头了还是关到底了?全靠霍尔传感器来感知位置。我在做第一个窗帘电机项目时,就吃过位置不准的亏。后来才明白,霍尔信号处理不好,整个系统都是白搭。

3.1 霍尔传感器工作原理

霍尔传感器,说白了就是利用霍尔效应来检测磁场变化。电机转子上有磁铁,每转一圈,霍尔传感器就会输出一个脉冲信号。

我个人习惯把霍尔传感器分成两类:

  • 开关型霍尔:磁场强度超过阈值就输出低电平,否则高电平。简单粗暴,适合做脉冲计数。
  • 线性霍尔:输出模拟电压,能反映磁场强弱变化。精度更高,但处理起来也麻烦些。

窗帘电机里,绝大多数用的是开关型霍尔。为什么?因为成本低、接口简单,一个GPIO就能搞定。

小提示: 我建议你在选型时注意霍尔传感器的「磁滞」参数。磁滞太小,信号容易抖动;磁滞太大,响应又慢。一般选10-20高斯磁滞的型号比较稳妥。

3.2 脉冲计数与位置换算

好,传感器信号有了,接下来就是怎么算位置。

电机每转一圈,霍尔输出N个脉冲。这个N取决于电机极对数和霍尔安装位置。比如一个4极对电机,配3个霍尔,一圈就是12个脉冲。

位置换算公式其实很简单:

当前位置(圈) = 累计脉冲数 / 每圈脉冲数
当前位置(mm) = 当前位置(圈) × 丝杆导程(mm/圈)

举个例子:

每圈脉冲数 = 12
丝杆导程 = 5 mm/圈
累计脉冲数 = 360

当前位置 = 360 / 12 = 30 圈
窗帘移动距离 = 30 × 5 = 150 mm

嗯,这里要注意一个坑。我在项目中遇到过,电机启动和停止时,霍尔信号会有「毛刺」。这些毛刺会导致多计数或少计数。怎么解决?

  • 软件消抖:连续采样3次,值一致才认为有效。我一般用5ms的采样间隔。
  • 硬件滤波:在霍尔输出引脚加一个RC低通滤波,时间常数选1-2ms。
  • 方向判断:用两个霍尔信号做正交解码,能同时知道位置和方向。
警告: 千万别在中断里做除法运算!MCU的除法指令很慢,会拖死系统。我习惯的做法是:中断里只做累加,主循环里再换算位置。

3.3 中断服务程序(ISR)测试方法

ISR的测试,说实话是单元测试里最头疼的部分。为什么?因为中断是异步的,你没法控制它什么时候触发。

我总结了一套ISR测试的「三板斧」:

  1. 打桩法:把ISR里的核心逻辑抽出来,封装成一个普通函数。测试这个函数,而不是直接测ISR。
  2. 模拟触发法:用定时器或软件方式,模拟霍尔信号的上升沿和下降沿。
  3. 覆盖率分析:确保ISR里的每个分支都被执行到。特别是边界条件,比如脉冲溢出、方向反转。

举个例子,这是ISR的核心逻辑:

// 霍尔ISR核心处理函数(可测试)
void hall_isr_handler(uint8_t hall_state) {
    static uint8_t last_state = 0;
    
    // 检测上升沿
    if ((hall_state & 0x01) && !(last_state & 0x01)) {
        pulse_count++;
    }
    
    // 检测下降沿
    if (!(hall_state & 0x01) && (last_state & 0x01)) {
        pulse_count--;
    }
    
    last_state = hall_state;
    
    // 溢出保护
    if (pulse_count > MAX_PULSE) {
        pulse_count = MAX_PULSE;
    }
    if (pulse_count < 0) {
        pulse_count = 0;
    }
}

测试时,你只需要调用 hall_isr_handler(),传入不同的状态值,就能验证逻辑是否正确。

重点: ISR测试的核心原则——「把异步变同步,把不可控变可控」。别试图在真实中断环境下调试,那是在给自己找麻烦。

3.4 模拟霍尔信号进行单元测试

好,到了实操环节。怎么模拟霍尔信号?

我常用的方法有三种:

方法 工具 优点 缺点
GPIO模拟 另一个MCU的GPIO 成本低,灵活 频率受限
信号发生器 函数信号发生器 频率精准,波形好 需要额外设备
软件模拟 定时器+中断 无需硬件,方便调试 不够真实

我个人最推荐的是「GPIO模拟法」。为什么?因为你可以用另一个MCU或者开发板,精确控制脉冲的频率、占空比、相位差。我曾经用一块STM32F103专门做霍尔信号模拟器,配合上位机软件,想生成什么波形就生成什么波形。

下面是一个简单的软件模拟代码:

// 用定时器模拟霍尔信号
void timer_hall_sim_callback(void) {
    static uint8_t hall_state = 0;
    static uint16_t pulse_count = 0;
    
    // 每10ms翻转一次状态
    hall_state ^= 0x01;
    
    // 模拟霍尔信号输出
    HAL_GPIO_WritePin(HALL_SIM_GPIO, HALL_SIM_PIN, hall_state);
    
    pulse_count++;
    
    // 模拟100个脉冲后停止
    if (pulse_count >= 200) {
        HAL_TIM_Base_Stop_IT(&htim6);
    }
}

测试时,你只需要启动这个定时器,然后观察窗帘电机的位置计算是否正确。

经验之谈: 模拟霍尔信号时,一定要测试「异常情况」。比如:脉冲丢失、脉冲毛刺、电机反转。这些在真实场景中都会遇到。我吃过一次亏,产品量产了才发现反转时位置会乱跳。从那以后,我的测试用例里必加「反转测试」。

最后,总结一下霍尔传感器测试的几个关键点:

  • 信号质量:确保霍尔信号没有抖动和毛刺
  • 计数精度:长时间运行后,累计误差不能超过1个脉冲
  • 边界处理:脉冲溢出、方向反转、掉电保存
  • 实时性:ISR执行时间不能超过霍尔信号周期的一半

嗯,这一章就到这里。下一章我们讲电机驱动与PWM控制,那又是另一番天地了。