共计 2058 个字符,预计需要花费 6 分钟才能阅读完成。
正交编码原理图解
嵌入式开发中常用增量式编码器通过两路正交信号(A 相和 B 相)来检测电机运动状态。这两路信号具有以下特点:

- 相位差固定为 90 度
- 每转产生固定数量的脉冲(如 500 线编码器每转产生 500 个脉冲)
- 通过检测边沿变化可以实现 4 倍频计数
图示说明(文字描述):
A 相: __|¯¯|____|¯¯|____
B 相: ____|¯¯|____|¯¯|__
↑ ↑ ↑ ↑
4 个计数点 / 周期
数学依据:
- 单个脉冲周期 T 内可检测 4 次边沿变化(A 相上升沿、A 相下降沿、B 相上升沿、B 相下降沿)
- 分辨率提升公式:实际分辨率 = 编码器线数 × 4
- 以 500 线编码器为例,理论分辨率可达 2000 脉冲 / 转
STM32 硬件接口方案对比
方案一:专用编码器接口模式
优势:
- 硬件自动处理正交编码
- 不占用 CPU 资源
- 支持最高 10MHz 的计数频率
配置示例(TIM3 寄存器):
// 定时器编码器模式配置
TIM_Encoder_InitTypeDef encoderConfig = {
.EncoderMode = TIM_ENCODERMODE_TI12, // 双通道计数模式
.IC1Polarity = TIM_ICPOLARITY_RISING,
.IC2Polarity = TIM_ICPOLARITY_RISING,
.IC1Selection = TIM_ICSELECTION_DIRECTTI,
.IC2Selection = TIM_ICSELECTION_DIRECTTI
};
HAL_TIM_Encoder_Init(&htim3, &encoderConfig);
方案二:GPIO+ 外部中断方案
适用场景:
- 需要自定义解码逻辑
- 定时器资源紧张时
硬件连接要求:
- 两个 GPIO 配置为输入模式
- 开启双边沿触发中断
带滤波算法的代码实现
核心数据结构
typedef struct {
volatile int32_t rawCount; // 原始计数值
volatile float rpm; // 转速值 (RPM)
volatile float angle; // 当前角度 (0-360°)
KalmanFilter kf; // 卡尔曼滤波器实例
} EncoderData;
边沿检测与方向判断
// 在 GPIO 中断回调函数中实现
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
static uint8_t lastState = 0;
uint8_t currentState = (HAL_GPIO_ReadPin(GPIOA, A_PIN) << 1)
| HAL_GPIO_ReadPin(GPIOA, B_PIN);
// 状态机实现方向判断
switch(lastState) {
case 0b00:
if(currentState == 0b01) encoder.rawCount++;
else if(currentState == 0b10) encoder.rawCount--;
break;
// 其他状态转换...
}
lastState = currentState;
}
转速计算(1ms 定时器中断)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static int32_t lastCount = 0;
int32_t delta = encoder.rawCount - lastCount;
// RPM 计算公式:(Δcount × 60) / (脉冲数每转 × 采样周期秒)
encoder.rpm = (delta * 60.0f) / (2000.0f * 0.001f);
// 卡尔曼滤波
encoder.rpm = Kalman_Update(&encoder.kf, encoder.rpm);
lastCount = encoder.rawCount;
}
常见问题解决方案
1. 高速旋转脉冲丢失
症状:实测转速低于预期
解决方法:
- 改用硬件编码器接口模式
- 降低输入滤波时间(修改 TIMx_CCMR 寄存器)
- 检查线缆长度(建议 <0.5m)
2. 电源噪声干扰
典型表现:静止时计数值漂移
应对措施:
- 在 AB 相线上加 100Ω 电阻和 100nF 电容滤波
- 使用差分信号传输(如 RS422 接口)
- 软件端增加移动平均滤波
3. 零位校准
操作步骤:
- 电机转动到机械零点位置
- 短接 Z 相信号到中断引脚
- 在中断服务程序中重置计数器
- 保存偏移量到 Flash
调试技巧
逻辑分析仪连接方式:
- 通道 1 接 A 相
- 通道 2 接 B 相
- 设置触发模式为「序列触发」
关键测量参数:
- 相位差是否稳定在 90°±10%
- 脉冲宽度是否符合预期(转速×分辨率)
- 检查毛刺脉冲宽度(应 <100ns)
动手实验
任务目标:
使用 STM32F103 开发板 + 带编码器的直流电机,实现以下功能:
- 实时显示电机角度(精度±5°)
- 通过串口输出转速值
- 实现位置闭环控制(P 控制即可)
所需材料:
- 带 AB 相输出的编码器电机(如 JGA25-370)
- STM32 最小系统板
- 逻辑分析仪(可选)
- 杜邦线若干
通过本文介绍的核心技术点,相信您已经掌握了 AB 相编码器电机的基础开发方法。在实际项目中,建议先用示波器验证信号质量,再逐步实现软件功能。遇到问题时,可以重点检查硬件连接和定时器配置这两个最容易出错的环节。
正文完
