
每年智能车竞赛一结束开源社区就会多出一批工程包。我们Soberup战队属于21届疯狂电路组赛后也把整套工程整理成了开源目录从原理图、PCB、固件到调试文档一次性放了出来。整理目录比跑车还累但我一直觉得只有把东西真正开源出来才算把比赛的价值榨干。这份目录不是一堆文件的简单堆叠它更像是一张从零起步的地图——适合第一次接触智能车电路的新人也适合那些已经在调车但总被莫名其妙问题卡住的队伍。标题里的“疯狂电路组”不是噱头这个方向就是要求你在强电、弱电、传感器信号链和控制回路之间来回拉扯。下面我会结合这份开源目录把里面的电路设计、参数计算、调试流程和踩坑记录一次讲透。1. 项目背景与开源动机1.1 疯狂电路组到底在做什么很多人一听说“电路组”第一反应就是“画板子的”。这个印象在智能车竞赛里其实偏差很大。电路组真正负责的是整车所有电学层面的东西传感器信号怎么拾取、怎么滤波放大、电源怎么从电池转换到各路低压、电机和舵机怎么驱动、单片机引脚怎么和设备匹配。更关键的是软件看到的每一帧数据、每一个ADC值背后都是一整套硬件链路在支撑。信号抖动、跑飞、非线性八成问题都出在电路设计上而不是算法参数写错了。21届的“疯狂电路组”更特殊。它把电路部分的权重提到很高要求团队在有限的车模机械结构里塞下足够的电子系统还要在高速跑动中保持稳定。简单说这不是一个“能跑就行”的组别而是要把电路当作品来做。我们队里常开玩笑说软件组负责的是“车怎么想”电路组负责的是“车怎么活”。车都活不好再好的算法都是空谈。所以这份开源目录从设计之初就不是为了展示“我画了一块板”而是想把整个电路方案的思考过程留下来为什么用这个拓扑、为什么选这个增益、为什么这么布局地线。当你拿到目录时看到的不是一堆DWG和PDF而是一条完整的硬件学习路线。1.2 开源是为了复现不是为了炫耀做开源目录的过程中我反复被问到一个问题你们比赛都打完了还整理这些干嘛答案其实很实际——为了传承也为了复现。先说传承。智能车竞赛的硬件经验非常琐碎每个赛季结束老队员一毕业很多“只可意会”的手感就断了。新队员重新画板子往往会在同一个坑里再摔一遍。我们把原理图、PCB、BOM、固件工程、调试记录全部归档到开源目录里新人照着走一遍至少能少踩80%的初级坑。再说复现。很多队伍说“开源”结果丢出来一个没有版本号的压缩包、一堆乱码命名的文件别人根本没法用。我们的做法是先把仓库托管在Gitee上目录结构按硬件、固件、文档分区每一块板子都标注了版本号配套的固件也写了对应版本。这样别人拉下来之后理论上是可以把整套车复现出来的。许可证方面我们选了MIT意思很简单你可以拿去做毕业设计、做课程项目、二次改造甚至用到自己的商业项目里都行只要保留版权声明。我不希望开源变成一句空话而是真的能被别人用起来。2. 开源目录结构设计与内容拆解2.1 三分钟看懂目录文件导航与分区逻辑拿到开源目录的第一件事不是直接下载压缩包而是先看README。README里写了仓库的整体介绍、硬件版本与固件版本的对应关系、依赖的EDA工具版本以及每一个关键文件的作用。很多开源项目没有把导航当回事但我们吃过这个亏所以目录里把“如何快速定位到你需要的文件”这件事做得很细致。完整目录结构大致是这样的Soberup-21structure/ ├── README.md ├── hardware/ │ ├── schematics/ # 原理图源工程与PDF │ ├── pcb/ # PCB工程、Gerber、BOM │ └── datasheets/ # 关键器件手册 ├── firmware/ │ ├── core/ # 驱动与中间层 │ ├── modules/ # 传感器、控制、通信模块 │ └── projects/ # 不同赛题配置的工程入口 ├── tools/ │ └── host/ # 串口上位机与离线数据分析脚本 └── docs/ ├── debug_logs/ # 实测波形、标定记录、流程图 └── faq.md # 常见问题速查这个结构看起来简单但每一条都是踩坑踩出来的。硬件和固件分开是因为两者迭代节奏不同调车时经常只改软件不动硬件如果混在一个目录里容易让新队员误以为“代码变了就得重刷板子”。docs单独放是为了让调试记录有地方沉淀而不是散落在群聊天记录里。tools目录里放主机端脚本是考虑到很多队伍被“数据不直观”坑过——光看车上OLED那几行数字很难判断信号质量。2.2 硬件工程的五件套主板、电源、驱动、传感器与接口硬件目录里没有一块“万能大板”而是分成五块功能明确的模块。分板设计的最大好处是调试方便、故障隔离清晰——比赛现场如果驱动板坏了直接换一块驱动板就行不用拆整个车架重焊。下面是这几块模块的核心信息模块核心器件关键设计点对应目录主板/核心板MCU、晶振、复位、SWD调试口最小系统稳定性、下载口防呆设计hardware/schematics/main_board电源板DC-DC降压芯片、LDO、电池采样多路输出、纹波抑制、防反接hardware/schematics/power_board驱动板MOS管、栅极驱动芯片、续流电路电流裕量、死区设计、散热hardware/schematics/driver_board传感器板电感调理电路、编码器接口、摄像头FPC信号增益、滤波、抗干扰hardware/schematics/sensor_board扩展接口OLED、蓝牙、调试串口、按键模块化、热插拔保护hardware/schematics/interface_board核心板用四层板电源和地有完整平面信号质量会好很多。驱动板用两层板就够但走线要加宽大电流路径全部覆铜。传感器板我建议单独做因为它的模拟电路部分对噪声敏感和数字电路混在一起会互相干扰。这个“分工明确、互不干扰”的思路也是开源目录里最想传达的设计哲学。2.3 固件代码与上位机脚本的配套关系硬件没有固件就是一坨铜固件没有上位机数据就是盲人摸象。开源目录里的固件工程按core、modules、projects三层组织core放底层的驱动、时钟、串口和中断管理modules放各类传感器算法、控制律与通信协议projects则是不同赛题的实际入口配置好引脚和初始化之后直接可以编译下载。配套的tools/host目录里我们开源了一个简单但好用的串口上位机脚本通过固定的帧格式接收车上数据实时绘制成波形。同时也附带了离线解析脚本可以把TF卡里录制的整段跑车日志回放到电脑上慢慢分析。代码和硬件版本严格绑定release目录里每一个发布版本都会注明“硬件v1.2 固件v2.0.1”这样的标签。这样别人下载后如果出现问题不会因为版本不匹配而浪费时间排查。3. 核心电路设计与参数计算3.1 电磁传感器信号调理电路从选频到检波的完整链路以电磁组的赛道信号为例赛场会在赛道中心线位置铺设漆包线并通入固定频率的交变电流车上的电感线圈会感应出同频率的微弱电压。我们做的第一级电路就是LC谐振选频让电感与电容在目标频率处产生谐振把微弱的感应信号拉高。谐振频率的计算公式是f 1 / (2π√(LC))比如电感取10mH目标是20kHz频率推算出C约为6.33nF实际可以先用6.8nF电容再配合一个可调电容微调。拿到现场后用示波器观察谐振点输出幅值微调电容让幅值最大。这里特别注意不同赛区的实际频率可能不同不要拿着固定电容值直接上车。选频出来后的信号很小通常只有几毫伏到几十毫伏必须经过放大。运放我用的是低偏置、轨到轨的型号同相放大倍数由增益电阻决定Av 1 Rf / Rin比如Rf取100kΩ、Rin取5kΩ理论增益就是21倍。如果一级不够可以做两级放大总增益控制在100到200倍之间。增益不是越高越好太高容易让信号在近场饱和太低则弯道边缘信号微弱。这个平衡是调车过程中慢慢试出来的开源目录里也记录了当时的增益配置。放大之后是检波。交流信号直接送ADC采样会浪费采样精度所以要用二极管和RC组成半波或全波检波把交流包络变成平滑的直流电平。RC时间常数的选择很讲究时间常数太大动态响应慢车过弯时信号滞后时间常数太小检波输出纹波大。以R10kΩ、C100nF为例截止频率约为159Hz既能滤掉20kHz载波又不会让包络响应太迟钝。检波输出端我还会加一级电压跟随器降低输出阻抗再进ADC避免采样值因为源阻抗太高而跳动。3.2 电源系统设计先把功率算清楚再选拓扑经常有新手上来就问“用什么芯片稳压”但实际上第一步应该是算功耗。车的电池如果用7.2V镍镉或锂电充满时可能到8.4V放电末期又可能跌到6.5V左右。整车负载包括电机、舵机、单片机、传感器和摄像头电机启动瞬间电流可以到3到5A舵机瞬态也有1A左右。把这些加在一起系统总功耗通常在20W到30W之间。基于这个功耗水平电源拓扑就很明确了电机驱动直接从电池取电数字逻辑和模拟电路则通过DC-DC降压到5V再通过LDO降到3.3V。DC-DC我用的是纹波控制性能较好的同步降压方案LM2596虽然便宜耐用但开关纹波比较大给传感器供电时容易在ADC采到的数值里看到周期性抖动。如果预算允许MP2315、RT6214这类芯片在同样电压转换效率下纹波表现会明显更好。LDO的应用也要注意压差和功耗。从5V降到3.3V输出0.2A时LDO上的功耗是(5 - 3.3) × 0.2 0.34W这个可以接受。但不要直接拿7.2V电池降到3.3V那样功耗会超过0.7W发热非常严重稳定性和寿命都受影响。此外模拟部分的电源建议和数字部分分开走ADC参考电压用专门的基准芯片地线采用单点接地这样采样值会干净很多。3.3 电机驱动电路MOS管选型、自举电容和死区电机驱动是电路组翻车率最高的地方烧MOS、炸驱动芯片、全桥直通我都在调试阶段经历过。先说MOS选型三个核心指标是耐压、导通电阻和栅极电荷。电机在续流瞬间会产生较高的电压尖峰所以MOS的漏源耐压至少要有电池电压的1.5倍以上余量。导通电阻尽量小最好在10mΩ以内不然大电流下管压降和发热都不好看。栅极电荷决定开关速度太小驱动电流不足太大开关损耗高需要和驱动芯片配合着选。如果上管用了N沟道MOS半桥或全桥驱动芯片比如IR2104这一类通常需要自举电容。很多队伍一上电就炸管排查半天最后发现是自举电容没接或者容值太小。按照常见实践自举电容取100nF到1uF必须用X7R材质并且要靠近驱动芯片引脚放置。自举二极管也不能省要选快恢复型。另一件事是死区时间。如果我们用的是自带死区的集成驱动芯片问题不大但如果自己搭分立栅极驱动电路就必须在PWM程序里配置好死区时间防止上下桥臂同时导通造成短路。这个“看起来省了几块钱、实际上烧了一块板”的教训我特别写在了FAQ里。电机PWM频率一般设置在10kHz到20kHz之间。频率高一些电流纹波小电机运行更平顺但开关损耗会增加频率太低电机容易发出明显的啸叫而且低速时转动不均匀。我们最终采用了20kHz实测发热和噪音都在可接受范围内。调试时如果发现电机声音异常先检查PWM频率和上下桥死区不要急着怀疑电机本身。3.4 摄像头与编码器接口数字信号同样要防干扰摄像头组或带有视觉功能的方案会用到FPC排线连接摄像头。排线长、信号频率高最容易把电机换向时的干扰耦合进去表现就是画面横纹或者动起来帧率变抖。处理办法不复杂摄像头电源单独加LC滤波不给它和舵机共享一条电源线排线尽量短而且要远离电机线和电池功率线地线在摄像头接口附近要充足不能只是孤零零一根细线。编码器接口也容易被忽略。AB相脉冲线从电机附近走回来线比较长如果不做处理电机转动时的电磁噪声会让单片机计到错误的脉冲数速度环看起来就像在抽风。解决方式是用一个小型RC滤波比如1kΩ串100nF再加施密特整形芯片把沿变干净再进MCU。这些细节在全车跑高速时比想象中重要得多——低速看着没问题的信号高速一加电流就原形毕露。4. 系统调试流程与实测重点4.1 通电前检查顺序宁可慢十分钟不烧一块板我见过太多人拿到刚焊好的板子插上电池就上电然后几秒钟之内冒烟。按下面这个顺序检查能避免大多数灾难先用目镜检查焊点重点看电源引脚有没有焊桥、焊盘之间有没有残留松香短路、极性器件有没有装反。这一步能排除50%的问题。用万用表电阻挡测电源对地阻抗。电池输入端对地阻抗不应该低于几十欧如果测出来是0.x欧先查有没有短路坚决不能上电。用可调限流电源上电。把电流限制到200mA电压从0开始缓慢往上加观察电流读数有没有突然跳高。正常时电流应该稳定上升而不是瞬间冲顶。确认各路电压正常。用示波器看DC-DC输出纹波优先看开关节点波形是否正常用万用表看LDO输出是否在标称范围。最后才是下载固件。下载前先量一下复位引脚和晶振波形确保最小系统已经跑起来再烧录程序并通过串口打印验证。这套流程看起来麻烦但每次都能在几分钟内找出问题比烧板之后飞线修板快得多。开源目录的docs/debug_logs里也放了一张我当时画的检查清单可以直接打印出来对照执行。4.2 传感器标定与阈值整定记一次实测过程以电磁传感器为例拿到车之后第一件事不是调算法而是做整定。把车放在赛道正中线上记录每个通道的ADC原始值作为中线基准再让车左移5cm、10cm右移5cm、10cm分别记录数据。得到的趋势大致是这样的具体数值每辆车不同这里只演示方法位置CH0CH1CH2CH3中心850520480860左移5cm700620380720左移10cm540680300580右移5cm760400640810右移10cm610320720680看到这组数据后如果中心值已经接近ADC满量程说明前级增益太大必须减小如果偏移10cm后信号变化很微弱说明增益不够弯道识别会迟钝。归一化处理时可以用 (raw - min) / (max - min)把所有通道统一到0到1之间这样后续算法就不用关心具体ADC位数了。这里有个实际心得不要为了追求灵敏度把前端增益直接拉满。增益拉满后车辆在近场很容易饱和一旦饱和传感器输出几乎不随位置变化会导致算法把整条弯道误判为直道。留一点余量让曲线在关键区间保持单调比信号幅度大更重要。4.3 驱动与整车联调从开环占空比到闭环动态硬件和传感器都稳定之后再进入驱动联调阶段。我的习惯是先做开环测试给电机一个固定占空比观察电流表读数是否稳定、电机声音是否正常、驱动板和MOS温度是否合理。从10%占空比开始逐步加到50%每档停留几秒记录电流和温度。如果占空比增大但电流异常跳升说明驱动级有半导通或短路问题需要先解决硬件再谈控制。开环通过后才开始闭环调PID。先调比例环让车能大致跟住赛道再慢慢加积分消除静差最后用微分抑制超调。调参过程中如果发现电流波形出现周期性尖峰不要急着改PID参数——先检查是不是采样电路的地线有噪声或者PWM频率与电源纹波产生了拍频干扰。这些硬件层面的问题软件调一万遍也调不好。开源目录里放了当时记录的一版阶跃响应数据方便对照自己的调试曲线。5. 常见问题排查与FAQ实录5.1 开源目录里的FAQ速查表把这一年多遇到的问题整理成一张速查表是我觉得整个开源目录里最值钱的部分之一。很多问题的排查思路其实非常固定只要按表操作能省下大量时间症状可能原因排查方向MCU频繁重启电源跌落、复位脚干扰、看门狗误触发示波器测VDD与NRST引脚检查LDO输入输出电容单侧电感无信号电感虚焊、谐振电容偏差、检波二极管方向装反从运放输入端逐级测波形确认哪一级丢失信号电机嗡嗡响、堵转PWM频率过低、占空比突变、MOS驱动不足先开环固定占空比判断是机械卡死还是电气问题ADC数值跳变基准不稳、地环路、信号源阻抗过高加电压跟随器检查模拟地与数字地是否单点连接摄像头画面水波纹摄像头与电机共用电源、排线过长、信号被干扰摄像头电源加LC滤波排线远离电机功率线串口数据乱码电平不匹配、波特率偏差、地线未共地确认TXD/RXD电平域检查共地连线表格只是索引详细的分析过程和波形截图放在docs/debug_logs里。每一条FAQ的背后都是一个真实到让人抓狂的下午。我当时把它们全部写进文档的初衷就是不想让下一届队员再把同样的时间浪费一遍。5.2 防坑经验给后来人的三条硬建议如果把整篇开源目录压缩成三句话我想说这三条。第一条版本管理从第一版原理图就开始。不要等板子画到第12版才想起来要归档到那时连你自己都说不清哪一版改了哪里。我们的版本命名规则是硬件v1.2 固件v2.0.1每次修改都同步更新doc里的变更记录。没有版本控制的电路设计和没有注释的代码一样都是给后人挖坑。第二条每个模块都要留测试点。电源轨、PWM波形、运放输出、检波输出这些关键节点都要在PCB上设计成可测量的测试点。调车时可以在线夹探头不用飞线更不用拿烙铁现场乱戳。调试点不是负担它是硬件工程师的仪表盘。第三条元器件选型一定要留余量。大电流走线要加宽电容耐压留1.5倍余量MOS和驱动芯片的电流规格留2倍以上裕量。贴着极限值选型看起来省了几毛钱实际上一块板烧掉就什么省都没了。我见过太多队伍因为贪便宜选了临界规格的元器件最后在比赛现场故障把所有时间花在玄学排查上。最后再分享一个小技巧吧。调试电磁传感器时不要只在车上用示波器看瞬时波形最好放一只TF卡记录整段跑车日志回实验室离线回放。这样能找出“一到弯道就饱和”“直道信号抖动”这些瞬时现象背后的规律比反复下车改参数高效得多。开源目录这件事我们做了一年多最大的体会是真正能被人复现的工程才叫开源别人只能看截图那只是晒图。希望这篇拆解能让你少走几条弯路。