电赛小车跟随系统实战:MSP430主控选型与封装库制作全记录
简介2022年江苏省电子设计竞赛C题一等奖作品完整工程资料包以MSP432为主控实现主从协同寻迹小车主车用OpenMV完成图像识别、停止线检测与障碍物测距键盘下发指令、蜂鸣器反馈从车同样用OpenMV辅助视觉而外设简化通过串行通信与主车配合。整体方案以视觉替代传统超声波和光电传感器降低硬件成本并提升集成度适合备赛电赛、学习嵌入式开发和机器视觉的参赛者参考。压缩包共1026个文件以642个C源文件和172个H头文件为主体另含OpenMV的Python脚本、IAR/CCS工程配置、链接脚本及编译中间文件o、a、map等整体约18.45MB目录结构清晰可还原完整开发环境。已有3076人浏览学习。资料附赠MSP432封装库并覆盖主从车差异化外设分配、OpenMV寻迹与测距、串口通信、RTOS任务调度、电源设计和算法优化等关键实现在CCS或IAR中打开工程即可查看源码、重新编译与调试有助于复用一等奖架构、规避硬件布局和调试中的常见坑位是边学边做的实战案例。内容覆盖从底层驱动到上层图像算法的完整链路适合按模块拆解学习。 2022年的暑假我基本就是在实验室里度过的。白天调小车晚上画PCB凌晨爬起来跑测试那段日子至今想起来还带着焊锡和咖啡味。最终我们队完成的是C题“小车跟随行驶系统”拿了江苏省赛区一等奖。这个结果不算意外但过程里踩的坑、积累的经验尤其是一颗MSP430做主控到底怎么选、怎么做封装库我觉得很值得展开聊聊。这篇记录不光是分享获奖经历更会从题目拆解、主控选型、封装库制作与导入、系统联调、现场测评五个维度把整个项目的完整链路还原出来。无论你是准备电赛的在校生还是正在被Altium Designer和Cadence封装库折磨的板子工程师应该都能找到一点点有用的东西。1. 2022年C题到底在考什么一个看似简单的小车跟随系统1.1 题目拆解从一句话到一张功能清单2022年电赛C题的题目名称是“小车跟随行驶系统”要求设计一辆电动小车能够在铺有黑色引导线的赛道上自动跟随前方的小车行驶并且保持设定距离最终在指定位置停车。如果只看这个描述好像就是一个“避障小车加循迹”的组合但实际上手之后你会发现没那么简单。超声波测距数据会跳变、电机响应有延迟、灰度传感器受环境光影响任何一个环节没处理好小车在实验室台架上明明挺乖一上正式场地就瞎跑。我们把题目拆成了六个功能点启动与复位、前方测距、距离保持跟随、黑线循迹纠偏、停车控制、状态指示。每个功能点对应到硬件模块和软件任务这样在四天三夜里分工才清晰。比如我负责主控和PCB队友负责机械结构和传感器布置另一个人专门写控制逻辑大家并行推进。题目给的评分点也基本围绕这些功能展开跟随距离是否稳定、能否在直道和弯道正常行驶、能不能在终点前停车这些都需要可重复验证。所以赛前准备里最重要的一件事不是炫技而是把每个功能变成可以被测试的简单模块。1.2 赛前的软硬件储备我们不是那种从零开始现学现卖的队伍赛前一个月就把基础工具摸了一遍。软件方面熟悉了TI的Code Composer StudioCCS和Energia两种开发环境。CCS是正统的但打开慢、编译也慢Energia更像是Arduino底子的IDE适合快速验证超声波和电机驱动逻辑。真正比赛时我们用CCS写工程Energia只用来跑小实验。这里有个建议早点确定开发环境别中途频繁切换否则MSP430的寄存器配置很容易在切换过程中弄混。硬件方面按“主控板驱动板传感器模块”的方式备料。主控板最开始用MSP430G2553 LaunchPad等电路图确定后再转移到自制板驱动模块用TB6612FNG传感器准备了HC-SR04超声波模块、三路灰度传感器以及一个蜂鸣器模块。另外还准备了备用锂电池、备用电机和一些急停按钮这些都是比赛现场救命的东西。赛前一个月里我把MSP430G2553的引脚功能、定时器PWM、UART、ADC、输入捕获这几个外设都过了一遍并且用LaunchPad上的板载LED实际点了一遍。表面上看很低效但正是这种笨功夫让后面画原理图和写代码的时候完全不慌。2. 主控MSP430的选型逻辑为什么我们没用STM322.1 TI杯竞赛选TI芯片的现实考量网上关于电赛主控的帖子十个里有八个在说STM32给人的错觉是不用STM32就没法参赛。但电赛毕竟叫“TI杯”TI官方提供了大量资料和技术支持赛题设计里也会默认你对TI的芯片更熟悉。MSP430虽然不是性能最强的选择但它在低功耗、稳定性和开发资料完整度上有明显优势。更现实的是我们队伍当时对MSP430的掌握程度比STM32高与其在四天三夜里一边调车一边学一个新平台不如把熟悉的芯片用到极致。MSP430还有一层隐藏优势它内部有丰富的定时器和比较器很多外设的“小逻辑”可以不用写代码。比如超声波测距的Echo脉宽测量用输入捕获就能精确到微秒级PWM输出又独立于CPU电机调速占用的主循环时间几乎可以忽略。对一个主频16MHz、Flash 16KB的G2553来说这个效率很重要。2.2 MSP430G2553的资源评估与引脚分配我们最终选的是MSP430G255320引脚、16KB Flash、512B RAM。严格说RAM有点紧张但C题的控制逻辑不复杂不用跑系统纯裸机完全够用。如果要做摄像头或者FFT之类的算法G2553就不太合适了至少得上MSP430F5529但那不是我们这个题目的场景。引脚分配是画板子之前最重要的一件事我们当时花了一晚上把每个引脚的功能定死然后才开工画原理图。大致分配如下功能信号MSP430G2553引脚PWM左电机TA0.1输出P1.2PWM右电机TA0.2输出P1.3电机方向IN1/IN2P1.4/P1.5超声波触发TRIGP2.0超声波回波捕获ECHOP2.1蜂鸣器BUZZP2.2状态指示灯LEDP1.0灰度传感器ADC通道P1.6/P1.7注意P1.6和P1.7同时也是I2C引脚我们暂时当普通ADC用但预留了I2C上拉电阻的焊盘后面如果换传感器还能改。这种“留一手”的思路在PCB设计里很重要板上多几个空的0402电阻位成本几乎为0却可能省下一次飞线。2.3 最小系统的搭建MSP430G2553最小系统比STM32简单太多DVCC和AVCC接3.3VDVSS和AVSS接地RST引脚接10kΩ上拉到3.3V再在复位脚对地并联一个100nF电容。晶振不接也能跑因为内部DCO能提供1MHz到16MHz的时钟但为了串口通信的波特率稳定我们还是放了一个8MHz晶振和两个22pF负载电容。实测用内部DCO大概率也能撑完比赛但外界环境温度变化后串口偶尔会出现乱码所以自制板我坚持装了晶振。还有一个容易忽略的细节MSP430的AVCC和DVCC在封装内部是连接在一起的但PCB上建议用0Ω电阻或磁珠把它们分开否则模拟部分的噪声会从数字电源串进来。超声波测距的ADC采灰度传感器时如果电源纹波太大数据会像心电图一样上下乱跳。这个问题我们在调试中期才定位到最初以为是传感器坏了最后发现是电源布局的问题。3. 封装库从0到1AD和Cadence里的那些坑3.1 为什么坚持自己画MSP430封装标题里的“内含MSP430封装库”不是噱头而是我们在画PCB过程中被逼出来的。网上能搜到的MSP430G2553封装不少但很多出自不同的EDA工具、新旧版本混乱有些还标错了引脚间距。直接下载别人的封装库等于把风险带进自己的板子。我们决定自己画理由很简单自己画的封装即使出问题也能立刻追溯而且可以顺手把丝印、位号、3D模型都做到规范。另外电赛评奖虽然主要看功能和作品展示但很多评委老师会翻看PCB设计文件的细节。一个整洁规范的封装库能直接体现队伍的专业度答辩时也多了谈资。这就是“隐藏加分项”。3.2 Altium Designer里制作MSP430封装的流程如果你用的是Altium Designer并且需要给MSP430G2553做一个TSSOP-20封装可以按这个流程来。第一步打开芯片的官方数据手册里“Mechanical Data”一节的封装图记录引脚间距、引脚宽度、机身长度、宽度以及引脚跨距。第二步在AD里新建PCB Library点击Tools - IPC Compliant Footprint Wizard选择TSSOP-20把记录的数据填进去向导会自动生成焊盘和丝印。第三步手动检查焊盘尺寸。IPC向导生成的焊盘一般是长圆形引脚宽度的修正系数在0.25mm到0.3mm之间太宽容易连锡太窄又难焊接。第四步在封装上放置位号比如U1并设置位号在顶层丝印层。第五步可选但推荐用AD的简单几何形状画一个芯片的外形丝印并在机械层标出安装方向。做完这些后在原理图库中打开对应的MSP430元件在Footprint属性里Add选择刚才的封装保存并Compile集成库。这样从原理图导入到PCB时封装就不会丢失。3.3 封装库“用不了”的排查pcbdoc不是罪魁祸首网上经常有人问“AD封装库为什么用不了pcbdoc”我推测很多人是把封装库文件当成PCB文件来双击了。这里先厘清一个概念PCB文件的后缀是.PcbDoc封装库文件的后缀一般是.PcbLib或.IntLib。如果你用AD打开一个.PcbDoc然后在“库”面板里找不到你的封装原因不是库坏了而是这个库根本没有被系统加载。解决的办法是在AD右下角点开Libraries面板选择顶部菜单里的Libraries打开可用库管理窗口点击Install把.PcbLib文件添加进去然后在顶部搜索框输入封装名。如果原理图元件已经绑定了封装但导入PCB后还是显示unknown那大概率是工程里没有把这个原理图库和PCB库关联到一起。检查工程项目面板里的Libraries文件夹把封装库放进去并刷新。还有个坑如果你用的封装库是32位AD时代做的导入到高版本AD时偶尔会被标记为不兼容。这种时候可以在库文件上右键Save As另存为新格式的PcbLib再重新安装。别直接改后缀名那是没用的。3.4 Cadence Capture封装不显示的排查思路用Cadence的同学也常遇到“Capture中库封装无法展示”的问题。Cadence把原理图中的符号和PCB封装分成两套独立体系Capture里能看到符号不代表PCB Editor里能调出封装。第一步检查Options - Preferences - Footprint Libraries的库路径是否包含了你的封装库。第二步确认Capture元件属性里的“PCB Footprint”名称和库里的dra文件名完全一致包括大小写。第三步把库文件放到纯英文路径下中文路径在Win系统下经常会触发编码问题导致封装显示不出来。第四步检查Capture的log窗口看有没有加载错误提示这个log往往比肉眼找更直接。这类封装库问题看着琐碎但比赛前因为封装库折腾一个晚上的人真不在少数。我们把排错思路整理成了“先验证库本身再验证路径最后验证命名”的固定顺序后面就没再被这种问题绊过。4. 小车跟随系统的三个硬骨头测距、驱动、电源4.1 距离传感器与跟随策略超声波HC-SR04是C题最常用的前车测距方案便宜、接口简单但也有明显的物理局限波束角大约15°测量周期20ms而且对斜面的反射不稳定。刚开始我们直接拿测距值作为跟随误差结果小车在距离跳变的瞬间一耸一耸地走用户体验非常差。后来我们把跟随策略改成了“距离误差分档控制”误差大于5cm时全速追赶误差在±5cm内时按比例P控制误差小于-5cm时减速停车。这样既避免了全程P控制下电机响应太“神经质”也保留了稳态时的跟随精度。同时对超声数据做5次采样的中值滤波每次更新间隔50ms有效滤掉了孤立跳变点。灰度和测距是同时用的灰度传感器负责赛道约束超声波负责车间距离。检测到黑线时如果测距还正常就以“跟线优先、跟车保距”的方式行驶如果前车突然加速超出测距范围就原地等待不盲目追。这个逻辑相当于“安全兜底”在正式测评时帮我们避免了一次追尾事故。4.2 电机驱动与PID参数怎么调驱动部分用的是TB6612FNG逻辑供电3.3V电机供电7.4V输出PWM频率设在10kHz。TB6612和L298N相比压降小很多而且内阻低连续跑十几分钟也不怎么发烫。PWM直接由MSP430的定时器输出避免用延时函数产生方波不然主循环就被拖死了。PID控制我们只用了PD没有用积分项。原因是小车跟随系统的执行机构是直流电机本身就有一定的“积分”特性再加积分项很容易产生低频振荡。调试顺序是先只给P从小到大试到临界超调再给D抑制抖动。我们最后用的参数是P2D0.8采样周期50ms整数运算实现具体写法是int pid_step(int target, int current) { int err target - current; int derr err - last_err; int out (P_COEF * err D_COEF * derr) 8; last_err err; return out; }P_COEF和D_COEF分别乘了256最后右移8位还原。这个技巧在MSP430G2553上很关键因为芯片没有硬件浮点单元直接用浮点库做除法会有明显延迟而且占用的Flash和RAM都不小。整数运算让整个控制周期能稳定在50ms以内实测在评测现场跑起来毫无压力。4.3 电源和功耗的取舍整个系统的供电链路是7.4V锂聚合物电池 - MP1584降压到5V - AMS1117-3.3V给MSP430传感器由5V直接供电电机由电池直接供电。MP1584是DCDC模块效率高不会因为压差过大而发烫。之前我试过直接用7805从7.4V降到5V空载还好电机一转7805烫得能煎蛋后来才换成DCDC。模拟地和数字地的问题前面提过这里再强调一次MSP430的模拟地AVSS和数字地DVSS以及电机驱动的地在PCB上采用单点接地。我们用了一个0Ω电阻把模拟地和数字地连起来位置放在主控旁边。如果不做这个处理超声波回波信号会被电机换向时的尖峰干扰导致测距值突然从20cm跳到200cm现场看起来就是小车“抽风”。功耗方面MSP430整个系统在运行时电流大概在100mA左右停止时进入LPM3低功耗模式可以压到微安级。虽然小车系统没有真的靠电池续航来评分但低功耗意味着DCDC发热小、电池电压更稳定间接提升了传感器的数据质量。5. 省赛现场那些模拟不出来的测评细节5.1 现场环境与参数调整省赛测评现场和我们实验室最大的区别是光线更杂、地面材料不同、有大量其他队的无线设备和金属桌椅。这直接影响了灰度传感器的阈值。我们在实验室调好的阈值到现场扫一下地面几乎必然要重新标定。所以软件里一定要预留“参数在线调整”的手段。我们用了一个电位器接在MSP430的ADC通道上现场可以直接转动电位器改变灰度阈值完全不用重新烧录程序。这个设计在答辩环节还成了加分项评委对硬件细节很感兴趣。超声波在现场也容易受空旷空间和旁边队伍的设备干扰。我们做了一个简单处理连续读到5次距离都小于30cm才认为前方有车一旦Echo超时就进入“低速搜索”模式而不是直接停车。这样既不会因为一次干扰急停也不会盲目冲撞。5.2 演示流程的设计测评时间只有几分钟演示流程越简单越不容易出错。我们设计成裁判按下启动键 - 蜂鸣器响一声、LED亮 - 小车检测到前方3米内有目标车 - 自动起步跟随 - 行驶到停车点后停车3秒 - 蜂鸣器再响一声。整个流程不需要人工干预也不需要在现场连电脑调试。演示前排练了十几遍每遍都用秒表计时。有一次发现接触不良导致小车断电重启后来我们给电池接口上加了热熔胶固定把电源开关换成带锁的船型开关避免轻微震动造成断电。这些细节不写在设计报告里但在测评现场能救你一命。5.3 得奖后我复盘出的三个关键经验第一PCB和机械结构提前两周定版比赛最后两天只调软件参数绝不再改电路。我们第一版PCB有短路隐患飞到线勉强能用但心里没底后来第二版才稳定。第二把烧录口、串口、复位按键、电源检测点全部留在板子边缘现场改代码或者排查硬件不用拆底盘。第三所有传感器和模块都备双份比赛前突然坏一个模块如果你没有备件时间完全不够。这三条经验比那张一等奖证书更值钱。MSP430封装库在这次比赛中帮了大忙。赛后我把整理好的MSP430G2553封装和核心板源文件打包放了出来需要的朋友可以直接取用。拿到库以后先按第三部分说的流程验证一下封装名和引脚定义再画PCB不要盲目信任任何一个网上下载的库——包括我这份。毕竟封装库里每一个焊盘背后都是一块实实在在的电路板。本文还有配套的精品资源点击获取