共计 1515 个字符,预计需要花费 4 分钟才能阅读完成。
核心概念
正交编码器通过 A / B 两相方波信号的 90°相位差实现方向判别。1024 线表示编码器转轴每旋转一圈产生 1024 个脉冲周期,机械角度分辨率为 360°/1024≈0.35°。实际应用中通过 4 倍频技术可将电气分辨率提升至 4096 脉冲 / 圈(±0.088°)。

示波器实测波形特征:
- 正转时 A 相上升沿对应 B 相高电平
- 反转时 A 相上升沿对应 B 相低电平
- 信号占空比应为 50%±10%
痛点分析
工业现场典型问题:
- 电磁干扰导致信号抖动(表现为 <100ns 的异常脉冲)
- 长线传输引发的信号畸变(上升沿 >500ns 时可能丢失计数)
- 机械振动引起的接触不良(多见于增量式编码器)
- 高速旋转时的信号丢失(1MHz 以上时需考虑信号完整性)
技术方案
硬件层设计
RC 滤波电路参数计算:
截止频率 f_c = 1/(2πRC)
建议取值:- 常规场景:R=100Ω±5%, C=100pF±10%(f_c≈16MHz)- 强干扰环境:R=1kΩ±1%, C=1nF±5%(f_c≈160kHz)
软件层实现
状态机去抖动算法(STM32 示例):
// 状态定义
typedef enum {
STATE_STABLE,
STATE_DEBOUNCE
} EncoderState;
// 去抖动处理
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
static EncoderState state = STATE_STABLE;
static uint32_t last_time = 0;
if(GPIO_Pin == ENCODER_A_PIN) {uint32_t now = HAL_GetTick();
switch(state) {
case STATE_STABLE:
if(now - last_time < DEBOUNCE_MS) {state = STATE_DEBOUNCE;} else {
// 有效计数处理
processEncoderCount();}
last_time = now;
break;
case STATE_DEBOUNCE:
if(now - last_time >= DEBOUNCE_MS) {state = STATE_STABLE;}
break;
}
}
}
性能对比
测试条件:1000RPM(16.67 转 / 秒)
| 处理方式 | 误码率 | 相位延迟 |
|---|---|---|
| 原始信号 | 1.2% | – |
| 纯硬件滤波 | 0.3% | 15μs |
| 硬件 + 软件处理 | <0.01% | 28μs |
避坑指南
- 差分信号布线 :
- 阻抗控制在 100Ω±10%
- 线长差 <5mm
-
避免与功率线平行走线
-
光耦隔离选型 :
- 推荐 CTR 值在 50%-200% 之间
- 响应时间 <500ns(如 TLP2361)
-
共模抑制比 >25kV/μs
-
中断保护措施 :
- 使用__disable_irq()/__enable_irq() 包裹关键代码
- 计数器变量声明为 volatile
- 避免在 ISR 中进行浮点运算
扩展思考
CAN 总线传输方案设计要点:
- 数据帧格式:
- 11 位标识符(包含设备 ID 和数据类型)
-
8 字节数据域(32 位计数值 +16 位 CRC)
-
CRC 校验实现:
uint16_t calcCRC16(uint8_t *data, uint32_t len) { uint16_t crc = 0xFFFF; while(len--) { crc ^= *data++ << 8; for(uint8_t i=0; i<8; i++) crc = (crc & 0x8000) ? (crc << 1) ^ 0x1021 : crc << 1; } return crc; }
工程实践建议
- PCB 布局优先级:
- 编码器接口靠近 MCU 放置
- 滤波电容紧挨连接器引脚
-
地平面保持完整
-
EMC 防护措施:
- 信号线两端加 TVS 二极管(如 SMBJ5.0CA)
- 金属外壳接大地
- 使用屏蔽双绞线(AWG24 以上)
通过上述措施,我们在数控机床进给系统实测达到±0.05°的重复定位精度,验证了方案的可靠性。
正文完
发表至: 未分类
近一天内
