共计 2024 个字符,预计需要花费 6 分钟才能阅读完成。
信号特征解析
使用示波器捕获 ABZ 信号(1V/div,10μs/div)可见:
– A/ B 两相存在 90°相位差,Z 相每转产生单脉冲(典型脉宽 1 /4T)
– 正交编码模式下,A 相上升沿时 B 相电平状态决定方向(B= 1 正向,B= 0 反向)
– 与纯正交编码相比,Z 信号提供绝对位置校准点,消除累计误差

硬件层设计规范
- 信号调理电路
- 推荐 ISO7240C 数字隔离芯片(10Mbps 带宽)
- 施密特触发器阈值计算:
V_T+ = (R2/(R1+R2)) * VCC + 0.7V V_T- = (R2/(R1+R2)) * VCC - 0.7V -
典型值:R1=10kΩ, R2=20kΩ @5V 系统
-
EMC 防护设计
- 共模扼流圈选型要点:
- 阻抗 Z≥100Ω@100MHz
- 饱和电流 >2 倍工作电流
- TVS 管布局:
- P6KE6.8CA(双向)
- 距连接器 <10mm
算法层实现
STM32 HAL 库配置(TIM 编码器模式)
// TIM3 初始化片段
TIM_Encoder_InitTypeDef encoderConfig = {
.EncoderMode = TIM_ENCODERMODE_TI12,
.IC1Polarity = TIM_ICPOLARITY_RISING,
.IC2Polarity = TIM_ICPOLARITY_RISING
};
HAL_TIM_Encoder_Init(&htim3, &encoderConfig);
__HAL_TIM_SET_COUNTER(&htim3, 32768); // 初始值设为中间值
TIM_RESET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1);
TIM_RESET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_2);
双边沿计数状态机
stateDiagram
[*] --> Idle
Idle --> A_Rise: A 上升沿
A_Rise --> B_High: B=1(正向)
A_Rise --> B_Low: B=0(反向)
B_High --> Count_Up: 计数器 +1
B_Low --> Count_Down: 计数器 -1
应用层实战
CNC 机床 PID 控制集成
// 位置环 PID 计算(1kHz 中断)void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if(htim->Instance == TIM6) {int32_t current_pos = __HAL_TIM_GET_COUNTER(&htim3) - 32768;
int32_t error = target_pos - current_pos;
integral += error;
if(integral > 1000) integral = 1000;
if(integral < -1000) integral = -1000;
output = Kp*error + Ki*integral + Kd*(error - last_error);
last_error = error;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, output);
}
}
Arduino 测试代码
// 引脚定义
#define ENC_A 2
#define ENC_B 3
#define ENC_Z 4
volatile long count = 0;
unsigned long lastTime = 0;
void setup() {pinMode(ENC_A, INPUT_PULLUP);
pinMode(ENC_B, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENC_A), isr_count, CHANGE);
Serial.begin(115200);
}
void isr_count() {if(digitalRead(ENC_A) == digitalRead(ENC_B)) {count++;} else {count--;}
}
void loop() {if(millis() - lastTime > 100) {float rpm = (count * 60000.0) / (2000 * (millis() - lastTime));
Serial.print("RPM:");
Serial.println(rpm);
count = 0;
lastTime = millis();}
}
故障诊断矩阵
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 计数方向反向 | A/ B 相序接反 | 交换 A / B 接线 |
| Z 信号不触发 | 信号幅值不足 | 测量 Z 相电压 (应 >0.7VCC) |
| 高速时丢脉冲 | 中断响应延迟 | 改用硬件编码器接口 |
| 数值跳变 | 电源噪声 | 检查去耦电容 (建议 100nF 贴片) |
工程经验总结
- 中断优化技巧 :
- 在 1MHz 以上脉冲频率时,建议使用 DMA+ 定时器捕获模式
-
STM32 的 TIM 编码器接口最高支持 72MHz 计数时钟
-
抖动处理方案 :
- 软件消抖:连续采样 3 次一致才确认状态变化
-
硬件消抖:RC 时间常数应大于抖动周期 (通常 >1μs)
-
工业现场布线 :
- 双绞线传输(绞距 <50mm)
- 屏蔽层单端接地(控制柜侧)
- 信号线与动力线间距 >30cm
正文完
