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

1次阅读
没有评论

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

image.webp

背景痛点

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

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

  • 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;
}

避坑指南

  1. GPIO 速度设置 :
  2. 编码器输入引脚必须设置为 Low Speed
  3. 使用 CubeMX 配置 GPIO 时选择 ”Low” 速度

  4. 关键寄存器验证 :

  5. TIMx->SMCR 确认值为 0x0003(编码器模式 3)
  6. TIMx->CCER 检查通道极性
  7. TIMx->CR1 确认计数器使能

  8. 急停保护 :

    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 时,建议在电机电源端增加 π 型滤波电路。

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