共计 2412 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点:为什么 ABZ 信号会 ” 说谎 ”?
在伺服电机控制现场,我们经常遇到这些诡异现象:

- 电机静止时计数器仍在缓慢跳动(噪声干扰)
- 高速运行时累计位置突然 ” 丢步 ”(信号边沿丢失)
- Z 相信号偶尔无法触发原点(脉冲宽度不足)
这些问题会导致:
- 定位精度下降(±5 个脉冲误差就能让 CNC 机床加工出废品)
- 速度环波动(表现为电机 ” 一卡一卡 ”)
- 原点重复定位偏差
三大解决方案华山论剑
方案 1:硬件 RC 滤波
- 优点:成本最低(几个电阻电容搞定)
- 缺点:
- 相位延迟随转速变化(200Hz 滤波会导致高速时 15°相位滞后)
- 无法区分噪声与真实信号(特别是高频抖动)
方案 2:数字滤波器
卡尔曼滤波示例代码片段:
// 预测阶段
position_pred = last_position + speed * dt;
err_cov_pred = err_cov_last + process_noise;
// 更新阶段
kalman_gain = err_cov_pred / (err_cov_pred + measure_noise);
current_position = position_pred + kalman_gain * (raw_encoder - position_pred);
– 优势:动态调整滤波强度
– 致命伤:M4 内核 MCU 单次计算需要 28us(120MHz 主频时)
方案 3:专用正交解码 IC
以 LS7366 为例:
- 内置 4x 解码硬件电路
- 32 位计数器
- 最高 10MHz 输入频率
实测对比表:
| 方案 | 成本 | 延迟 | 适用场景 |
|—————|——|——|————–|
| RC 滤波 | ¥0.5 | 1-5us | 低速场合 |
| 数字滤波 | ¥0 | 20-50us | 中速高算力 |
| LS7366 | ¥15 | <100ns | 高速精密控制 |
手把手实现四倍频解码
硬件设计黄金法则
- 信号调理电路:
- 施密特触发器选用 SN74LVC1G17(迟滞窗口 0.8V)
- 光电隔离推荐 HCPL-2631(传播延迟 <50ns)
-
上拉电阻取值 2.2kΩ(平衡功耗与边沿速度)
-
PCB 布局要点:
- 编码器信号线必须做阻抗匹配(典型值 120Ω)
- 电源引脚放置 0.1uF+10uF 去耦电容组合
- 信号线与其他线路间距≥3 倍线宽
状态机解码算法
状态转移图:
当前状态 \ 输入 | A 上升 | A 下降 | B 上升 | B 下降
------------------------------------------------
初始 (00) | 01(+1)| 11(-1)| 10(+1)| 11(-1)
状态 01 | - | 00(-1)| 11(+1)| 00(-1)
状态 10 | 11(+1)| 00(-1)| - | 00(+1)
状态 11 | - | 10(+1)| 01(-1)| -
ARM Cortex-M4 实现代码:
// 寄存器级配置(以 STM32 为例)TIM1->CCMR1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; // 映射 TI1/TI2 到 CC1/CC2
TIM1->SMCR |= TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; // 编码器模式 3
// 中断服务程序
void TIM1_IRQHandler(void) {if(TIM1->SR & TIM_SR_UIF) {
// 溢出处理
overflows += (TIM1->CR1 & TIM_CR1_DIR) ? -1 : 1;
TIM1->SR = ~TIM_SR_UIF;
}
}
// 获取完整位置(带溢出处理)int64_t get_full_position() {__disable_irq(); // 进入临界区
int64_t pos = (int64_t)overflows << 16 | TIM1->CNT;
__enable_irq();
return pos;
}
脉冲丢失补偿策略
当检测到以下情况时触发补偿:
1. 连续 4 个 A 脉冲无 B 脉冲变化(判定 B 相丢失)
2. 脉冲间隔超过 3 倍预期周期(判定漏脉冲)
补偿算法:
void compensate_loss(uint32_t expected_period) {uint32_t actual_period = get_current_period();
if(actual_period > 3 * expected_period) {position += (actual_period / expected_period - 1) * direction;
}
}
实测数据说话
测试条件:
– 电机转速 3000RPM(50Hz 信号频率)
– 2500 线编码器
改善前后对比:
| 指标 | 原始信号 | 优化方案 |
|—————|———|———-|
| 位置误差 | ±8LSB | ±1LSB |
| 速度波动率 | 3.2% | 0.7% |
| 原点重复精度 | 50μm | 5μm |
示波器捕获波形:
原始信号:A 相___|¯¯|___|¯¯|___|¯¯ (有明显振铃)
优化后:A 相______|¯¯|______|¯¯| (边沿干净利落)
老司机避坑指南
电缆长度与信号完整性
- 非屏蔽线最大长度:
- 1Mbps 速率:≤3 米
- 100kbps 速率:≤15 米
- 推荐使用双绞屏蔽线(如 Belden 8760)
转速与采样频率的 ” 安全婚约 ”
采样定理实践公式:
最小采样频率 = 4 * 编码器线数 * 最大转速 (RPM) / 60 * 安全系数 (1.5)
示例:
– 2500 线编码器
– 3000RPM 转速
– 所需采样频率 = 425003000/60*1.5 = 750kHz
ESD 防护三件套
- TVS 管:SMF05C(5V 钳位电压)
- 共模扼流圈:DLW21HN 系列
- 接地:机壳接地点到编码器外壳电阻 <0.1Ω
思考题:多编码器同步采集
当系统需要同时处理 3 个编码器时:
1. 如何保证采样时刻一致性?(提示:使用 TIM 的触发输入功能)
2. 怎样避免中断冲突?(考虑 DMA+ 双缓冲技术)
推荐调试工具:
– Saleae Logic Pro 16(16 通道逻辑分析仪)
– 触发条件设置:A&B 相边沿组合触发
小技巧:用示波器的 XY 模式可以直观观察正交信号质量,理想情况下应该看到完美的圆形李萨如图形。
