3、霍尔传感器与位置检测
好,咱们进入第三章。这一章讲的是窗帘电机的「眼睛」——霍尔传感器。
你想想看,电机在转,你怎么知道窗帘走到哪了?开到头了还是关到底了?全靠霍尔传感器来感知位置。我在做第一个窗帘电机项目时,就吃过位置不准的亏。后来才明白,霍尔信号处理不好,整个系统都是白搭。
3.1 霍尔传感器工作原理
霍尔传感器,说白了就是利用霍尔效应来检测磁场变化。电机转子上有磁铁,每转一圈,霍尔传感器就会输出一个脉冲信号。
我个人习惯把霍尔传感器分成两类:
- 开关型霍尔:磁场强度超过阈值就输出低电平,否则高电平。简单粗暴,适合做脉冲计数。
- 线性霍尔:输出模拟电压,能反映磁场强弱变化。精度更高,但处理起来也麻烦些。
窗帘电机里,绝大多数用的是开关型霍尔。为什么?因为成本低、接口简单,一个GPIO就能搞定。
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。
- 方向判断:用两个霍尔信号做正交解码,能同时知道位置和方向。
3.3 中断服务程序(ISR)测试方法
ISR的测试,说实话是单元测试里最头疼的部分。为什么?因为中断是异步的,你没法控制它什么时候触发。
我总结了一套ISR测试的「三板斧」:
- 打桩法:把ISR里的核心逻辑抽出来,封装成一个普通函数。测试这个函数,而不是直接测ISR。
- 模拟触发法:用定时器或软件方式,模拟霍尔信号的上升沿和下降沿。
- 覆盖率分析:确保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(),传入不同的状态值,就能验证逻辑是否正确。
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控制,那又是另一番天地了。