第二十一届全国大学生智能车竞赛的备赛季已经陆续开始了。这个时间点上,一支自嘲“疯狂电路组”的队伍 soberup 把自家电路组的开源目录放了出来,目录里是他们在硬件方向上的整套设计资料。对准备参赛的队伍来说,这相当于提前拿到一份“已经踩完坑”的路线图;对做嵌入式硬件、想上手智能车的学生来说,这份目录又像一本活电路教科书,从电源到驱动再到信号调理,几乎覆盖了智能车硬件的主干。
先说点泼冷水的话:很多人以为电路组就是画两块板子、焊几排线,实际上从原理图到能稳定跑完全程,中间隔着的坑比想象中多得多。soberup 的目录之所以值得逐项拆开看,是因为它把“电路”这件事做成了可以复制的工程流程。这篇文章就顺着这个目录,把设计逻辑、实操步骤和隐藏经验摊开讲一讲。
1. 开源目录的结构:一支队伍应有的“知识交付物”
1.1 目录里真正值钱的东西,不只是原理图和源码
我见过不少所谓开源项目,最后成果丢出来,代码一个压缩包,原理图一个 PDF,就完事了。这种开源对后来者的价值会缩水一大半。soberup 的目录组织方式比较有代表性,它把交付物分成四块,每一块都有明确用途:
- 硬件工程:原理图源文件、PCB 源文件、BOM 表、光绘文件、位号图。
- 固件工程:编译器工程、外设初始化代码、版本对应关系、烧录说明。
- 调试资料:上位机、串口解析脚本、调参记录、采集数据的处理脚本。
- 文档笔记:设计说明、测试记录、踩坑清单、赛后的复盘总结。
这四块缺哪一块都会让复现成本陡增。就拿 BOM 表来说,很多队伍只写“电阻 10k、电容 0.1uF”,不标封装、不标耐压、不标电流等级,也没写替代料。结果后来者画板子的时候自己去猜封装,贴片 0603 和 0805 混在一起,回来焊不上或者载流不够,这才发现原版设计根本没法照抄。一份合格的 BOM 应该带上位号、型号、封装、数量、单价、替代型号,这样别人才能真正做到“按单采购、按图施工”。
固件工程和硬件必须对应起来,这一点尤其容易被忽视。同一块板子,V1.0 和 V1.1 的引脚定义可能都变了,代码却还沿用旧版本,最后点灯不亮,排查半天发现是 GPIO 写错。开源目录里把“硬件版本”和“固件版本”的对应关系写清楚,能省掉后来者大量无意义的时间消耗。
还有一类资产容易被低估:调试记录和踩坑清单。原理图只会告诉你“这里连了一个 100nF 电容”,不会告诉你“这个电容是某次上电复位后加上的,因为电机启动瞬间电源被拉低导致 MCU 掉电重启”。这种从现象到根因的笔记,才是开源目录里最值钱的部分。
1.2 版本与文档管理:决定开源价值的隐形工作
看一个开源目录的专业程度,看它的版本管理方式就够了。我比较推荐的做法是硬件、软件同步编号,比如 v1.0_0520、v1.1_0603,每次改版都记清楚改了什么、为什么改。这样比赛结束三个月后,你翻回来看目录,还能想起来当时为什么要把电感从车头挪到车尾,而不是对着两块几乎一样的板子发呆。
改动记录不用搞得很复杂,一张表就够了:
| 时间 | 改动内容 | 原因 | 影响范围 | 验证结果 |
|---|---|---|---|---|
| 06-03 | R12 由 10k 改为 22k | 电磁信号放大倍数过高,近线时饱和 | 运放增益、ADC 数值 | 直道+弯道各测 5 圈,稳定 |
| 06-10 | 电机驱动 H 桥自举电容换 1uF | 高占空比下上管驱动不足,MOS 发热 | 电机驱动、PWM 频率 | 满载 10 分钟温度正常 |
这种表格,每一次改动其实都在回答一个“为什么”。真正有价值的开源不是把成品放出来,而是把决策过程放出来。很多队伍只顾着赶进度,从不记录,比完赛想开源的时候发现自己根本讲不清当初为什么这么设计。所以如果你明年还想再战,我的建议是从备赛第一天就建立版本管理和调试记录的习惯,比赛结束时的“开源目录”,就是你这几个月最完整的成长档案。
2. 核心电路逐块拆解:电路组的硬实力藏在哪
2.1 电源系统:buck 电路的选型逻辑与效率账
智能车整车的能量来源是一块锂电,常见的是 2S 7.4V 或者 3S 11.1V,具体看赛题规定。问题在于,电池并不是理想电压源,电机启动、急刹瞬间电池电压会被拉低一截。电源模块的任务不是“输出 5V”这么简单,而是在各种瞬态下稳住输出。
车载上需要供电的东西大致分三类:MCU 与传感器(3.3V、5V)、电机驱动逻辑部分(12V 或电池直供)、屏幕和扩展外设(5V)。如果全用一个 LDO 从 7.4V 降到 5V,电流一大,热耗会非常夸张。算一笔账:压差 2.4V,电流 0.5A,线性稳压上的损耗就是 1.2W,够把一个 SOT-23 封装的片子烤到烫手;换成同步整流 buck,效率按 90% 算,同样条件下损耗大概只有 0.3W 左右,差出 4 倍量级。所以大电流路径用 buck,小电流模拟电路用 LDO,是智能车主电源架构的一个基本共识。
常见方案是选一颗同步整流 buck,比如 MP2315、TPS563200、SY8303 这一档,持续电流 2A 到 3A,封装小,外围简单。选型时留足裕量,持续电流按负载峰值电流的 1.5 倍以上选,别卡着极限算。这里有个容易踩的坑:buck 输出电压纹波并不小,如果不加处理直接给摄像头供电,画面上很容易出现滚动横条。经验做法是 buck 输出之后再加一级 LC 滤波,或者对噪声敏感的模拟电路用二级 LDO 单独供电。摄像头这种数字+模拟混合的设备,最好独立一路低噪声电源,别和舵机、电机驱动逻辑电混在一起。
| 方案 | 效率 | 纹波 | 适用场景 |
|---|---|---|---|
| Buck | 高,80%~95% | 较大,需要后级滤波 | 电机驱动逻辑电、摄像头主供电、舵机 |
| LDO | 低,压差越大损耗越高 | 低 | 运放供电、小电流 MCU 供电 |
| 电荷泵 | 中等 | 中等,电流能力小 | 产生负压、辅助供电 |
2.2 电机驱动:半桥、IR2110、图腾柱之间的那点事
有刷直流电机是典型的感性负载,峰值电流大,还要频繁正反转和刹车。控制电机,本质上是用 PWM 控制 MOSFET 的开关,但 MOSFET 的栅极有米勒电容,直接拿 MCU 的 GPIO 去推,上升沿拖得又长又难看,开关损耗和发热都上去了。所以栅极驱动级一定要有足够的灌电流和拉电流能力。这里就涉及到“图腾柱”这个概念:所谓图腾柱输出,就是两个三极管一个负责拉高、一个负责拉低,一个推一个挽,输出级驱动能力很强。你可以把它理解成水龙头开阀,一个负责充水,一个负责放水,阀门开得才利索。
很多队伍用的是 IR2110 这类半桥栅极驱动芯片,内部已经把图腾柱输出和自举电路集成了。IR2110 驱动一个半桥,两个半桥拼成全桥,就能做电机正反转和刹车。用 IR2110 时有几个细节值得注意:
- 自举电容的选择要配合 PWM 频率。常用 0.1uF 到 1uF,频率高取小值、频率低取大值,容值太小上管维持不住,容值太大会影响自举充电速度。
- 栅极电阻一般在 10Ω 到 22Ω,调这个电阻可以控制开关速度,也能缓解振铃。这里不要照抄别人参数,得匹配自己的 MOSFET 栅极电荷量。
- 死区必须处理。上下管同时导通就是直通短路,管子瞬间冒烟。IR2110 内部有一定死区,但软件上也要尽量保证 PWM 互补输出时有合理的空档时间。
半桥驱动这块最小系统大概就这些件:IR2110 芯片、两颗 MOSFET、自举电容、栅极电阻,再加续流路径。电机是感性负载,PWM 关断瞬间电流不会突变为零,如果没有续流通道,反电动势直接打在 MOSFET 上,一次就能打穿。这也是很多队伍“一上电电机转两下管子就炸”的常见原因之一。续流可以用功率二极管,也可以依赖 MOS 管内部的体二极管,但要确认其电流和时间参数足够。
2.3 传感信号链:运放经典电路和差分放大怎么落到智能车上
智能车感知主要分两路:摄像头组看图像,电磁组读电感。无论哪一路,信号调理都是电路组的重点。
电磁组的经典方案是:空心电感 + 谐振电容,谐振频率对准赛场电磁线的激励频率。电感感应出来的信号是正弦波,幅值能反映车和电磁线的相对位置关系,但这个信号非常微弱,必须放大。于是运放就登场了。很多人问“运算放大器 11 种经典电路”到底学哪些,真正常用的其实就四板斧:
| 经典电路 | 作用 | 智能车里的典型位置 |
|---|---|---|
| 电压跟随器 | 提高输入阻抗,隔离前后级 | 高阻抗传感器输出,避免信号衰减 |
| 同相放大器 | 放大微弱信号,输入阻抗高 | 单个电感信号的增益放大 |
| 差分放大器 | 两路信号做差,抑制共模干扰 | 左右电感偏差提取 |
| 有源低通滤波器 | 滤除高频噪声和 PWM 干扰 | 传感器输出、运放输出后端 |
差分放大器在智能车上非常重要的原因,是车上的电磁干扰源实在太多。电机 PWM、buck 开关节点、电源走线,都会通过空间辐射和地线耦合到传感器回路上,形成严重的共模干扰。差分放大天然对两条输入线上“同向同幅”的干扰不敏感,只放大两路信号之间的差值,这就把噪声抵消掉一大半。如果你用单端放大去处理长距离传输过来的微弱电感信号,PWM 噪声会一起被放大,ADC 数值跳得跟心电图一样,算法根本没法用。
这里再补一个滤波的计算方法。一阶 RC 低通截止频率 f = 1 / (2πRC),比如 10kΩ 电阻配 0.1uF 电容,截止频率差不多 159Hz,既能保留电磁信号的低频变化,又能滤掉高频噪声。想滤得更多就加大电阻电容乘积,但也要小心把有用的信号边沿滤没,响应变迟钝。
传感器信号线上的防抖,其实分两层:电路层的 RC 滤波、施密特触发器去抖,和软件层的滑动平均、卡尔曼滤波。只靠软件硬扛,扛不住硬件带来的周期性干扰;只靠硬件滤,又容易把关键跳变磨平。两边配合才是正路。
2.4 可靠性设计:看门狗、复位与电源保护
赛场上 MCU 死机是特别要命的事,车正在高速冲线,突然失控,轻则跑飞,重则撞墙。看门狗在这里的作用,不是触发一次就完事,而是在程序跑飞后把车拉回可控状态。内部看门狗和外部看门狗芯片都可以用,相对来说外部看门狗(比如 MAX809、MAX823 这类)更硬,它不依赖 MCU 内部时钟,还能顺带做欠压复位。
喂狗的位置有讲究,原则是放在主循环的关键控制路径上,不能在中断里喂。因为程序跑飞时中断可能还在照常触发,在中断里喂狗,看门狗永远喂不饱,也就失去了兜底意义。一个简单的示意:
while (1) { scheduler_run(); // 调度传感器采集与控制任务 if (ecu_ok()) { IWDG_ReloadCounter(); // 确认主流程正常走到这里再喂 } }复位电路也一样,不要只放一个电容一个电阻完事。专用复位芯片能在上电瞬间给出可靠复位脉冲,也能在电源低于阈值时强制复位,比纯 RC 复位靠谱得多。电源保护方面,反接保护很必要,有极性防反接 MOS 管方案,也有理想二极管控制器方案,后者导通压降比肖特基二极管低很多,功率损耗小。再就是 TVS 管和自恢复保险丝,摄像头排线接口、下载器接口这些容易被静电和热插拔伤害的入口,各放一颗做保护。
无源蜂鸣器驱动这种小细节也很典型。蜂鸣器用三极管开关驱动,反向并联续流二极管吸收关断尖峰,不能直接拿 MCU 引脚硬推。这种电路很小,但能在调试时省很多事——不同音调代表不同状态,站在赛道边就能知道车现在卡在哪一步。
3. 一套可以照抄的硬件制作流程
3.1 从规则表到 BOM 表:需求拆解与器件选型
拿到赛题先不要急着开软件画原理图。先把规则里能影响硬件的点全部列出来:赛道元素有什么、车辆是几轮驱动、用什么传感器、MCU 是哪颗、电池电压范围是多少。这些决定你要做几路电机驱动、几路信号采集、几个通信接口。很多队伍第一步就错了,上来按网上模板画板,结果规则一变,又重新改版,白白浪费两三周。
需求拆完之后,逐项列功能清单:电机驱动 ×2、编码器接口 ×2、摄像头/电磁接口 ×1、电源输入 + 多路输出、调试串口、按键、LED、蜂鸣器。然后按功能分区在纸上画系统框图。这个时候再进 EDA 工具,思路会非常清楚。
选型阶段要守住一个原则:留冗余、少堆料。以电机驱动半桥为例,一颗 IR2110 加两颗 N-MOS,再配几个阻容,就能把一路半桥做扎实。
| 位号 | 型号 | 封装 | 数量 | 说明 |
|---|---|---|---|---|
| U1 | IR2110S | SOIC-16 | 1 | 半桥栅极驱动 |
| Q1/Q2 | IRLR7843 | DPAK | 2 | 低导通电阻 NMOS |
| C1 | 1uF/25V X7R | 0603 | 1 | 自举电容 |
| R1/R2 | 15Ω | 0603 | 2 | 栅极电阻 |
选型时边选边维护 BOM 表,写上价格和替代料。到现场临时缺货这种事很常见,替代料先写在表里,真到焊板子那天能救你一命。还有一个小习惯:每颗料的封装方向、引脚间距要对照 Datasheet 核对一遍,画反二极管、画反 MOSFET 源漏,都是新手翻车高发问题。
3.2 PCB 布局布线的取舍与禁忌
PCB 布局的核心就一句话:把功能区块划清楚,让大电流回路短而粗,让敏感信号远离干扰源。电源入口放板边,MCU 居中靠接口,电机驱动靠近电机排线座,传感器接口靠近板边方便走线。
电源部分做一级局部铺铜,Buck 开关节点底下尽量不要走长信号线。摄像头的数字信号线是高频数字信号,最好加 33Ω 串阻抑制振铃,排线不要太长,否则信号完整性会明显变差。晶振底下不要走线,晶振到 MCU 的走线要短,周围用地过孔围起来。
载流能力要算明白。1oz 铜厚下,1mm 宽的铜箔大概能走 1A 电流,长距离和高温环境下要加宽或者铺铜。电机驱动这类大电流路径,单纯靠走线并不靠谱,直接铺铜加多个过孔阵列过渡到另一面,过孔不能只打一两个,0.5mm 孔单孔载流有限,并联三到五个才稳。
两层板和四层板的选择,我建议预算允许就尽量上四层。四层板中间一层完整地平面,对摄像头高速信号和电源回路都有明显改善,很多疑难干扰问题在两层板上是天生无解的。两层板不是不能用,但布线和地线分割要多花很多心思。
3.3 焊接、上电与分级调试
焊接顺序要能保证每上一步电,都能立刻验证结果。我的习惯是先焊电源部分,再焊 MCU 最小系统,最后焊外设接口和驱动。焊完电源,只上电量 buck 和 LDO 的输出,确认电压正常再继续。别等整板焊完再上电,那样出了问题根本分不清是电源短路还是信号线连错。
上电流程有一个非常实用的小经验:第一次上电用可调电源,电流限制设到 100mA 到 200mA,电压调到额定值。如果电流瞬间顶到限流值,立刻断电,大概率有短路,先拿万用表量电源对地电阻排查。这种“限流上电”能救下无数芯片和板子。
焊接工具方面,热风枪吹 QFN 这类引脚在底下的芯片时,温度不要开太高,350℃ 左右、风速三挡、距离两厘米,顺着芯片周边小幅度画圈加热,焊盘上的锡化了芯片自然坐下去。普通引脚芯片用烙铁拖焊,助焊剂要舍得用,拖完再洗板。
系统联调也要分层验收,顺序可以是:上电点灯、串口打印、电机开环转、编码器读数、摄像头出图、电磁采集、闭环跑线。每过一层就在调试清单上打个勾,哪一层没过就在那一层停下来查,不要跨层排查。实际调车中,最浪费时间的永远是“电机转得不错但是控制不稳”,结果一查发现是编码器读数线程有问题,这种低级问题越早暴露越好。
4. 软硬联调:控制量、信号与接口的正确打开方式
4.1 把“PID 输出角速度”这个说法讲透
搜智能车资料时,常看到“PID 输出角速度”这种说法,它其实把两个概念揉在一起了。PID 的输入永远是误差,输出永远是控制量,这个控制量到底是什么,取决于你控制哪个对象。
四轮车上常见的速度环,输入是速度误差,输出是 PWM 占空比,编码器测回来的速度是反馈量,不是 PID 的输出。如果你在某篇平衡车的文章里看到“PID 输出角速度”,那通常是说外环角度环的输出作为内环角速度环的期望值,角速度在这里是内环的给定,不是 PID 计算出来的结果。把这层关系理顺,看代码就不会被绕晕。
一个基础的位置式 PID 实现大概是这个样子:
typedef struct { float kp, ki, kd; float integral, prev_error; float out_max, integ_max; } PID_t; float pid_update(PID_t *pid, float ref, float fb) { float err = ref - fb; pid->integral += err; if (pid->integral > pid->integ_max) pid->integral = pid->integ_max; if (pid->integral < -pid->integ_max) pid->integral = -pid->integ_max; float diff = err - pid->prev_error; pid->prev_error = err; float out = pid->kp * err + pid->ki * pid->integral + pid->kd * diff; if (out > pid->out_max) out = pid->out_max; if (out < -pid->out_max) out = -pid->out_max; return out; }输出限幅、积分限幅必须写,否则起步时积分疯狂累积,超调会大得吓人。整定顺序一般先 P 后 I 再 D:P 决定响应快慢,I 消除稳态误差,D 压制超调。每加一项之前都要在直道上测响应曲线,不要凭感觉乱调。电机还有死区电压,PWM 小到一定程度根本不转,这个死区要在软件里做补偿,硬件上很难完全消除。
4.2 硬件与算法的接口设计:从 PWM 频率到调试通道
硬件和算法的配合体现在非常多细节里。PWM 频率建议放在 15kHz 到 20kHz 之间,避开人耳可听范围,也兼顾 MOSFET 开关损耗。频率太低电机啸叫,频率太高栅极损耗增大。编码器接线的方向、相位都要核对,如果 A/B 相接反了,PID 会给反向控制量,车一上电就往回窜。
车上的接口类型大概就是这几类:电机 PWM 和方向、编码器、摄像头并行/串行数据、电磁 ADC、串口/CAN/485 通信、SWD 下载。多板通信时,比单串口更可靠的选择是 CAN 或者 485。485 的优势是长距离和抗干扰,虽然车上板间距离不长,但经过电机驱动和电源区域时,普通 TTL 串口容易受干扰,485 的差分特性会稳很多。用 485 时要注意收发方向切换,一般用三极管或者 IO 控制收发使能,别让收发同时打开。
硬件一定要给软件留调试设施:一个 LED 呼吸灯验证主循环,一个按键切换菜单,一个蜂鸣器播报状态,一组空闲 IO 引出来备用。这些都是小成本,但真到赛场上排障时,每多一个观察口,就少一次盲猜。
5. 现场排查实录:常见问题的根因与快速定位法
5.1 一上电就发热、炸管、复位
“通电摸芯片,烫得缩手”是板上最经典的劝退场景。发热的常见原因有三类:焊接短路、H 桥直通、驱动能力不足。排查顺序要固定下来:先断电,用万用表蜂鸣挡量电源对地电阻;再限流上电,看电流表有没有异常;最后用示波器测关键波形,比如 MOS 管栅极波形有没有“该关没关”的异常电平。
MOS 炸管,多半不是 MOS 本身质量问题。先看栅极驱动波形有没有振铃、有没有死区,再看续流路径有没有接对,最后才怀疑管子选型。很多时候,驱动波形不对是栅极电阻阻值不合适,换一个阻值问题就消失了。
“电机一启动,单片机就复位”,这是电源被拉垮的典型症状。解决手段是三层并行:输入侧加大容量电容,PWM 做软启动让占空比从零缓加到目标,逻辑电源和功率电源之间做好隔离。还有一个容易忽略的点就是复位芯片的阈值,如果它比电源跌落谷值还高,那每次大电流冲击都会触发复位,这种问题光靠软件延时是救不回来的。
5.2 图像抖动与信号毛刺
摄像头画面出现斜纹、水波纹,在电路组调试过程里几乎绕不开。根子大多是供电纹波叠到了传感器的模拟电源上,或者地线形成了环路,受到电机 PWM 电流的干扰。做法是给摄像头单独供电,Buck 输出加 LC 滤波,模拟地和数字地在主板上单点汇接。别小看“单点接地”这件事,很多队伍的地线处处相连,形成一个巨大的天线环路,干扰信号全往里面灌。
传感器信号毛刺可以从三个层面查:电源噪声、走线串扰、接触不良。先看示波器探头点在传感器供电脚上的噪声,再看信号线是否贴着大电流 PWM 走线,最后排线座和接插件是否有氧化松动。排线过长、没有屏蔽也是常见原因,把排线缩短并绞合,效果立竿见影。
5.3 跑飞、失控与“幽灵干扰”
MCU 跑飞,本质是程序计数器被干扰打飞。处理思路不是“加更厚的屏蔽”,而是多层兜底:看门狗强制复位、外部复位芯片预防欠压、IO 口配置成合适的上下拉、中断合理分配优先级。跑飞之后如果频繁重启,说明不只是偶发干扰,一定有持续的电源波动或者代码逻辑问题,比如某条中断处理时间过长,把主循环饿死了。
失控这类问题,很多时候不是算法写错,而是传感器原始数值已经乱了。这正好接上前面差分放大和滤波的作用:先看原始 ADC 数据在直道上稳不稳、过弯时变化是否连续,再去动 PID。排查时给车上位机加了一个“安全模式”:连续一段时间收不到有效传感器数据就自动刹车,宁可原地停下也不横冲直撞。这个机制简单但非常管用,不管在实验室还是赛场上都算一道保险。
最后分享一点我的体会
看 soberup 这个开源目录,我最大的感受是,它不只是把结果公开,更是把整个“电路组”的工作方法公开了。文件名背后都是实打实的经历:哪颗芯片在某次测试里烧了,哪条走线改了三版,哪个滤波参数在雨天赛道上飘了。这些内容比最终成型的原理图值钱得多。
如果你正在备赛,也想学着开源,我的建议是不要等比赛结束才开始整理。从第一版原理图开始就建好文件夹,写好改动记录,拍下每次焊接调试的问题照片。等到赛季结束,你手上就是一份天然完整的开源目录,既帮了下一届的学弟学妹,也是对自己几个月的交代。
顺着这个方向还能继续往下走的内容其实还有不少,比如把电源效率再压一压、把板子做成模块化便于换新、给整个硬件系统加自动化健康检测。总之,不管这个赛季你能跑出什么成绩,把工程习惯养成,这本身就是赛场上最大的一项收获。