共计 1406 个字符,预计需要花费 4 分钟才能阅读完成。
增量式编码器基础原理
增量式编码器通过 AB 两相输出正交脉冲信号,每转输出固定数量的脉冲(如 500 线编码器每转输出 500 个脉冲)。四倍频技术利用 AB 相的 90°相位差,在上升沿和下降沿都进行计数,将分辨率提高 4 倍:

- 当 A 相上升沿时检测 B 相电平:B= 0 正转,B= 1 反转
- A 相下降沿时逻辑相反
- 同理处理 B 相边沿信号
信号采集方案对比
外部中断法
- 优势 :响应快(实测触发延迟 <2μs)
- 劣势 :高频脉冲时 CPU 占用率高(1kHz 脉冲频率下占用率约 15%)
// 初始化代码示例
IT01 = 1; // 设置 INT0 下降沿触发
EX0 = 1; // 使能 INT0 中断
定时器捕获法
- 优势 :自动记录脉冲时间戳,CPU 占用低(<5%)
- 劣势 :需要较高定时器精度(建议使用 1MHz 时钟)
// 定时器 3 捕获模式初始化
T3CC1 = 0x10; // 捕获上升沿
T3CCTL1 |= 0x04; // 使能捕获中断
完整转速计算实现
硬件消抖电路
- RC 滤波参数计算(以 10ms 消抖时间为例):
R = 10kΩ ±1% C = 1μF ±10% 截止频率 f=1/(2πRC)=15.9Hz
方向判断逻辑
__interrupt void EXT0_ISR(void) {
static uint8_t last_state;
uint8_t current = (P1 & 0x03); // 读取 AB 相状态
if((last_state == 0x01 && current == 0x03) ||
(last_state == 0x03 && current == 0x02) ||
(last_state == 0x02 && current == 0x00) ||
(last_state == 0x00 && current == 0x01)) {encoder_cnt++;} else {encoder_cnt--;}
last_state = current;
}
定时器溢出计算
void Timer0_ISR() interrupt 1 {
static uint16_t last_cnt;
uint16_t delta = encoder_cnt - last_cnt;
rpm = (delta * 60) / (4 * PPR * 0.1); // PPR 为编码器线数
last_cnt = encoder_cnt;
}
硬件设计关键点
- 光耦隔离电路 :
- 限流电阻 R=(Vcc-Vf)/If
-
典型值:HCPL-2631 光耦,R=220Ω ±1%
-
PCB 布局三原则 :
- 编码器信号走线间距≥3 倍线宽
- 地平面包围敏感信号
- 电源端并联 100nF+10μF 电容
避坑指南
中断丢失问题
- 解决方案:
- 降低中断优先级嵌套
- 使用硬件去抖动电路
- 启用输入信号噪声抑制功能
电压匹配技巧
| 编码器类型 | 匹配方案 |
|---|---|
| 5V 输出 | 直接连接 + 上拉电阻 |
| 12V 输出 | 电阻分压 (12V→3.3V) |
| 开路集电极 | 外接上拉至 MCU 电压 |
启停脉冲补偿
void motor_soft_start() {for(uint8_t i=0; i<5; i++) {
encoder_cnt += 10; // 补偿初始脉冲
delay_ms(100);
}
}
进阶思考
利用 Z 相(每转 1 脉冲)实现位置闭环:
1. 在 Z 相中断时清零位置计数器
2. 结合 AB 相计数实现绝对位置检测
3. 通过 PID 算法控制电机到达目标位置
__interrupt void Z_ISR() {position = encoder_cnt % (4*PPR); // 单圈位置归零
}
实际测试中发现,采用定时器捕获法配合硬件滤波,在 3000RPM 转速下测量误差可控制在±0.5% 以内。特别提醒:长电缆传输时建议使用双绞线并加磁环,能有效抑制高频干扰。
正文完
