共计 1872 个字符,预计需要花费 5 分钟才能阅读完成。
工业场景中的编码器电机
520 编码器电机在自动化生产线、机器人关节控制等领域广泛应用。这类电机通过正交编码器输出 A / B 两路脉冲信号,每转可产生数百至数千个脉冲(取决于线数)。但在实际应用中,我们常遇到两个核心痛点:

- 信号抖动问题 :电机启停或负载突变时,机械振动会导致脉冲边沿出现毛刺
- 高速计数丢失 :当转速超过软件中断处理能力时,会丢失脉冲导致位置计算错误
硬件方案对比
传统软件计数方案有两种实现方式:
- 外部中断模式:每个脉冲触发一次中断,消耗大量 CPU 资源
- 输入捕获模式:定时器记录脉冲间隔,无法处理双向旋转
STM32 的硬件编码器接口完美解决了这些问题:
- 正交解码:自动识别 A / B 相位关系判断方向
- 四倍频技术:在 A / B 信号的每个边沿都计数,提高分辨率
- 硬件级处理:不占用 CPU 时间,支持最高 72MHz 的脉冲频率
硬件电路设计
信号调理电路
[编码器] ----> 1kΩ ----+-----> [MCU]
| |
100pF 100Ω
| |
GND GND
- RC 参数计算:截止频率 f =1/(2πRC)=1/(23.141000*100e-12)≈1.6MHz
- 光耦隔离方案:HCPL-2631 高速光耦,延迟时间 <100ns
驱动代码实现
GPIO 初始化
// 使用 TIM3_CH1/CH2 对应 PA6/PA7
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽
GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉抵抗干扰
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
定时器配置
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 = 6; // 8 个时钟周期滤波
// CH2 配置同理...
HAL_TIM_Encoder_Init(&htim3, &sEncoderConfig);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
关键寄存器说明:
- TIMx_SMCR.SMS=3:编码器模式 3,在 TI1 和 TI2 边沿都计数
- TIMx_CCER.CC1P=0:通道 1 不反向
- TIMx_CCMR1.IC1F=6:输入滤波器 N =8
转速计算算法
公式推导
转速 RPM = (ΔCount * 60) / (线数 * 4 * 采样周期)
示例:500 线编码器,100ms 采样周期,测得计数变化 1200
RPM = (1200*60)/(500*4*0.1) = 360 转 / 分钟
32 位计数实现
volatile int32_t total_count = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM3){if(__HAL_TIM_IS_TIM_COUNTING_DOWN(htim))
total_count -= 65535;
else
total_count += 65535;
}
}
避坑指南
硬件接线常见错误
- A/ B 相序接反:导致计数方向与实际旋转相反
- 未接上拉电阻:悬空输入容易受干扰
- 电源共地问题:电机与 MCU 地线未单点连接导致地弹
型号差异注意
- F1 系列:仅高级定时器 1 / 8 支持编码器模式
- F4 系列:所有通用定时器均支持
- H7 系列:支持 16.5MHz 的最高计数频率
扩展思考
实现多电机同步控制可考虑:
- 使用多个定时器独立采集各电机信号
- 通过 CAN 总线汇总各节点位置数据
- 采用带时间戳的同步采样方案
通过这套方案,我们在 AGV 小车项目中实现了 0.1°的角度控制精度,机械臂重复定位误差控制在±0.05mm 以内。希望这些实战经验对您的项目开发有所帮助!
正文完
