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

-
PWM 谐波干扰 :TB6612 的 PWM 信号会通过电源线耦合到编码器信号线,导致计数异常跳动。实测显示,当 PWM 频率高于 10kHz 时,编码器计数误差可达±5 脉冲 / 秒。
-
定时器资源冲突 :C8T6 仅有 4 个通用定时器(TIM2-TIM5),当需要同时驱动多路电机时,编码器模式与 PWM 模式会产生硬件资源竞争。例如 TIM3 既用于编码器接口又用于 PWM 输出时,会出现模式配置冲突。
-
HAL 库实时性问题 :HAL 库的抽象层增加了约 2 -5μs 的中断延迟,在电机高速旋转(>2000RPM)时可能导致编码器脉冲丢失。
硬件设计
接线方案
TB6612 与 C8T6 连接核心线路 :
- PWM 控制线:
- PWMA → PA8(TIM1_CH1)
- PWMB → PA9(TIM1_CH2)
-
STBY → PC13(直接控制)
-
编码器接口:
- EncoderA → PB6(TIM4_CH1)
-
EncoderB → PB7(TIM4_CH2)
-
电源隔离:
- 电机电源与 MCU 电源共地,但通过 10μH 电感隔离
光耦隔离电路设计
在编码器信号线上增加 6N137 光耦隔离,具体参数:
- 输入端串联 220Ω 电阻(计算依据:VCC=3.3V,IF=15mA)
- 输出端上拉电阻选用 4.7kΩ
- 关键点:光耦响应时间需 <1μs,否则会导致高频脉冲丢失
核心实现
TIM4 编码器模式配置
// 在 CubeMX 中配置或手动初始化
TIM_Encoder_InitTypeDef encoder_config = {
.EncoderMode = TIM_ENCODERMODE_TI12, // 双边沿计数
.IC1Polarity = TIM_ICPOLARITY_RISING,
.IC1Selection = TIM_ICSELECTION_DIRECTTI,
.IC1Prescaler = TIM_ICPSC_DIV1, // 不分频
.IC1Filter = 6, // 8 个时钟周期滤波
// IC2 配置相同...
};
HAL_TIM_Encoder_Init(&htim4, &encoder_config);
HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);
中断防溢出处理
// 在 stm32f1xx_it.c 中重写中断服务函数
void TIM4_IRQHandler(void) {if(__HAL_TIM_GET_FLAG(&htim4, TIM_FLAG_UPDATE)) {if(htim4.Instance->CNT > 0x7FFF) {overflow_count++; // 正方向溢出} else {overflow_count--; // 负方向溢出}
__HAL_TIM_CLEAR_FLAG(&htim4, TIM_FLAG_UPDATE);
}
}
转速计算算法
float GetMotorRPM() {int32_t total_counts = (overflow_count << 16) + htim4.Instance->CNT;
int32_t delta_counts = total_counts - last_counts;
// 假设编码器 500 线,4 倍频后每转 2000 脉冲
float rpm = (delta_counts * 60.0f) / (2000.0f * sample_time);
last_counts = total_counts;
return rpm;
}
避坑指南
- GPIO 速度设置 :
- 编码器输入引脚必须设置为低速模式(GPIO_SPEED_FREQ_LOW)
-
实测显示:HIGH 模式会产生 200-400MHz 振铃,导致误触发
-
关键寄存器验证 :
- TIMx->SMCR:确认编码器模式值 0x03
- TIMx->CCMR1:检查滤波器设置与输入映射
-
TIMx->CR1:确保计数器使能位 (CEN=1)
-
急停保护措施 :
- 在急停中断中立即执行:
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_ALL); htim4.Instance->CNT = 0; // 清零计数器 overflow_count = 0;
性能验证
| PWM 频率 (kHz) | 无屏蔽误差 | 带隔离误差 |
|---|---|---|
| 5 | ±2 | ±0 |
| 10 | ±5 | ±1 |
| 20 | ±15 | ±3 |
中断延迟测量方法 :
1. 在编码器 A 相接入示波器通道 1
2. 在 TIM4_IRQHandler 入口处设置 GPIO 翻转
3. 测量两个上升沿时间差,典型值应 <3μs
故障树排查
graph TD
A[编码器计数异常] --> B{信号质量}
B -->| 示波器检查 | C[有毛刺?]
C -->| 是 | D[增加 RC 滤波]
C -->| 否 | E[检查 TIM 配置]
E --> F[验证 SMCR 寄存器值]
实际测试中发现,当 PWM 频率设置为 8kHz、编码器线长超过 20cm 时,必须使用双绞线并加磁环。经过优化后,在 12V 供电、1500RPM 工况下,系统可稳定实现±1RPM 的测量精度。
