用STM32CubeMX和TB6612搞定你的第一个循迹小车(附完整代码和避坑点)

张开发
2026/4/24 12:13:08 15 分钟阅读

分享文章

用STM32CubeMX和TB6612搞定你的第一个循迹小车(附完整代码和避坑点)
从零打造智能循迹小车STM32CubeMX与TB6612实战指南第一次看到循迹小车在黑色跑道上灵活转弯时那种成就感至今难忘。作为嵌入式开发的经典入门项目它完美融合了硬件驱动、传感器应用和逻辑控制三大核心技能。本文将带你用STM32CubeMX和TB6612驱动模块从电路搭建到代码调试完整实现一个可自主循迹的智能小车。1. 硬件架构设计与核心元件选型1.1 TB6612FNG驱动模块深度解析这个指甲盖大小的芯片堪称电机控制的神器相比传统的L298N它具有三大显著优势效率提升40%内置MOSFET的导通电阻仅0.5ΩL298N典型值3Ω集成保护电路包含过热关断、欠压锁定和短路保护双通道独立控制最大1.2A持续电流/3.2A峰值电流输出引脚功能对照表引脚组功能说明典型连接方式PWMA电机A PWM速度控制连接TIM2_CH2 (PA1)AIN1/2电机A方向控制任意GPIO如PA6/PA7PWMB电机B PWM速度控制连接TIM2_CH3 (PA2)BIN1/2电机B方向控制任意GPIO如PA4/PA5VM电机电源(2.5-13.8V)接7.4V锂电池VCC逻辑电源(2.7-5.5V)接3.3V MCU电源注意STBY引脚必须接高电平使能模块这是新手最易忽略的点1.2 红外循迹传感器方案对比常见的有三种传感器方案可选TCRT5000反射式红外性价比首选检测距离2-10mm可调数字量输出无需额外ADC单价约0.5元/个红外对管比较器精度较高可调节灵敏度阈值需要LM393等比较器芯片电路稍复杂灰度传感器专业级方案可识别不同灰度值需要ADC采集模拟量成本较高约15元/个对于初学者推荐使用5个TCRT5000组成阵列中间间距15mm这样既能保证检测精度又控制成本。2. STM32CubeMX工程配置详解2.1 时钟树与定时器关键配置在CubeMX中完成这些关键设置时钟源选择HSE时钟设为8MHz外部晶振PLL倍频至72MHz系统时钟TIM2定时器配置Prescaler 71 // 72MHz/(711)1MHz Counter Mode Up Period 99 // 1MHz/(991)10kHz AutoReload Preload EnableGPIO初始化方向控制引脚设为Output模式红外传感器引脚设为Input模式2.2 PWM生成原理与参数计算电机驱动的PWM频率选择需权衡两个因素频率过低1kHz电机有明显啸叫声频率过高20kHz开关损耗增大经过实测10kHz是最佳平衡点。配置公式如下PWM频率 定时器时钟 / (Prescaler1) / (Period1) 72MHz / 72 / 100 10kHz在CubeMX中对应设置Prescaler 71Counter Period 99Pulse初始值设为03. 电机驱动代码实战3.1 方向控制真值表通过AIN1/AIN2的组合控制电机转向AIN1AIN2电机状态00刹车01正转10反转11刹车对应代码实现void Motor_SetDirection(GPIO_TypeDef* GPIOx, uint16_t IN1_Pin, uint16_t IN2_Pin, uint8_t dir) { switch(dir) { case MOTOR_FWD: HAL_GPIO_WritePin(GPIOx, IN1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOx, IN2_Pin, GPIO_PIN_SET); break; case MOTOR_REV: HAL_GPIO_WritePin(GPIOx, IN1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOx, IN2_Pin, GPIO_PIN_RESET); break; default: // 刹车 HAL_GPIO_WritePin(GPIOx, IN1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOx, IN2_Pin, GPIO_PIN_SET); } }3.2 速度平滑控制算法直接突变的PWM占空比会导致电机抖动加入加速度控制#define MAX_ACCEL 5 // 每10ms最大速度变化量 uint16_t current_speed 0; void Motor_RampToSpeed(TIM_HandleTypeDef* htim, uint32_t Channel, uint16_t target) { if(target current_speed MAX_ACCEL) { current_speed MAX_ACCEL; } else if(target current_speed - MAX_ACCEL) { current_speed - MAX_ACCEL; } else { current_speed target; } __HAL_TIM_SET_COMPARE(htim, Channel, current_speed); }4. 循迹算法设计与调试技巧4.1 五路传感器状态机传感器布局与对应动作传感器状态处理策略电机动作0b00100直线行驶左右轮同速0b00010轻微右偏左轮70%速度右轮全速0b01000轻微左偏左轮全速右轮70%速度0b00001急右转左轮前进右轮后退0b10000急左转左轮后退右轮前进0b00000丢失赛道记忆最后有效方向继续行驶4.2 PID控制参数整定进阶玩家可以引入PID算法float Kp 0.6, Ki 0.01, Kd 0.2; float error_sum 0, last_error 0; void PID_Control(uint8_t sensor_val) { float error Get_Center_Error(sensor_val); // 计算偏离中心距离 error_sum error; float output Kp*error Ki*error_sum Kd*(error-last_error); last_error error; int16_t left_speed BASE_SPEED output; int16_t right_speed BASE_SPEED - output; // 限幅处理 left_speed constrain(left_speed, 0, MAX_SPEED); right_speed constrain(right_speed, 0, MAX_SPEED); Motor_SetSpeed(MOTOR_L, left_speed); Motor_SetSpeed(MOTOR_R, right_speed); }调试技巧先用纯P控制稳定后再逐步加入I和D参数5. 常见问题排查指南5.1 电机异常现象处理现象可能原因解决方案电机时转时停电源功率不足换用2A以上锂电池一个电机正常另一个不转TB6612接线错误检查BIN1/BIN2与PWMB连接电机反转方向控制线序反了交换AIN1/AIN2接线PWM控制无反应定时器通道未正确映射检查CubeMX中TIM2_CHx配置5.2 循迹传感器调试要点高度调整传感器距地面5-8mm最佳灵敏度校准调节电位器使白线输出0黑线输出1抗干扰处理在传感器电源端并联100μF电容代码中增加去抖动延时if(HAL_GPIO_ReadPin(SENSOR_GPIO, SENSOR_PIN) 0) { HAL_Delay(20); // 持续低电平才确认检测到黑线 if(HAL_GPIO_ReadPin(SENSOR_GPIO, SENSOR_PIN) 0) { return LINE_DETECTED; } }最后分享一个实战经验当小车在弯道频繁振荡时可以尝试在电机电源端并联4700μF的电解电容这能显著改善电源瞬态响应。

更多文章