共计 1771 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在工业自动化设备开发中,编码器作为位置和速度反馈的核心传感器,其信号处理质量直接影响控制精度。常见的痛点包括:

- 正交信号处理 :AB 相脉冲的 90°相位差容易受线路干扰导致误判
- 高速计数瓶颈 :机械臂等场景下脉冲频率可能超过软件计数上限
- 资源冲突 :C8T6 的定时器资源有限,需合理分配 GPIO 复用功能
硬件设计
1. 核心资源分析
STM32F103C8T6 提供:
- 37 个 GPIO(含复用功能)
- 3 个通用定时器(TIM2/3/4),均支持编码器模式
- 1 个高级定时器(TIM1),适合 PWM 生成
推荐引脚分配:
- TIM2_CH1/CH2 → PA0/PA1(正交编码器接口 1)
- TIM3_CH1/CH2 → PA6/PA7(正交编码器接口 2)
- TIM4_CH1/CH2 → PB6/PB7(保留给其他功能)
2. 保护电路设计
典型扩展电路包含:
[编码器] → [100Ω 电阻] → [0.1μF 电容] → [TVS 二极管] → [施密特触发器] → MCU 引脚
关键参数选择:
- TVS 二极管:SMBJ5.0CA(钳位电压 5V)
- 施密特触发器:SN74LVC2G14(滞后电压 0.8V)
- 滤波电容:根据信号频率选择(10kHz 建议 0.1μF)
软件实现
1. CubeMX 配置
- 启用 TIM2 的 Encoder Mode
- 设置 Prescaler=0,Counter Mode=Up/Down
- 配置 GPIO 为 Pull-Up 输入模式
- 生成工程时勾选 ”Generate peripheral initialization as a pair of .c/.h files”
2. 关键代码示例
// 初始化代码(HAL 库)TIM_Encoder_InitTypeDef encoder_config = {
.EncoderMode = TIM_ENCODERMODE_TI12,
.IC1Polarity = TIM_ICPOLARITY_RISING,
.IC2Polarity = TIM_ICPOLARITY_RISING,
.IC1Selection = TIM_ICSELECTION_DIRECTTI,
.IC2Selection = TIM_ICSELECTION_DIRECTTI,
.IC1Prescaler = TIM_ICPSC_DIV1,
.IC2Prescaler = TIM_ICPSC_DIV1,
.IC1Filter = 0x0F, // 16 个时钟周期滤波
.IC2Filter = 0x0F
};
HAL_TIM_Encoder_Init(&htim2, &encoder_config);
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
// 读取计数值(带溢出处理)int32_t GetEncoderValue() {
static uint16_t last_cnt = 0;
static int32_t total = 0;
uint16_t curr_cnt = TIM2->CNT;
int16_t diff = (int16_t)(curr_cnt - last_cnt);
total += diff;
last_cnt = curr_cnt;
return total;
}
避坑指南
1. 信号抖动处理
- 当脉冲宽度 <100ns 时,需增加硬件滤波
- 软件滤波建议值:
- 低速编码器(<1kHz):ICxFilter=0x0A
- 高速编码器(>10kHz):ICxFilter=0x05
2. 中断优化
- 定时器溢出中断优先级应高于运动控制中断
- 使用 DMA 传输计数器值可避免脉冲丢失(需配置 TIMx_DMAR)
验证方案
1. 逻辑分析仪调试
- 连接通道 A / B 到编码器信号线
- 设置触发条件为双沿触发
- 检查脉冲间隔是否符合:ΔT = 1/(分辨率×转速)
2. 计数器溢出测试
// 强制触发溢出(测试用)TIM2->CNT = 0xFFF0;
while(1) {printf("%d\n", GetEncoderValue());
HAL_Delay(100);
}
扩展思考
- 如何通过 TIM1 的从模式实现三编码器同步采样?
- 在资源紧张时,能否用外部中断 + 软件计数替代硬件编码器接口?
- 针对绝对值编码器,如何设计 SSI 接口的硬件电路?
实践体会
经过实际项目验证,这套方案在 500RPM 的伺服电机控制中可实现±1 个脉冲的误差精度。特别提醒注意 TVS 二极管的布局要尽量靠近连接器,接地回路面积要最小化。后续可尝试将滤波电路改为数字隔离方案(如 ADuM1201)以进一步提升抗干扰能力。
正文完
