共计 1747 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在 STM32 C8T6 开发板上使用 TB6612 驱动编码器电机时,开发者常会遇到几个典型问题:

- PWM 谐波干扰 :电机运行时产生的 PWM 信号高频谐波会干扰编码器信号线,导致计数异常跳动
- 定时器资源冲突 :C8T6 仅有 4 个通用定时器,需要同时处理 PWM 生成和编码器模式时容易配置冲突
- HAL 库实时性 :硬件抽象层的函数调用开销可能导致编码器中断响应延迟
硬件设计
1. 接线示意图
TB6612 C8T6
AIN1 ---> PC0 (PWM)
AIN2 ---> PC1 (PWM)
PWMA ---> 5V
STBY ---> 3.3V
GND ---> 共地
编码器 A 相 ---> PA6 (TIM3_CH1)
编码器 B 相 ---> PA7 (TIM3_CH2)
2. 光耦隔离电路
在编码器信号线上必须添加光耦隔离:
- 使用 PC817 光耦,信号端串联 220Ω 电阻
- 输出端上拉电阻选用 1kΩ
- 布局时尽量靠近 TB6612 输出端
核心实现
1. TIM3 编码器模式配置
// 在 CubeMX 中配置 TIM3 为 Encoder Mode
TIM_Encoder_InitTypeDef sConfig = {0};
sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sConfig.IC1Filter = 6; // 0x0110b 滤波 4 个时钟周期
// 重复配置 IC2 参数...
HAL_TIM_Encoder_Init(&htim3, &sConfig);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
2. 中断防溢出处理
void TIM3_IRQHandler(void) {if(__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_UPDATE)) {
// 溢出时手动修正计数值
if(htim3.Instance->CR1 & TIM_CR1_DIR) {overflow_count--;} else {overflow_count++;}
__HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE);
}
}
3. 转速计算算法
float get_rpm(uint32_t sample_ms) {int32_t delta_cnt = (overflow_count<<16) + __HAL_TIM_GET_COUNTER(&htim3);
float rpm = (delta_cnt * 60000.0f) / (sample_ms * ENCODER_PPR * 4);
overflow_count = 0;
__HAL_TIM_SET_COUNTER(&htim3, 0);
return rpm;
}
避坑指南
- GPIO 速度设置 :
- 编码器输入引脚必须设置为 Low Speed
-
使用 CubeMX 配置 GPIO 时选择 ”Low” 速度
-
关键寄存器验证 :
- TIMx->SMCR 确认值为 0x0003(编码器模式 3)
- TIMx->CCER 检查通道极性
-
TIMx->CR1 确认计数器使能
-
急停保护 :
void emergency_stop() {HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2); HAL_TIM_Encoder_Stop(&htim3, TIM_CHANNEL_ALL); __HAL_TIM_SET_COUNTER(&htim3, 0); }
性能验证
| PWM 频率 | 误差率 |
|---|---|
| 1kHz | 0.12% |
| 5kHz | 0.35% |
| 10kHz | 1.2% |
示波器测量方法:
1. 连接编码器 A 相到 CH1
2. 触发方式设为上升沿
3. 测量相邻脉冲间隔时间
故障树排查
计数异常
├─ 硬件
│ ├─ 检查光耦输出电压 (应 >3V)
│ └─ 确认编码器供电稳定
└─ 软件
├─ 验证 TIMx_SMCR 寄存器值
└─ 检查中断优先级配置
通过上述方案,我们在工业 AGV 项目中实现了编码器计数的稳定采集,连续 72 小时测试误差小于 0.5%。特别要注意的是,当 PWM 频率超过 8kHz 时,建议在电机电源端增加 π 型滤波电路。
正文完
