1. 三轮小车的基础运动控制
第一次动手做循迹小车时,最让我头疼的就是怎么让这个小家伙乖乖按照我的想法移动。三轮小车的结构其实特别适合新手入门,后面两个主动轮负责驱动,前面一个万向轮就像购物车的轮子一样自由转向。这种设计不仅简单,还能避免四轮小车经常遇到的差速问题。
要让小车动起来,本质上就是控制两个直流电机的转速和方向。我刚开始用最基础的黄色T电机做实验,发现虽然便宜但确实存在转速不稳定的问题。后来改用带编码器的电机,虽然贵了点,但速度和位置控制精度明显提升,特别适合需要精准循迹的场景。
电机的控制逻辑其实很直观:给两个引脚A和B交替供电就能改变转向。比如A接5V、B接GND时正转,反过来接就反转。但手动切换电线实在太麻烦,这时候TB6612电机驱动模块就派上大用场了。这个模块最让我满意的是它集成了两路驱动,正好对应我们小车的两个驱动轮。
2. PWM调速的实战技巧
真正开始调试电机速度时,PWM(脉冲宽度调制)技术就成了关键。刚开始我总搞不懂占空比和实际速度的关系,后来用示波器观察波形才恍然大悟:占空比就是高电平时间占整个周期的比例。比如50%占空比相当于给电机施加2.5V电压(假设电源是5V)。
这里有个实用经验:PWM频率选择很重要。我用STC8A单片机测试发现,7-13kHz这个范围电机运行最平稳。频率太低会听到明显的电机啸叫,太高又会导致驱动芯片发热。具体代码实现时,我更喜欢用硬件PWM模块而不是软件模拟,这样不仅精度高,还能减轻CPU负担。
// STC8A硬件PWM配置示例 HPWM_Set(0, 6000, 0.7); // 通道0,6kHz频率,70%占空比调试时发现一个有趣现象:两个电机即使给相同的PWM值,实际转速也可能不同。这是因为电机本身存在个体差异。这时候就需要通过实验记录每个电机的特性曲线,或者直接上编码器做闭环控制。
3. 红外传感器的布局与调试
循迹的核心在于"看得见"路线。我试过好几种红外传感器,最终选定TCRT5000模块主要是考虑性价比。这种数字式传感器输出简单,黑线检测结果直接通过高低电平表示,省去了ADC转换的麻烦。
传感器布局很有讲究。我最开始只用三个传感器,中间一个对准黑线,左右各一个检测偏离。后来发现五传感器阵列更好用:
- 最左(1号)和最右(5号):检测急转弯
- 次左(2号)和次右(4号):检测缓转弯
- 中间(3号):保持直行
实际安装时要注意高度调整。传感器离地面太远灵敏度下降,太近又容易误触发。我通常保持5-10mm距离,然后用螺丝调节固定架来微调。调试时可以先用串口打印各传感器状态,观察过线时的电平变化。
// 五路传感器状态检测 if((P1 & 0x1F) == 0x04) { // 仅中间传感器触发 goStraight(); } else if((P1 & 0x03) != 0) { // 左侧传感器触发 turnLeft(); }4. 闭环控制算法的实现
把传感器数据和电机控制结合起来,就形成了完整的闭环系统。我尝试过几种控制算法,最简单的"bang-bang"控制(非开即关)虽然容易实现,但小车会像醉汉一样左右摇摆。后来改用比例控制(P控制),行驶轨迹就平滑多了。
具体实现时,我定义了一个误差变量:
- 中间传感器触发:误差=0
- 左侧传感器触发:误差=+1(2号)或+2(1号)
- 右侧传感器触发:误差=-1(4号)或-2(5号)
然后根据误差值调整左右轮速差:
float Kp = 0.2; // 比例系数 float baseSpeed = 0.6; // 基础速度 float leftSpeed = baseSpeed + error * Kp; float rightSpeed = baseSpeed - error * Kp;调试Kp参数时有个小技巧:先用较小值让小车缓慢修正,观察过冲情况后再逐步调大。太激进会导致震荡,太保守又修正不及时。记得有一次调参到凌晨三点,终于找到0.15-0.25这个黄金区间。
5. 十字路口的特殊处理
当多个传感器同时检测到黑线时,就遇到了十字路口判断问题。我的解决方案是设置一个计数器,当连续3个以上传感器触发超过200ms时,判定为十字路口。这时候可以让小车:
- 完全停止后做90度转向
- 保持原速直接通过
- 根据预设路线选择转向
实际测试发现,方案2最简单可靠,但需要配合地图记忆功能才能用于复杂路径。我在车体两侧额外加装了两个斜向安装的传感器,专门用于检测十字路口的出口方向。
6. 常见问题排查指南
调试过程中踩过不少坑,这里分享几个典型问题的解决方法:
电机不转时检查清单:
- STBY引脚是否置高
- VM电源电压是否足够
- 电机线序是否正确(可交换AO1/AO2测试)
- PWM信号是否正常(用示波器检查)
传感器误触发应对措施:
- 增加软件消抖(连续检测3次相同结果才确认)
- 调整传感器阈值电位器
- 在代码中设置黑白线判断的延时阈值
小车跑偏的可能原因:
- 电池电压下降导致PWM占空比实际值变化
- 轮胎打滑或地面不平
- 电机特性差异(可通过编码器补偿)
7. 进阶优化方向
当基础功能都实现后,可以尝试这些提升:
- 加入PID控制替代简单P控制
- 增加蓝牙模块进行无线调试
- 使用光电编码器实现速度闭环
- 开发上位机显示实时传感器数据
- 尝试更复杂的路径规划算法
记得第一次成功让小车跑完全程时,那种成就感至今难忘。虽然现在回头看当时的代码写得实在粗糙,但正是这些实践让我真正理解了闭环控制的精髓。建议大家在基本功能完成后,不妨尝试用不同材质的跑道(比如反光地板、毛毡布)来测试小车的适应能力,这对提升系统鲁棒性特别有帮助。