共计 2258 个字符,预计需要花费 6 分钟才能阅读完成。
认识 ABZ 编码器的核心信号
第一次用示波器抓取 ABZ 编码器(Incremental Encoder)输出时,新手常会被各种波形问题困扰。我们先看两种典型波形对比:
- 理想波形 :A/ B 两路方波信号严格保持 90°相位差(Quadrature Phase),Z 信号每转一圈产生单个脉冲
- 失真波形 :可能出现信号毛刺(Glitch)、相位偏移(Phase Shift)或幅度衰减(Amplitude Attenuation)

硬件设计:信号调理电路实战
工业现场电磁环境复杂,原始信号需经过调理才能送入 MCU。推荐电路包含两个关键部分:
circuit LR
A[ABZ 输入] --> B(施密特触发器 SN74LVC1G17)
B --> C(光耦隔离 TLP2361)
C --> D[MCU GPIO]
subgraph 抗干扰设计
B ---|10k 上拉 | VCC
C ---|1uF 去耦电容 | GND
end
- 施密特触发器 :将缓慢变化的信号整形成干净方波,消除回差(Hysteresis)影响
- 光耦隔离 :切断地环路(Ground Loop),典型参数 IF=5mA,Rlimit=680Ω
软件解码:STM32 编码器模式实战
以 STM32F407 为例,使用 TIM2 定时器的编码器接口模式(Encoder Interface Mode):
// 环境:STM32CubeIDE 1.8.0
void Encoder_Init(void) {TIM_Encoder_InitTypeDef sConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 0xFFFF;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
// 关键配置:正交解码模式 + 双沿捕获
sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sConfig.IC1Filter = 0x0F; // 16MHz 时钟下约 680ns 滤波
// 对称配置通道 2
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
sConfig.IC2Filter = 0x0F;
HAL_TIM_Encoder_Init(&htim2, &sConfig);
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
}
工业现场 EMC 设计要点
- 接地处理 :
- 编码器外壳接机柜大地(Chassis Ground)
-
信号地(Signal Ground)通过 1MΩ 电阻并联 1000pF 电容接机柜地
-
电缆选择 :
- 优先选用双绞屏蔽线(Twisted Pair Shielded Cable)
-
屏蔽层 360°端接金属连接器外壳
-
PCB 布局 :
- 信号线临近地平面走线
- 接口处放置 TVS 二极管(如 SMBJ5.0CA)
高级调试:FFT 波形分析法
当出现计数异常时,可用 FFT 工具分析信号质量:
- 采样率设为信号频率 10 倍以上
- 观察频谱中是否出现异常谐波
- 典型故障特征:
- 基波幅度 <1Vpp → 信号衰减
- 二次谐波 >-20dBc → 波形畸变
关键算法实现
32 位计数扩展
int32_t Get_FullCount(void) {
static uint16_t last_cnt = 0;
static int32_t total = 0;
uint16_t curr_cnt = TIM2->CNT;
int16_t delta = (int16_t)(curr_cnt - last_cnt);
total += delta;
last_cnt = curr_cnt;
return total;
}
带时间戳的转速计算
float Get_Speed_RPM(uint32_t sample_ms) {
static int32_t last_count = 0;
static uint32_t last_time = 0;
int32_t curr_count = Get_FullCount();
uint32_t curr_time = HAL_GetTick();
float rpm = (curr_count - last_count) * 60000.0f
/ (ppr * (curr_time - last_time)); // ppr: 每转脉冲数
last_count = curr_count;
last_time = curr_time;
return rpm;
}
实战挑战:相位误差分析
观察以下故障波形特征:
– A/ B 信号相位差从 90°变为 180°
– Z 信号位置正常
可能成因:
1. 编码器安装偏心导致 A / B 道光栅错位
2. 信号调理电路某通道反相
3. 电缆线序接错(如 A +/A- 反接)
请用示波器 XY 模式观察李萨如图形(Lissajous Curve),配合互换 A / B 通道的方法定位故障源。
正文完
