共计 1462 个字符,预计需要花费 4 分钟才能阅读完成。
问题复现
遇到电机能正常转动,但编码器读数始终为零或随机跳变的情况,首先需要明确这是典型的霍尔信号丢失问题。表现为:

- 电机运行时串口监视器持续输出 0 或固定值
- 偶尔出现非规律性数值跳变(如 65535)
- 转速变化时读数无响应
硬件检测实战
第一步:供电检测
- 断开电机电源,保持控制板上电
- 将万用表调至直流电压档
- 红色表笔接触霍尔传感器 VCC 引脚(通常为中间引脚)
- 黑色表笔接触 GND 引脚
正常应测得 4.75-5.25V 电压,若低于 4.5V 需检查:
- 电源模块输出能力
- 线路压降(尤其长导线时)
- 接触电阻(氧化或虚焊)
第二步:信号捕捉
需要 100MHz 以上带宽示波器,操作步骤:
- 通道 1 探头接霍尔输出信号线(黄 / 绿线)
- 接地夹接电机金属外壳(必须!)
- 触发模式设为边沿触发
- 时基调至 500μs/div
正常波形特征:
- 方波幅度接近 VCC 电压
- 占空比 40%-60%
- 频率随转速线性变化
异常波形包括:
- 幅值不足(<3V)
- 毛刺过多
- 波形畸变成三角波
软件调试技巧
Arduino 中断法示例
// PlatformIO 项目配置
[env:uno]
platform = atmelavr
board = uno
framework = arduino
// 主程序
volatile long pulseCount = 0;
void setup() {Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt(2), countPulse, RISING); // 接 Hall-A
}
// 带消抖的中断服务程序
void countPulse() {
static unsigned long lastTime = 0;
if(micros() - lastTime > 200) { // 200μs 消抖
pulseCount++;
lastTime = micros();}
}
关键点说明:
- STM32 需配置输入滤波器(TIMx_CCMR1 寄存器的 IC1F[3:0] 位)
- 消抖时间根据转速调整(高速时需缩短)
- 避免在中断内调用 Serial.print
干扰排查手册
常见干扰源
- PWM 线与信号线平行走线(最小间距 3 倍线宽)
- 电机电源与逻辑电源共地阻抗过大
- 未使用屏蔽线(推荐 AWG24 双绞屏蔽线)
电源纹波检测
- 示波器设为 AC 耦合
- 探头接电源正极
- 带宽限制设为 20MHz
- 测量峰峰值应 <50mV
避坑指南
- 霍尔传感器安装:气隙 0.5-1.5mm(用塞尺校准)
- 磁铁极性:用指南针测试 NS 极朝向(霍尔有标记面应对准 S 极)
- 多极磁环需对齐中心(偏差 <0.3mm)
进阶验证方案
信号模拟测试
使用函数发生器输出 90°相位差的两路方波:
- 通道 1:1kHz, 5Vpp, 占空比 50%
- 通道 2:相同参数,相位延迟 250μs
- 接入控制器替代真实霍尔信号
Python 数据分析脚本
# 需先安装:pip install pandas numpy
import pandas as pd
# 读取串口数据
log = pd.read_csv('encoder_log.csv')
# 计算丢脉冲率
expected = log['rpm'].mean() * 12 * 0.02 # 12PPR, 20ms 采样周期
actual = log['count'].diff().mean()
loss_rate = (expected - actual)/expected * 100
print(f"丢脉冲率:{loss_rate:.2f}%")
安全警示
- 示波器接地夹必须连接(浮地测量可能损坏设备)
- 电机断电后再改接线
- 避免磁铁靠近手机 / 信用卡
开放思考
当同时存在编码器和 IMU 数据时,如何用卡尔曼滤波融合多传感器数据?这是提升定位精度的关键步骤,建议从状态方程建模开始探索。
正文完
发表至: 未分类
近两天内
