1. TB6612电机驱动模块基础解析TB6612FNG是东芝半导体推出的直流电机驱动芯片相比传统L298N模块有显著优势。我实测对比过两款驱动板TB6612在5V工作电压下效率提升约30%连续工作2小时温升不超过15℃而L298N同样条件下烫到不敢触碰。模块核心参数双通道H桥设计单路持续电流1.2A峰值3.2A工作电压范围电机端VM 2.5-13.5V逻辑端VCC 2.7-5.5V支持PWM频率最高100kHz推荐10kHz待机电流仅0.1μASTBY接低电平实际接线时要注意三个细节VM和VCC必须分开供电我遇到过新手把两者短接导致芯片烧毁的情况三个GND引脚内部连通接任意一个即可AO1/AO2输出端建议加装0.1μF陶瓷电容滤波能有效减少电机干扰2. Arduino与TB6612的硬件对接推荐使用这种引脚分配方案// 电机A右轮 #define PWMA 5 // 必须选择带~的PWM引脚 #define AIN1 7 #define AIN2 8 // 电机B左轮 #define PWMB 6 #define BIN1 9 #define BIN2 10 // 红外循迹传感器 #define TRACK1 A0 // 最左侧 #define TRACK2 A1 #define TRACK3 A2 #define TRACK4 A3 // 最右侧常见接线错误排查电机不转先检查STBY是否接高电平电机反转交换AO1/AO2接线PWM控制异常确认引脚支持PWM输出带~符号传感器误触发给VCC加10μF电解电容稳压我建议在电源入口处增加470μF的电解电容能有效避免电机启动时的电压跌落导致Arduino复位。3. 电机控制代码深度优化基础驱动函数应该包含状态机控制void motorCtrl(uint8_t motor, int speed) { speed constrain(speed, -255, 255); // 限幅 if(motor RIGHT_MOTOR) { digitalWrite(AIN1, speed 0 ? HIGH : LOW); digitalWrite(AIN2, speed 0 ? LOW : HIGH); analogWrite(PWMA, abs(speed)); } else { digitalWrite(BIN1, speed 0 ? HIGH : LOW); digitalWrite(BIN2, speed 0 ? LOW : HIGH); analogWrite(PWMB, abs(speed)); } }高级技巧加速渐变每次loop只允许速度变化±5避免急启停死区补偿当PWM值小于30时直接设为0克服静摩擦电池电压补偿根据ADC读取的电压动态调整PWM占空比实测发现采用20kHz的PWM频率比默认490Hz能减少电机啸叫可通过修改定时器配置实现TCCR1B (TCCR1B 0b11111000) | 0x01; // 修改Timer1分频4. 四路循迹算法实现传感器布局建议传感器间距15-20mm根据赛道宽度调整离地高度8-12mm用铜柱固定检测阈值通过电位器调节使LED在白线处熄灭改进型巡线算法void lineTracking() { int pos 0; int sum 0; int activeSensors 0; for(int i0; i4; i) { if(digitalRead(TRACK_PINS[i])) { pos (i * 100); // 加权计算 sum 100; activeSensors; } } if(activeSensors 0) { int error pos/sum - 150; // 中心点偏移量 int baseSpeed 120; motorCtrl(LEFT_MOTOR, baseSpeed - error*2); motorCtrl(RIGHT_MOTOR, baseSpeed error*2); } else { // 丢失路线处理 static uint8_t lastState 0; motorCtrl(LEFT_MOTOR, lastState ? 80 : -80); motorCtrl(RIGHT_MOTOR, lastState ? -80 : 80); lastState !lastState; } }特殊场景处理十字路口所有传感器同时触发时保持直行锐角弯增加转向权重系数断线检测记录最后有效状态做预测5. PID控制算法应用增量式PID实现class PID { private: float kp, ki, kd; float lastError, integral; public: PID(float p, float i, float d) : kp(p), ki(i), kd(d), lastError(0), integral(0) {} float compute(float error) { integral error; float derivative error - lastError; lastError error; return kp*error ki*integral kd*derivative; } }; // 使用时 PID pid(0.8, 0.05, 0.3); float correction pid.compute(error);参数整定经验先设kikd0增大kp直到出现轻微振荡增加ki消除静差但不超过kp/10加入kd抑制超调观察响应曲线赛道复杂时适当提高微分项调试技巧通过串口实时输出误差和PID输出使用Excel绘制响应曲线不同赛道段采用变参数如直道加大kp弯道加强kd6. 常见问题解决方案电机异常排查表现象可能原因解决方法单侧不转接线松动/MOSFET损坏更换驱动板转速不稳电源功率不足更换2A以上电源反向转动电机线序接反交换AO1/AO2传感器调试要点使用串口监视器查看原始值void printSensors() { for(int i0; i4; i) { Serial.print(analogRead(TRACK_PINS[i])); Serial.print(\t); } Serial.println(); }环境光干扰时加装遮光罩黑线宽度建议≥15mm与传感器间距匹配7. 高级功能扩展蓝牙遥控集成#include SoftwareSerial.h SoftwareSerial BT(2, 3); // RX,TX void setup() { BT.begin(9600); } void loop() { if(BT.available()) { char cmd BT.read(); switch(cmd) { case F: motorCtrl(LEFT_MOTOR, 150); motorCtrl(RIGHT_MOTOR, 150); break; // 其他控制指令... } } }性能优化技巧使用端口寄存器直接操作替代digitalWrite关闭未用外设降低功耗定时器中断实现精准控制// 定时器2配置为1kHz中断 TCCR2A 0; TCCR2B (1CS22) | (1CS21); TIMSK2 (1TOIE2);赛道记忆功能实现思路用EEPROM存储路径点编码器记录行驶距离状态机管理运行模式