ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

电赛智能送药小车硬件实战:从STM32F407选型到调试

电赛智能送药小车硬件实战:从STM32F407选型到调试 每年电赛控制题最扎心的往往不是算法写不出来而是硬件先崩了。2021年的智能送药小车赛题我们队伍从方案论证到整车跑通卡了整整三天后面两天全在跟硬件毛病作斗争电机驱动发烫、灰度传感器误判、摄像头反复重启。这篇把整个硬件链路摊开讲主控选型、传感器布局、电机驱动、电源系统、接线装配最后是调试中真实踩过的坑和排查方法给准备打电赛控制题的队伍做个参考。1. 赛题分析与硬件方案整体定调1.1 赛题场景决定硬件需求智能送药小车的基本任务是小车从药房出发沿着场地引导线行驶经过若干岔路口最终在指定病房门口停靠完成“送药”动作之后还能原路返回或继续执行下一单任务。场地限定在模拟病房走廊的白色底板上引导线通常是黑色电工胶带病房门口有编号标识。这个场景翻译成硬件需求非常直白必须能“看见”黑线所以要有循迹传感器必须能“认出”病房编号所以要有视觉识别模块必须能往前走、转弯、准确停车所以要有电机、驱动器和闭环测速必须有一个“大脑”统一调度以上所有模块所以要有主控所有模块都得有电而且不能互相干扰所以要有稳定可靠的电源系统。这一套需求拆下来硬件架构的大方向基本就定了摄像头负责远距离识别目标灰度传感器负责近距离循迹编码器电机负责执行运动主控负责所有逻辑判断和电机控制。我们最后定的方案就是STM32F407核心板加OpenMV摄像头、8路灰度传感器、带AB相霍尔编码器的直流减速电机和TB6612电机驱动电池用2节18650串联的7.4V锂电池组。1.2 硬件选型的整体逻辑选型这件事很多人纠结“什么最牛”但电赛场景下更应该问“什么最稳”。四天三夜的工作量摆在那留给硬件焊接和调试的时间经不起折腾所以我们的原则是能用现成模块解决的绝不自己画板用成熟方案替换高风险自制设计。具体到几个核心决策可以给后来人一个参考主控STM32F407。理由很简单串口够多、定时器够多、处理速度快。OpenMV占用一个串口蓝牙调试模块占用一个串口备用还要留一个编码器需要两路正交解码定时器PWM输出还需要至少两路带死区控制的定时器通道F407这些资源全部富裕。视觉OpenMV4 H7。自带数字识别和颜色识别的现成库函数不需要在STM32上训练神经网络降低软件复杂度。循迹8路灰度传感器阵列。单路或三路灰度在岔路口识别上容易丢线8路的冗余度足够应付大部分场地情况。电机带霍尔编码器的直流减速电机。直接在电机尾部集成AB相编码器买来就能测速省去自己装码盘的麻烦。电机驱动TB6612FNG。相比L298N压降小、发热低、体积小电流能力1.2A每路对普通直流减速电机完全够用。电源7.4V锂电池组加DC-DC降压模块再通过线性稳压给主控和传感器供电。这套方案的最大优势是“每一块都有成熟的坑位”。你用任何一个搜索平台去查都能找到前人踩过的坑和对应的解决办法出了问题不至于两眼一抹黑。2. 主控选型与最小系统设计实操2.1 为什么选择STM32F407而非其他主控控制类赛题里常见的几种主控各有拥趸但实际对比下来差距很明显。51单片机资源太少一个稍微复杂点的PID控制加逻辑调度就把定时器和资源占满了更别提还要接入摄像头数据STM32F103算力够用但只有两个高级定时器如果既要两路编码器又要多路PWM引脚分配会捉襟见肘STM32F407则属于“一步到位的配置”168MHz主频、两个16位高级定时器可以分别做四路编码器输入加上DMA通道和大量串口后面就算题目临时要求增加功能也不会因为引脚不够被迫改方案。我至今记得在比赛现场旁边一队用51单片机搭循迹小车程序里所有功能都是裸奔的顺序执行一旦摄像头处理变慢就会导致电机PWM输出延迟车跑起来一拱一拱的。我们队的F407开了定时器中断分时调度循迹阈值更新、编码器采样、PID计算各占一个小任务时间分配得明明白白整车跑起来非常线性。2.2 核心板与最小系统的关键细节电赛现场不适合直接从零画板所以我们选的是市售STM32F407ZGT6核心板自己只做了底板接线。这里有一个特别重要的细节核心板上的复位电路、时钟电路和下载电路厂家已经做好了但上电时序和复位延时的可靠性仍然要自己验证一遍。我们遇到过一块核心板每次上电都要手动按一下复位才能启动程序排查到最后发现是板上复位电容偏大导致上电复位时间过长。后来换了一块电容参数合适的最小系统板问题就没再出现。如果你的队伍习惯自己画底板以下是最小系统的核心设计注意事项3.3V供电要加多个去耦电容典型配置是10uF电电容加0.1uF瓷片电容并联靠近MCU电源引脚摆放外部晶振的匹配电容需要参考芯片手册。F407推荐8MHz外部晶振配两个15-22pF电容虚焊或电容值不对会导致系统时钟不稳定程序偶尔跑飞SWD下载口需要留出最理想的情况是引到一个四针排针上方便随时用DAP-Link或ST-Link烧录调试串口1默认是调试打印口建议留一个专门的5V转TTL模块接口比赛时用来看实时状态排查问题效率极高。2.3 引脚分配的规划心得引脚分配看似是设计文档里最不起眼的一环实际却是后面所有接线和编程的根基。我们是先画了一张引脚功能表再开始接线全程没有扯皮的情况。给大家一个参考规划功能模块引脚分配备注左电机PWMTIM1_CH1PA820kHz右电机PWMTIM1_CH2PA920kHz左电机编码器A/BTIM4_CH1/CH2PB6/PB7正交解码右电机编码器A/BTIM8_CH1/CH2PC6/PC7正交解码OpenMV串口USART2PA2/PA3115200波特率8路灰度传感器任意8个GPIO配置为上拉输入调试串口USART1PA9/PA10用USB转TTL一句话提醒编码器输入引脚必须选在具有正交解码功能的定时器上盲目乱接会导致你的代码只能读取脉冲数但无法判断方向。别问我怎么知道的我第一版接线图就是因为没查定时器映射浪费了两个小时。3. 视觉循迹与灰度传感器的硬件落地3.1 灰度传感器的工作原理与选型灰度传感器的本质是红外反射式光电传感器。我们把TCRT5000模块向地面照射红外光黑色胶带吸收红外光反射率低输出高电平白色底板反射率高输出低电平。这样黑线就变成了一组数字信号主控通过判断哪几路为高电平就知道车相对引导线偏移了多少。选型上我们用的8路灰度阵列模块每路配一个可调电位器通过旋钮调节比较器触发的阈值。这里有个来自实际操作的经验阈值调节不是拧完就一劳永逸的环境光强度、底板材质、传感器离地高度都会影响最佳阈值。正确做法是在比赛场地实地调把车放到线上观察每路LED灯的状态确保黑线处亮灯正常、白底处灭灯正常。我们在实验室调好的参数一到比赛场地几乎必然要重新调因为场地的灯管色温和实验室差别很大。3.2 灰度传感器的布局与安装高度8路灰度阵列的安装间距对循迹效果有直接影响。我们量过单路传感器之间中心距12mm整个阵列总宽度约96mm引导线宽度标准是2cm左右这样无论车体怎么偏移总有两三路传感器压在线内得到的偏移量精度足够PID控制器平滑纠偏了。离地高度的把控同样需要认真对待。TCRT5000的可靠检测距离大约在3~15mm但距离越远环境光干扰越强边缘反射越模糊。我们的经验是离地8~10mm既保证反射信号强度也让传感器在轻微颠簸时不会因为离地太近而频繁抖动出错误数据。安装支架上我们还加了四个弹簧柱保证传感器在车体重心偏转时依然能贴合地面变化而不是悬空乱摆。3.3 OpenMV的安装位置与接口处理OpenMV负责识别病房编号安装位置非常讲究。我们最开始把摄像头装在车头正前方垂直朝上仰角15度结果视野里看到的全是天花板灯管反光严重数字识别成功率很低。后来把摄像头支架改成前倾45度左右让镜头同时看到前方地面和门牌区域识别率一下就上去了。OpenMV和STM32之间用串口通信波特率115200。硬件接线上必须共地否则串口信号会飘。OpenMV供电要求5V、电流峰值接近500mA如果直接从主板上的排针取5V很容易因为电流不足导致模块重启。我们后来直接从电源模块的5V输出端单独拉了一路给OpenMV并在靠近OpenMV电源引脚处并联了一个470uF电解电容作为缓冲问题彻底解决。3.4 光照与电源噪声这两大隐性杀手视觉模块最怕两类问题一是光照剧烈变化二是电源纹波。灰度传感器在红外波段工作不同材质和不同光照下的反射率差异很大。比赛场地如果有大面积窗户下午的太阳光斜射进来灰度传感器数值会比上午偏出30%以上。解决思路有两个硬件层面把传感器支架做成遮光罩软件层面每次发车前先执行一次重新标定。电源纹波对OpenMV的影响尤其致命。摄像头在对焦或图像处理瞬间电流会忽然蹿高如果电源带载能力不足电压就会跌落几毫秒导致摄像头丢帧甚至黑屏。排查的时候用示波器看5V波形发现纹波超过200mV就要处理了优先加大滤波电容和检查地线走线。4. 驱动电机、底盘与机械结构选型4.1 电机选型的数学逻辑很多人选电机只看扭矩和转速标称值不看实际负载匹配。我们当时做了一个很简单的估算假设送药小车质量2kg场地最大直道长度5m要求在20秒内走完并停车平均速度0.25m/s正常巡航速度大概需要跑到0.5m/s。车轮半径65mm换算成轮子转速大约是73转/分钟。电机减速比的选择要考虑扭矩余量。73转/分钟对应到减速比1:30的JGB37-520电机上电机本体转速恰好约2200转/分钟工作在效率区间。而1:20减速比虽然速度快但起步扭矩不足在摩擦力较大的地面容易堵转1:50减速比扭矩大但速度偏慢遇到需要抢时间的赛道就吃亏。最后我们选定1:30最大速度和爬坡扭矩之间比较均衡。4.2 电机驱动电路的关键细节TB6612FNG是我们最终采用的电机驱动芯片。它和L298N的核心区别在于MOSFET工艺代替了达林顿管压降从2V降到0.3V左右同样电池电压下电机获得的实际驱动电压更高同等占空比下转速更快而且长时间大电流工作发热量显著更低。接线方面STBY引脚必须拉高使能芯片否则输出始终为高阻态。VM接电池电压VCC接3.3V逻辑电平PWMA/PWMB接PWM引脚AIN1/AIN2、BIN1/BIN2是方向控制引脚。仔细检查逻辑表IN11、IN20时正转IN10、IN21时反转。我们曾经把两个电机IN端子接反导致程序里设置的“前进”实际是“左转”排查了很久才发现。PWM频率的设置也有学问。TB6612官方手册建议100kHz以内但实际电机电感在高频下会有啸叫和效率下降。我们最后把PWM频率设在20kHz超出人耳可听范围电机运行安静且发热正常。代码里初始化定时器要注意重装载值、预分频器和时钟频率三者对应关系F407主频168MHz时PSC83ARR99正好能得到约20kHz且占空比精度1%。4.3 编码器测速与闭环控制的硬件前提电赛小车不装编码器做闭环基本等于裸奔。开环情况下电池电压降低、地面摩擦变化、负载增减都会让车速偏移导致循迹和停车动作全部失效。JGB37-520电机尾部自带的霍尔编码器输出AB两相信号每转输出13个脉冲电机减速比30因此车轮每圈大约输出390个脉冲配合定时器4倍频技术实际分辨率为每圈1560个计数测速精度在小车轮径下足够用了。硬件接线注意A相和B相不能接反否则定时器解码出来永远是反向计数。编码器供电一般是5V输出信号电平也是5VSTM32引脚耐压3.3V所以中间要加电阻分压或电平转换电路。我们直接用了5V转3.3V的电平转换模块稳妥省事。4.4 底盘与重心的机械处理底盘结构我们选择两轮差速加一个万向轮的三点支撑方案。相比四轮结构两轮差速转弯半径小、控制逻辑简单转弯性能更适合狭窄病房走廊场景相比麦克纳姆轮两轮差速成本低、结构简单调试复杂度大大降低。重心位置对小车的循迹稳定性影响非常大。最初我们把电池放在车尾结果加速时车头上扬灰度传感器离地距离改变循迹瞬间失效。后来把电池、主控板和驱动板全部集中在底盘几何中心偏后一点的位置整车重心落在两个驱动轮轴心附近前后载荷均匀起步和刹车时传感器离地高度波动几乎可以忽略。装完车后一定用手按一按四个角如果一个角明显松动或者倾斜说明底盘刚性不够转弯时车身状态会出现不可控的形变。5. 电源系统的设计与功耗估算5.1 供电拓扑的设计思路智能送药小车的硬件系統里有两种截然不同的电源需求。电机需要7.4V左右的电压和2A以上的峰值电流属于“动力电”主控、传感器、OpenMV需要3.3V或5V的精密稳定电压属于“逻辑电”。两者混在一起供电是新手最容易犯的错误电机会在起步大电流瞬间拉低整个系统电压导致主控复位、摄像头掉线。我们的供电拓扑是7.4V电池 → MP1584降压模块输出5V5V分两路一路给OpenMV和灰度传感器一路经AMS1117-3.3给STM32和编码器供电。电机直接由7.4V电池供电不经降压模块。这样电机电流的突变只影响电池端电压而降压模块的输入有足够的电容缓冲输出端纹波保持稳定。5.2 功耗估算与电池选型功耗算清楚才能确定电池容量和续航时间。电机额定功率约3W一个两个合计6WTB6612自身损耗约0.5WOpenMV满载约1WSTM32核心板约0.5W灰度传感器阵列约0.5W。总功耗约8.5W以平均电压7.4V计算平均电流大概1.15A。2节18650电池组典型容量为2500mAh2.5Ah理论上可连续运行约2小时。比赛单趟任务要求时间远小于这个数值所以续航完全不是问题。不过要注意的是18650电池内阻会影响瞬时电流输出能力。两个电机同时起步时电流峰值可能达到3A甚至更高如果电池内阻过大端电压会被瞬间拉低到6V以下触发TB6612低压保护。选电池的时候我们专门选了低内阻动力型18650而不是普通容量型这一点在启动阶段体现得十分明显。5.3 电源PCB布线与滤波实操电源接线看似简单但布线方案决定了系统稳定性。我们手里的模块全都是独立小板的跳线连接无法像PCB那样进行完美的星型布线所以唯一有效的办法是减少电流环路面积。具体做法是电机电源线和逻辑电源线分开走线在电池正负极处各自做一条独立的功率线电池负极是所有电路的公共地但电机驱动的地线节点和大功率地线节点尽量靠近电池端而不是靠近主控端。滤波电容的布置顺序是电池输出端并联470uF电解电容降压模块输出端并联两个22uF陶瓷电容和1个100uF电解电容主控板的3.3V输出处再并联若干0.1uF瓷片电容。串联下来每一级的纹波都能被压制到合理水平。我们当时用示波器测过电机高速运行时5V输出端的纹波峰值能控制在60mV以内OpenMV运行非常稳定。6. 整车接线与装配关键细节6.1 接线清单与防错设计整车接线是第一天晚上最耗时间的环节没有一张清晰的接线表就像没有地图的航行。我们的接线清单给大家参考线路类别接口来源目标接口备注电池正极电池组TB6612 VM、MP1584输入线径18AWG电池负极电池组TB6612 GND、MP1584输入-公共地左电机供电TB6612 AO1/AO2左电机端子电机线绞合右电机供电TB6612 BO1/BO2右电机端子电机线绞合左编码器A编码器A相STM32 PB6加电平转换右编码器A编码器A相STM32 PC6加电平转换灰度阵列电源5V/GND传感器模块VCC/GND靠近阵列处加电容OpenMV串口STM32 PA2/PA3OpenMV UART TX/RX交叉连接调试串口STM32 PA9/PA10USB转TTL模块交叉连接接线防错有一个很实用的技巧所有信号线用不同颜色区分电源正极统一用红色、电源负极统一用黑色、PWM信号线用黄色、编码器信号线用绿色、串口信号线用白色。这样调试时一眼就能通过线颜色判断线路功能不会出现拿着万用表东捅西捅的尴尬局面。6.2 装配流程与重心调整装配流程我们总结出一套最省事的顺序先装电机和底盘再装驱动板和主控板最后装电池和传感器支架。电机装好后立刻转一圈确认减速箱没有卡涩异响驱动板固定时加铜柱避免板子底部金属引脚跟底盘金属板短路主控板装好后烧录一个最简单的LED闪烁程序验证最小系统没问题再开始接其他外设。电池固定是整个装配中容易被低估的环节。电赛现场很多小车跑着跑着电池线松脱就是因为电池没有可靠固定。我们的做法是用魔术贴把电池牢牢粘在底盘上电池输出线留出一段足够灵活但不至于甩动的余量所有线束用缠绕管整理好尽量贴着底盘走线。整车重心调整好后用手指拨动车身松手后车身应该能快速回正没有明显的偏斜或抖动。6.3 接地与抗干扰的实战经验全场域接地是硬件稳定性的命根子。OpenMV的GND、STM32的GND、TB6612的GND、灰度传感器的GND以及电池的负极必须全部连通而且连接点要尽可能靠近电池负极端。我们发现有些队伍的车单独给OpenMV供电但不共地结果OpenMV串口发送的数据全是乱码因为两者之间的参考地电位不同。电机是最大的电磁干扰源。直流电机电刷在换向瞬间会产生很大的瞬态电压尖峰这个尖峰通过电源线和空间辐射耦合到信号线会让灰度传感器输出抖动、编码器读数跳变。硬件上我们在电机两端并联了一个0.1uF瓷片电容加一个10uF电解电容并用铜箔胶带包裹电机线做屏蔽干扰明显下降。如果调试中遇到传感器读数无故跳变先不怀疑主控程序回头处理一下电机干扰反而更快见效。7. 硬件调试中的常见问题与排查记录7.1 电机不受控制乱转现象程序里给的PWM占空比不变但电机转速忽快忽慢甚至方向偶发反转。排查思路先测TB6612的VM电压是否稳定再测STBY引脚是否为高电平最后检查IN1/IN2方向控制逻辑是否被其他外设的GPIO复用改写。我们遇到过一种情况AIN1引脚错接到了编码器引脚上编码器脉冲信号瞬时触发方向反转逻辑导致电机诡异抖动。用万用表逐个量引脚和原理图的映射关系一眼就能定位。7.2 编码器读数异常偏高或偏低现象车走直线编码器累计数左右不对称。原因通常不是软件积分误差而是硬件接线或机械装配问题。检查左右编码器信号线是否用相同规格的导线换一个更长的软线读数偏高的那侧往往是因为信号线太短产生了反射干扰。另外左右轮气压或者轮径不一致也会导致实际里程不同这是机械问题软件怎么调PID都救不回来。我们最后用游标卡尺量了两个轮胎的直径发现误差达到2mm换了一对匹配的轮胎后编码器数据立刻正常了。7.3 灰度传感器在黑线边缘反复抖动现象小车在直道上走S形传感器输出在0和1之间频繁跳变。原因大概率是传感器离地高度过高、检测盲区太大或者阈值电位器调到了临界值附近。处理手段降低传感器高度到8mm左右并把阈值调到在黑线上时为稳定高电平、在白底时为稳定低电平如果还抖可以给传感器输出并联一个100nF电容做低通滤波把高频抖动滤掉。另外检查阵列的安装支架是否有虚位车体震动时传感器松动会造成完全随机的误判这是装配问题不是调试能解决的。7.4 OpenMV识别房间号时偶尔死机重启现象小车运行一段时间后OpenMV黑屏或者串口没有数据输出按复位恢复正常。根因往往是电源瞬时跌落。OpenMV在图像采集和算法处理时电流波动很大如果5V供电线太细太长压降在电流峰值时会超过OpenMV工作范围。解决办法换18AWG粗线连接5V电源在OpenMV电源端并联470uF电容并把OpenMV和电机驱动的电源回路断开改为单点共地。改完之后连续跑几十趟都没再重启过。7.5 整车联调时丢线撞墙现象小车在直道上走得好好的一到岔路口就毫不犹豫地冲出赛道。这不是单纯硬件问题但硬件层面有很大嫌疑。灰度阵列宽度如果小于弯道曲率半径转弯时外侧传感器可能完全脱离黑线导致全部传感器输出为白底主控丢线判定错误。解决方法是把灰度阵列支架做成可调整式往两侧加宽同时让转弯速度降到正常速度的40%给PID足够的响应时间。如果加宽后仍然丢线检查一下车体前部的重心压载前轮抓地力不足会导致转弯时车头外甩。7.6 硬件调试对比总结故障现象主要排查方向常用工具解决办法电机转速不稳驱动芯片供电、PWM映射万用表、示波器检查VM电压、引脚映射编码器读数不对称信号线阻抗、轮胎一致性游标卡尺统一线材规格、换匹配轮胎灰度抖动安装高度、阈值、滤波示波器、万用表降高度、加大电容滤波视觉模块重启5V带载能力、电源纹波示波器粗线供电、加大电容弯道丢线阵列宽度、转弯速度目视观察、视频回放加宽阵列、降低过弯速度最后再分享一个所有控制题通用的硬件经验比赛前夜无论项目多赶一定留出两个小时做整车老化测试。把车放在场地里反复跑每次都记录电池电压变化、传感器温度和有没有异常声音。我们那年就是在老化测试里发现电池用了半小时后电压下降导致后段速度明显变慢后来换了容量更充足的电池组这才稳住了整场比赛的发挥。硬件问题从来不是靠临时抱佛脚能解决的全靠提前做减法把每一个可能出问题的环节在赛前全部排干净。
返回列表