1. 赛题解析与硬件设计要点
2024年全国大学生电子设计竞赛H题要求参赛队伍基于TI MSPM0系列MCU设计自动循迹小车。这个题目看似简单,但实际涉及硬件设计、算法实现和系统调试多个环节的紧密配合。我在去年指导学生参赛时,发现很多队伍在硬件选型阶段就埋下了隐患。
主控芯片选择上,MSPM0L1306是性价比很高的选择。这款芯片内置12位ADC和多个定时器,正好满足编码器信号采集和PWM生成的需求。记得第一次调试时,我们犯了个低级错误——没注意芯片的GPIO驱动能力,直接驱动蜂鸣器导致MCU复位。后来加了个S8050三极管就解决了,这个小教训告诉我们:数据手册的电气特性章节必须仔细阅读。
传感器布局是另一个关键点。常见方案有红外对管和灰度传感器两种:
- 红外方案成本低(单个约0.5元),但受环境光影响大
- 灰度传感器精度高(如TCS3200),但需要额外照明补偿
我们最终选择了五路红外对管,呈扇形排列在车前部。安装时要注意:
- 传感器间距建议3-4cm,太近会降低路径分辨率
- 离地高度控制在1.5-2cm,用螺母加垫片微调
- 每个对管串联220Ω电阻,避免过流
电机驱动部分,TB6612比L298N更适合竞赛场景。实测数据显示:
| 参数 | TB6612 | L298N |
|---|---|---|
| 效率 | 90% | 65% |
| 发热 | 轻微 | 严重 |
| 体积 | 小 | 大 |
编码器安装有个实用技巧:在电机轴和轮毂间加装3D打印的联轴器,避免打滑。我们用的600线编码器,配合MSPM0的QEI接口,速度测量误差能控制在±2%以内。
2. 循迹算法实战:从基础到优化
循迹算法的核心是如何将传感器信号转化为控制指令。常见的有三种方案:
基础阈值法是最容易实现的:
if(sensor[2]==1) 直行 else if(sensor[1]==1) 左转15° else if(sensor[3]==1) 右转15°但这种方法在急弯时容易丢线,我们初期测试成功率只有60%。
加权算法有明显改进:
error = (-2*sensor[0] -1*sensor[1] +1*sensor[3] +2*sensor[4]) / 检测到的传感器数量通过实验,我们优化出更鲁棒的版本:
- 增加动态阈值:每100ms计算一次环境光基准值
- 引入历史误差累积:error = 0.7当前误差 + 0.3上次误差
- 弯道预判:当连续3次检测到单侧信号时增大转向角
状态机算法适合复杂路径。我们将赛道分为五种状态:
graph LR A[直线] -->|检测到右转标志| B[右转] A -->|检测到左转标志| C[左转] B -->|完成转弯| D[修正] C -->|完成转弯| D D --> A实际测试中,状态机算法使全程通过率提升到92%,但需要精确的赛道建模。
3. PID控制深度调优技巧
PID参数调节是最大的难点。去年我们花了整整两天时间调参,总结出这套方法:
速度环PID调节步骤:
- 先设I=D=0,逐渐增大P直到出现等幅振荡
- 记录振荡周期Tu和增益Ku(我们测得Tu=0.8s, Ku=1.2)
- 按Ziegler-Nichols法设置:
- P = 0.6*Ku = 0.72
- I = 2*P/Tu = 1.8
- D = P*Tu/8 = 0.07
转向环需要特别注意:
- 微分项过大会导致高频抖动
- 积分项要加限幅,避免"windup"现象
- 实测发现Kp=0.5, Ki=0.1, Kd=0.03时响应最平滑
一个实用的调试技巧:用PWM占空比作为观测指标。当出现以下情况时:
- 持续满占空比:需要减小比例项
- 周期性振荡:适当增加微分项
- 静差无法消除:增大积分项
我们开发的参数自整定程序很有参考价值:
void auto_tune() { while(1) { step_response(); analyze_overshoot(); if(overshoot > 20%) reduce_Kp(10%); if(settling_time > 2s) increase_Ki(5%); if(oscillation) increase_Kd(15%); } }4. 系统集成与调试经验
硬件组装要注意机械结构的稳定性。我们遇到过:
- 电机支架松动导致编码器读数异常
- 线材缠绕影响转向
- 电池电压跌落引发MCU复位
推荐的结构设计:
- 底盘用2mm铝板激光切割
- 电机通过L型支架固定
- 电池置于重心位置
- 所有线材用扎带捆扎
软件调试建议采用分层验证:
- 先单独测试每个传感器
- 验证电机正反转
- 测试编码器计数
- 最后整合PID控制
一个血的教训:一定要做超时保护!我们在预赛时因为程序卡死在while循环,导致小车冲出赛道。后来增加了看门狗和软件超时判断:
if(millis() - last_update > 500) emergency_stop();现场调试时准备这些工具能事半功倍:
- 便携式示波器(观察PWM波形)
- 激光测距仪(校准编码器)
- 蓝牙模块(无线调试)
- 多种厚度垫片(调整传感器高度)
记得在省赛时,有个队伍因为场地灯光太强导致红外传感器失效。建议赛前准备不同颜色的滤光片,以及备用灰度传感器方案。