循迹避障小车硬件搭建实战:TB6612电机驱动与LM2596降压模块的选型与配置
1. TB6612电机驱动模块的选型与配置第一次接触电机驱动模块时我被市面上五花八门的选择搞得眼花缭乱。从L298N到DRV8833再到TB6612每个模块都有自己的特点。经过多次实测对比我发现TB6612在性能和易用性上确实更适合初学者。它的最大优势在于发热量小、效率高而且内置了短路保护和过热保护电路这对新手来说简直是福音。TB6612模块上有几个关键接口需要特别注意。VM引脚接7-12V电源VCC接5V逻辑电源GND不用说自然是接地。A01/A02和B01/B02分别连接两个电机的正负极。最核心的是三个控制引脚PWMA/PWMB用于PWM调速AIN1/AIN2和BIN1/BIN2控制电机转向STBY则是使能引脚。我建议先用杜邦线把所有接口引出来这样调试时会方便很多。说到接线最容易出错的就是逻辑电源和电机电源的区分。有一次我直接把12V接到VCC上结果模块瞬间冒烟这个教训让我记忆犹新。正确的做法是电机电源7-12V接VM控制信号用的5V接VCC。如果使用STM32开发板可以直接从板子上取5V给VCC供电。在代码实现方面我习惯先用简单的测试程序验证模块功能。比如让电机正转3秒停1秒再反转3秒。这个测试能一次性检查PWM输出、方向控制和使能功能是否正常。以下是基于HAL库的示例代码// 初始化PWM TIM_HandleTypeDef htim1; htim1.Instance TIM1; htim1.Init.Prescaler 0; htim1.Init.CounterMode TIM_COUNTERMODE_UP; htim1.Init.Period 999; // 1kHz PWM HAL_TIM_PWM_Init(htim1); // 设置电机A正转 HAL_GPIO_WritePin(GPIOA, AIN1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, AIN2_Pin, GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, 500); // 50%占空比调试过程中常见的问题包括电机不转、只能单向转动或者转速异常。这时候要按步骤排查先检查电源是否正常再确认STBY引脚是否置高最后用万用表测量PWM信号是否输出。有时候杜邦线接触不良也会导致奇怪的问题所以接线一定要牢固。2. LM2596降压模块的使用技巧电源模块的选择往往被初学者忽视但它的稳定性直接关系到整个系统的可靠性。LM2596是我用过最皮实的降压模块之一价格便宜而且效率能达到90%以上。市面上有可调板和固定电压板两种建议选择可调版本灵活性更高。使用LM2596时首先要明确输入输出电压范围。它的最大输入电压是40V但实际使用时最好不要超过30V。输出电流标称是3A但长时间工作建议控制在2A以内。我第一次使用时没注意散热连续工作半小时后模块烫得能煎鸡蛋后来加了散热片才解决问题。调节输出电压是个精细活。模块上那个蓝色电位器就是用来调压的但要注意两点一是必须接负载后再调空载调节不准二是要用数字万用表实时监测输出电压。我常用的方法是先逆时针调到最小然后接上负载慢慢顺时针旋转直到电压达到目标值。比如要给STM32供电就需要调到5.0V偏差最好控制在±0.1V以内。接线方面有几个安全注意事项输入端的正负极绝对不能接反否则模块会当场报废输出端要加滤波电容我一般并联一个100μF电解电容和一个0.1μF陶瓷电容如果驱动大电流负载导线要足够粗至少18AWG以上。有一次我用细导线接电机结果导线发热导致电压下降电机转速忽快忽慢排查了好久才发现问题所在。对于多电压需求的系统比如同时需要5V和3.3V我的经验是采用两级降压先用LM2596从12V降到5V再用AMS1117从5V降到3.3V。这样比直接从12V降到3.3V更稳定发热也更小。下面是典型的电源方案示意图12V电池 → LM2596(5V) → 电机驱动模块 ↓ AMS1117(3.3V) → STM323. 电机驱动与主控的硬件连接把TB6612和STM32连接起来看似简单但实际布线时有几个关键点需要注意。首先是PWM信号线的选择建议使用定时器的CH1和CH2通道这样方便后续编码。我常用TIM1的通道1和通道2因为这两个通道在大多数STM32板子上都有引出。控制信号的接线要特别注意电平匹配。TB6612的逻辑输入高电平最低要求3.3V而STM32的IO口输出正好是3.3V勉强够用但余量不足。为了提高可靠性我建议在信号线上加电平转换电路或者选用输出能力更强的IO口。STM32的FT标志引脚5V容忍是更好的选择。地线的处理也很讲究。一定要确保电机驱动板和主控板共地否则控制信号会不稳定。我遇到过一个诡异的故障电机偶尔会自己启动最后发现是因为地线接触不良。现在的做法是除了用杜邦线连接GND外还会用粗导线直接把两个板子的地平面连起来。对于需要驱动四个电机的项目可以采用两个TB6612模块并联的方式。这时候要注意分配好PWM资源避免定时器通道冲突。我的常用配置是定时器1通道1→电机A通道2→电机B定时器2通道1→电机C通道2→电机D电源走线要单独规划。电机启动时的电流冲击很大会导致电源电压瞬间跌落。解决方法是在电机电源输入端加一个大容量电解电容我常用470μF/25V同时电源线要尽量短而粗。如果使用锂电池供电记得加装保护板防止过放。4. 系统集成与功能测试当所有硬件都连接好后不要急着写复杂代码应该分阶段测试。我的测试流程一般是电源测试→电机单项测试→综合运动测试。电源测试要用万用表测量各节点电压特别是STM32的供电电压必须在3.3V±0.1V范围内。电机测试建议按以下顺序进行单独测试每个电机能否正反转测试PWM调速是否线性测试两个电机同步运行测试急停和制动功能这个过程中可能会发现各种问题。比如电机转速不一致可能是由于PWM频率设置不当。对于直流电机PWM频率建议在1kHz-10kHz之间太高会导致电机啸叫太低会有明显抖动。我的经验值是5kHz这个频率下大多数电机运行都很平稳。功能测试通过后就可以着手编写运动控制函数了。我习惯把基本动作封装成独立函数比如void Motor_SetSpeed(uint8_t motor_id, int16_t speed) { speed constrain(speed, -1000, 1000); // 限幅 if(motor_id MOTOR_A) { __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, abs(speed)); HAL_GPIO_WritePin(GPIOA, AIN1_Pin, speed0?GPIO_PIN_SET:GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, AIN2_Pin, speed0?GPIO_PIN_RESET:GPIO_PIN_SET); } // 同理处理MOTOR_B... } void Car_Stop(void) { // 快速制动模式 HAL_GPIO_WritePin(GPIOA, AIN1_Pin|AIN2_Pin|BIN1_Pin|BIN2_Pin, GPIO_PIN_SET); }最后要测试的是系统稳定性。让小车持续运行半小时以上观察是否有发热异常、电机失速或者控制失灵的情况。这个阶段最容易暴露电源容量不足、接触不良等问题。建议准备个红外测温枪随时监测关键部件的温度变化。