基于HAL库的TB6612驱动编码器电机实战:C8T6开发板避坑指南

1次阅读
没有评论

共计 1972 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点

在 STM32 C8T6 开发板上使用 TB6612 驱动带编码器的电机时,开发者常遇到以下几个典型问题:

基于 HAL 库的 TB6612 驱动编码器电机实战:C8T6 开发板避坑指南

  • PWM 谐波干扰 :TB6612 的 PWM 信号会通过电源线耦合到编码器信号线,导致计数异常跳动。实测显示,当 PWM 频率高于 10kHz 时,编码器计数误差可达±5 脉冲 / 秒。

  • 定时器资源冲突 :C8T6 仅有 4 个通用定时器(TIM2-TIM5),当需要同时驱动多路电机时,编码器模式与 PWM 模式会产生硬件资源竞争。例如 TIM3 既用于编码器接口又用于 PWM 输出时,会出现模式配置冲突。

  • HAL 库实时性问题 :HAL 库的抽象层增加了约 2 -5μs 的中断延迟,在电机高速旋转(>2000RPM)时可能导致编码器脉冲丢失。

硬件设计

接线方案

TB6612 与 C8T6 连接核心线路

  1. PWM 控制线:
  2. PWMA → PA8(TIM1_CH1)
  3. PWMB → PA9(TIM1_CH2)
  4. STBY → PC13(直接控制)

  5. 编码器接口:

  6. EncoderA → PB6(TIM4_CH1)
  7. EncoderB → PB7(TIM4_CH2)

  8. 电源隔离:

  9. 电机电源与 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;
}

避坑指南

  1. GPIO 速度设置
  2. 编码器输入引脚必须设置为低速模式(GPIO_SPEED_FREQ_LOW)
  3. 实测显示:HIGH 模式会产生 200-400MHz 振铃,导致误触发

  4. 关键寄存器验证

  5. TIMx->SMCR:确认编码器模式值 0x03
  6. TIMx->CCMR1:检查滤波器设置与输入映射
  7. TIMx->CR1:确保计数器使能位 (CEN=1)

  8. 急停保护措施

  9. 在急停中断中立即执行:
    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 的测量精度。

正文完
 0
评论(没有评论)