共计 1846 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
AB 相编码器在工业控制中广泛应用,但在实际使用中常遇到以下问题:

- 信号抖动问题 :在高速旋转时,信号边沿容易产生毛刺,导致误计数
- 低速测量不准 :传统脉冲计数法在低速时分辨率不足
- 方向误判 :当 AB 相信号存在相位偏移时,可能出现方向误判
常见的速度测量方法对比:
- 脉冲计数法 :适用于中高速场景,低速时误差大
- T 法 :通过测量脉冲周期计算速度,适合低速但高速时精度下降
- M- T 法 :结合脉冲计数和时间测量,全速度范围内精度较高
硬件设计
STM32 定时器配置
使用 STM32 的编码器接口模式,关键配置如下:
// TIM3 编码器模式配置
TIM_Encoder_InitTypeDef sEncoderConfig = {0};
sEncoderConfig.EncoderMode = TIM_ENCODERMODE_TI12;
sEncoderConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sEncoderConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sEncoderConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sEncoderConfig.IC1Filter = 0x0F; // 设置滤波器
// 类似配置 IC2...
HAL_TIM_Encoder_Init(&htim3, &sEncoderConfig);
信号调理电路
- 施密特触发器 :使用 74HC14 整形信号
- RC 滤波 :推荐 100Ω 电阻 +100nF 电容组成低通滤波器
- 抗干扰布线 :
- 使用双绞线传输信号
- 信号线远离电源线
- 必要时增加屏蔽层
核心算法
四倍频解码实现
利用 AB 相的上升沿和下降沿实现 4 倍频:
// 在定时器中断中处理
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static int32_t last_count = 0;
int32_t current_count = TIM3->CNT;
int32_t delta = current_count - last_count;
// 处理计数器溢出
if(delta > ENCODER_MAX/2) delta -= ENCODER_MAX;
else if(delta < -ENCODER_MAX/2) delta += ENCODER_MAX;
total_pulses += delta;
last_count = current_count;
}
速度计算公式
转速计算公式(单位:rpm):
转速 = (脉冲数 × 60) / (编码器线数 × 4 × 采样时间)
其中:
– 脉冲数:测量周期内捕获的脉冲数
– 编码器线数:编码器每转输出的脉冲数
– 4:四倍频系数
– 采样时间:单位为秒
性能优化
中断服务函数优化
- 只做必要的最小操作
- 避免在中断中进行浮点运算
- 使用原子操作更新共享变量
DMA 方案
配置定时器通过 DMA 自动传输计数值:
// DMA 配置示例
__HAL_LINKDMA(&htim3, hdma[TIM_DMA_ID_CC1], hdma_tim3_ch1);
HAL_DMA_Start_IT(&hdma_tim3_ch1, (uint32_t)&TIM3->CNT, (uint32_t)&encoder_buffer, 1);
卡尔曼滤波应用
// 简化的卡尔曼滤波器实现
float kalman_update(float measurement) {
static float P = 1.0, K, x = 0;
static float Q = 0.01, R = 0.1;
// 预测
P = P + Q;
// 更新
K = P / (P + R);
x = x + K * (measurement - x);
P = (1 - K) * P;
return x;
}
避坑指南
- 硬件连接
- 确保上拉电阻值合适(通常 4.7kΩ-10kΩ)
-
检查电源稳定性
-
软件防抖
- 推荐设置 5 -10μs 的消抖时间
-
可通过定时器滤波器寄存器实现
-
方向测试
- 手动旋转编码器,观察计数增减方向
- 测试 AB 相不同相位差下的方向判断
验证方法
- 示波器验证
- 同时观察原始信号和整形后信号
-
检查边沿对齐情况
-
阶跃响应测试
- 从低速突然切换到高速
-
观察系统响应时间和超调量
-
最小速度测试
- 缓慢旋转编码器
- 记录能稳定测量到的最小速度
工程资源
完整工程代码已开源:
GitHub 仓库链接
扩展阅读建议:
– STM32 参考手册编码器接口章节
–《电机控制中的编码器应用》
– 卡尔曼滤波在测量中的应用论文
通过以上方案,我们成功实现了 AB 相编码器在 0.1-5000rpm 范围内的精确速度测量,测量误差小于 0.5%。实际应用中,还需要根据具体场景调整参数,但核心思路和框架具有通用性。
正文完
