
21届智能车竞赛结束之后我们Soberup战队把疯狂电路组整个设计资料整理成了一名就读期间最大的纪念品——一个完整开源目录。当时不少做车的同学在群里问原理图、问PCB、问能不能分享驱动方案问多了我们直接把整个仓库挂了出来目录、原理图、BOM、设计笔记、调试日志全都在里面。这篇文章就是那份开源目录的导读我按一个队内成员看项目的思路带你过一遍“为什么目录要这样建、里面哪些电路最值钱、我们踩过的坑都藏在哪些文件里”。如果你准备打下一届智能车或者想做嵌入式硬件全流程这份导读能帮你少走很多弯路因为网上零散的教程多能把全链路串起来讲清楚的不多。1. 这份开源目录到底“开”了什么1.1 为什么把“目录”本身当作产品来做很多同学一开源就是丢一个压缩包代码、PCB、两张照片完事。我们这次刻意把目录结构当成一件正经事来设计。理由很简单开源不是为了让别人知道“我们做出来了”而是为了让别人能“照着做出来”。不同的人需要的东西不一样做硬件的人要原理图和PCB像我这种偏软件的要看控制代码和接口定义学弟学妹最需要的是设计笔记和调试日志。如果不分层所有人面对一个几百MB的大杂烩第一反应就是关掉。当时我们整理的顶层结构是这样soberup_21th_circuit/ ├── hardware/ │ ├── 01_power/ # 电源板 │ │ ├── schematic/ # 原理图源文件 │ │ ├── pcb/ # PCB工程文件 │ │ └── bom/ # 带供应商料号的BOM │ ├── 02_driver/ # 电机驱动板 │ ├── 03_sensor/ # 摄像头、信号链板 │ ├── 04_comm/ # RS485、串口电平转换板 │ └── 05_safety/ # 看门狗、复位、防反接电路 ├── software/ │ ├── core/ # 底层驱动与系统配置 │ └── control/ # PID、环岛判断等控制逻辑 ├── docs/ │ ├── design_notes/ # 每个模块的设计说明 │ └── debugging_log/ # 调试日志按日期排 └── tools/ # 串口调试助手、图像上位机等这个结构不是拍脑袋定的每个目录都对应了“别人拿到手之后会先看什么”这个逻辑。硬件先按板卡分板卡再按功能分软件把底层的驱动和上层的运动控制分开这样如果有人只想看环岛怎么处理就不用去翻底层串口驱动。但我得说句实话整个目录里最有价值的不是任何一块电路板而是docs/debugging_log/下那些按日期排的调试记录。那里面写满了当天遇到了什么现象、猜过哪些原因、最后怎么定位的这些才是真正的经验。1.2 哪些文件值得花一个下午细读拿到目录先别急着打开PCB。我给的建议是严格按照这个顺序读第一读docs/design_notes/里每块板卡的设计说明。我们当时每块板都写了两三页输入电压范围、电流预算、为什么选这个拓扑、为什么不选那个方案。比如电源板设计说明里就写清楚了“为什么从锂电池出来先用Buck而不是直接上LDO”。这段推理比图纸本身更值钱。第二读BOM。我们连供应商的料号和封装信息都放了因为很多替代芯片并不是PIN-TO-PIN兼容的只看型号照样翻车。BOM里还标注了“此处不要用国产低端替代”和“此处可以随便换”两种注释这就是实战信息。第三才是打开原理图和PCB对照着看。先看电源走向再看地平面怎么分割最后看具体的元器件摆放。很多人的坏习惯是一上来就盯某颗芯片的电路结果看半天也不知道整板为什么这样布。真正的高手一定先看电流怎么流、地怎么回。2. 疯狂电路组的核心电路逐个拆电源、驱动、信号链、通信与保护2.1 电源树从电池到每一路供电的取舍疯狂电路组和其他竞速组有一个非常明显的区别别的组可以买现成稳压模块电路组被要求自己设计电源方案所以电源树是整个车子的地基。我们当时用的是两节锂电串联标称7.4V、充满8.4V整车所有用电都从这棵树上取。主电源路径是这样设计的电池电压先进一个Buck降压到5V输出给舵机和摄像头等大功率外设5V再进LDO降到3.3V给主控、传感器、通信芯片供电。为什么中间一定要有Buck这层很多人觉得“反正都是降压LDO多简单”。但智能车上电机频繁加减速7.4V电池在重载下会被拉到6V甚至更低如果用LDO直接从7.4V降到3.3V压差接近4V按整车电流算LDO上白白烧掉的功率可能比主控本身功耗还大几倍发热量在狭小车模里根本压不住。Buck的效率通常能到90%以上这笔账一定要算清楚。具体选型上Buck我们用了MP2307这颗常见的同步降压芯片开关频率约340kHz输入范围覆盖4.75V到23V正好兼容充满和放空的锂电池电压。电感选的是22μH输出电容用了22μF陶瓷电容并联100μF电解电容电解电容扛纹波陶瓷电容压高频毛刺。LDO最开始用了AMS1117后来觉得静态功耗和压差还是不够理想换成了RT9193低压差版本的损耗明显更小。还有一个容易被忽略的点当电池在急加速瞬间被拉低时Buck输入电压可能低于设定输出电压这时Buck会进入“掉压模式”输出跟着掉。如果你用的是摄像头加舵机的组合一次短暂掉压就可能造成图像花屏或者舵机抖动。我们后来在电源板上加了一路Buck-Boost专门给主控供电它的输入低于输出时自动切换成升压模式确保主控和运放永远不欠压。这块板子单独在调试日志里占了好几页因为搞了很久才解决掉压瞬间的切换毛刺。2.2 电机驱动IR2110半桥与死区时间电机驱动是疯狂电路组最有看点的地方普通组可能直接上一个集成电机驱动模块但我们开源目录里用的是分立方案N-MOS半桥加IR2110栅极驱动。为什么自己搭而不是买模块一方面是竞赛导向自己设计驱动电路是电路组的基本功另一方面是分立方案电流裕量大散热可以根据实际需求定制真正调车的时候自由度比固定模块高得多。IR2110是经典的半桥驱动芯片它内部自带电平位移可以把低边控制信号抬升到高边MOS的源极电位上去驱动高边管。这里有一个很多人第一次踩的坑高边驱动需要自举电路。因为高边MOS的源极是浮动的要让它完全导通栅极电压必须比源极高10V左右这10V从哪来就是靠充电电容。我们用的自举电容是0.47μF的X7R陶瓷电容并联一个1N4148快恢复二极管给电容充电。电容太小高边维持导通的时间不够电容太大再充电时间变长PWM高电平持续时间短时来不及补充电荷。驱动输出到MOS管栅极之间我们还串了一个10Ω的电阻。这个电阻不是随便加的它控制栅极充放电速度进而控制开关的dv/dt。电阻太大开关变慢开关损耗会飙升电阻太小开关瞬间电流冲击大EMI和振铃都很严重。10Ω是我们在示波器上看Vgs波形和Vds波形调出来的折中值。IR2110本身不产生死区。如果用软件直接输出一对互补PWM上下管可能存在几十纳秒的同时导通在母线电压下就是瞬间直通MOS管直接冒烟。我们后来改用MCU高级定时器的互补PWM输出并配置了硬件死区插入这才彻底解决了直通风险。这个教训在调试实录里还会详细展开。2.3 信号链摄像头、差分放大与滤波电路疯狂电路组的信号链分好几路最核心的是摄像头信号、电流检测和电磁/声音等模拟信号调理。摄像头这路主要问题是干扰。数字摄像头走差分或并行数据线信号线比较长时容易跟电机的高频PWM串扰。我们的处理是摄像头供电单独用一路LDO跟电机电源彻底隔离信号线上串联磁珠和几十欧姆的电阻做阻抗匹配摄像头排线尽量短并且用屏蔽地线包住排线。很多人只关注软件里的图像算法忽略了硬件上的一点点干扰就会让图像产生雪花的横条纹算法写得再好也白搭。电流检测是疯狂电路组的一个特色。电机驱动需要实时知道母线电流我们把采样电阻放在低边用差分放大电路把采样电阻两端的小电压放大后送进ADC。采样电阻是0.01Ω的合金电阻额定电流状态下压降只有几十毫伏这个信号太小直接接ADC会被共模电压和噪声淹没。差分放大器我们用了四电阻结构的运放方案增益约50倍把几十毫伏放大到伏级。这里要特别注意电阻匹配精度四个电阻只要有1%的失配共模抑制比就会明显下降。后来图省事也试过INA240这种专用电流检测放大器效果确实更稳但自己搭差分放大能学到的东西多得多作为电路组还是建议亲手搭一次。滤波电路在整个信号链里到处都在用。RC低通滤波是最基础的比如运放输出到ADC之间加一个截止频率几十kHz的低通滤掉开关噪声摄像头同步信号入口加一个小电容滤高频毛刺电源入口则是LC或π型滤波。热词里讲到TDA2030音频放大电路那是大功率音频功放思路智能车信标组做声音信号调理时一般用运放加带通滤波就够了TDA2030这种功放芯片主要用在小功率发声场合车上做音频放大时还是要分清“功率放大”和“信号调理”的区别。2.4 通信与保护RS485、看门狗与复位电路车上的通信我们坚持用RS485而不是直接用TTL串口。RS485是差分传输抗共模干扰能力强适合赛道这种电机噪声极大的环境。收发芯片用的MAX34853.3V供电版本正好跟主控电平匹配。RS485有几件事必须做A、B线之间接120Ω终端电阻用于匹配总线阻抗、减小反射A、B线加偏置电阻让空闲态的电平稳定在确定状态通信线用屏蔽双绞线屏蔽层单端接地。这些不是一个“玄学调参”而是示波器实测波形后的必然结论没有终端电阻时上升沿振铃非常明显丢帧率直线上升。保护电路这块看门狗和复位电路是很多人忽略但特别重要的。智能车在赛道上只要死机一次整车就废了。我们板子上用了外部看门狗芯片MAX706它除了看门狗功能还带电压监测和复位输出。外部看门狗比MCU内置看门狗强在独立性就算主控内部时钟跑飞了外部看门狗依然在数时间。喂狗逻辑不能放在主循环末尾因为主循环可能被某个阻塞任务卡死我们把它放在一个固定时间片的中断里确保程序一旦卡住芯片就会在安全时间内触发复位。复位电路方面单纯一个电阻加电容的RC上电复位在强干扰环境下是不够的。我们给复位引脚加了外部上拉电阻、对地电容和1N4148二极管。二极管的作用是当电源掉电时快速泄放复位电容的电荷保证重新上电时有一个干净的低电平复位脉冲。复位引脚上多余的毛刺会被电容吸收避免电机刷火花时把复位脚打一下导致单片机莫名其妙重启。2.5 抗干扰与防抖稳定性最后一块拼图“疯狂电路组”叫这个名字并不是说电路要多复杂而是要把电路的稳定性和抗干扰做到极致。我们在这上面花的时间绝不比写控制算法少。整车的干扰源有三个电机换向火花、PWM开关噪声、电源高频纹波。处理手段从源头到传播路径一层层堵。电源入口放TVS管吸收电池线进来的浪涌TVS后面加共模电感/磁珠抑制高频共模噪声Buck输出加π型滤波降低开关纹波。电机的电源线要双绞让两根线上的噪声尽量抵消驱动板和主控板之间用排针或连接器接触要牢靠。防抖电路有两个层面的意思。一个层面是数字信号的RC防抖按键、拨码开关、摄像头场中断信号等数字信号在进入MCU之前先过一级RC低通比如10kΩ电阻加0.1μF电容时间常数1ms能滤掉机械触点抖动和线缆感应尖峰。另一个层面是整车的机械防抖摄像头支架加橡胶减震垫、传感器板用螺丝固定而不是双面胶、排线用扎带固定防止车辆高速过弯时振动导致接口松动。电路板稳定性的提升往往不是某一个高大上的设计而是这些不起眼的细节叠起来的。3. 从PCB到整车的工程化细节这些才是决定成败的隐藏项3.1 接地策略模拟地、数字地、功率地怎么摆如果只让我说一个PCB上最重要的原则那就是接地。疯狂电路组的板子同时存在大电流电机回路、高精度模拟信号回路、数字逻辑回路如果全用一个地模拟信号就会被功率地上的噪声直接污染。我们的做法是分区铺地功率地电机驱动、模拟地电流检测、摄像头模拟信号、数字地MCU、通信分开最后在电源入口处通过0Ω电阻单点汇接。0Ω电阻的作用是让各路地之间只有一个参考点阻断地回路形成环路天线。实际画板时模拟地和数字地的分割线要放在板子的低噪声区域不能横穿高速信号。电流检测差分放大器的输入回路地线要直接从采样电阻处单独引回运放的参考地不能跟功率地混着走否则采样电压里会混进地线上的压降。还有一个经常被批判但很多人不知道的知识点地平面不是越完整越好。在有大电流跳变的地方完整的地平面反而会成为一个“噪声发射天线”。我们驱动板的功率地平面刻意在MOS管开关节点正下方做了挖空处理减少开关节点对地平面的容性耦合。这种细节普通教程不会讲但实测确实能降低几百MHz频段的辐射。3.2 大电流回路与散热设计电机驱动板上的母线电流轻松到几十安培走线宽度不够是灾难。我们用的1盎司铜厚大电流走线宽度按1A约1mm的经验值放但实际因为脉冲电流和散热需求母线走线做到3mm以上还在关键路径上加开窗加锡增加载流能力。MOS管的散热不能全靠铜箔我们直接把驱动管底下铺了一大片连到地平面的铜皮并且打过孔阵把热量引到背面的大面积覆铜。电感这种东西是发热大头磁屏蔽电感发热比普通工字电感受控一点但还是要远离运放和ADC否则热量会改变信号链路的内阻。经过这些处理之后满载跑车的温升从最开始烫手到后来稳定在可接受范围这中间调试日志里记录了很多次温度变化最后发现散热过孔阵列的密度和孔径对温度影响很大这个结论写在了BOM注释里。3.3 物料选型与国产替代的取舍这次开源我们把BOM做得很细连每个元器件的供应商料号都标了。原因是我们在调试中吃过“替代”的亏某颗看起来一模一样的运算放大器封装一样、引脚一样但带宽和失调电压差了一个量级换上之后电流检测波形直接变毛。核心信号链路里的元器件我们不建议随便换。但像LED、接插件、滤波电容这类非关键器件可以自由替代。选型还有一个原则是降额设计。MOS管的漏源耐压选耐压值至少是实际应力的1.5倍以上这样电机感性负载产生的尖峰才不会击穿。电容尽量选X7R或者C0G温漂小的Y5V这种高温下容量掉一半的型号电源滤波效果会大打折扣。我们在BOM注释里写过一句“省什么都不能省过压保护和退耦电容”比赛现场有人当场换便宜电容然后整车花屏就是这个道理。4. 调试实录四个大坑每一条都是完整排查链路4.1 MOS管开机就烧自举电容和死区时间是两个凶手第一次给驱动板上电时电机还没转高边MOS管就冒烟了。那天的调试日志我至今记得很清楚。第一步排查先排除接线错误。把驱动板和电机断开只给母线供电测量MOS管的D、S、G三脚电压确认没有明显短路。然后重新接上信号线示波器同时测低边输入PWM和高边Vgs。第二步发现问题就藏在波形里。高边MOS的Vgs在PWM占空比突然变大时波形顶部往下掉从理想的15V跌到8V以下。这时候MOS管没有完全进入导通状态工作在线性区导通电阻比正常大了好几倍电流稍微一上来功耗瞬间爆炸温度直线上升然后就烧了。第三步定位根因。掉压说明自举电容在导通期间没扛住电荷被栅极消耗完了而后续的再充电时间不够。我们最初的自举电容选的0.01μF实在太小后来换成0.47μF波形明显改善。另外我们也发现软件输出的互补PWM在切换瞬间出现了直通窗口上下管同时导通虽然只是几十纳秒但高频重复几次就积累了足够热量。最终处理是自举电容加大到0.47μF改用高级定时器的互补输出并开启硬件死区每次开关切换都有固定的死区时间从此再也没有烧过MOS管。4.2 摄像头画面抖动纹波、地弹和供电分割的连环局摄像头刚开始装上车时静止画面很干净一跑起来画面就出现横条纹和抖动。一开始我们都怀疑是排线接触不良压紧排线做了各种加固问题依旧。用示波器去量摄像头的电源引脚发现5V上有明显的高频毛刺峰峰值超过200mV。这个纹波不是Buck正常工作的纹波而是电机大电流跳变瞬间功率地平面上的地弹通过电源线耦合进来的。摄像头的模拟供电对电源噪声非常敏感AVCC上几十毫伏的噪声都会直接变成画面条纹。处理分三步。第一Buck输出级加LC滤波把开关纹波再压一轮。第二摄像头的供电单独用一路LDO不从5V数字电源上串接。第三模拟地单独走铜箔只在电源入口跟主地单点汇接。三件套下来示波器测摄像头电源的纹波降到了30mV以下画面干净了。这个案例给我们的启示是不要一看到画面花就怀疑代码、怀疑摄像头先用示波器量供电质量很多图像问题本质上是电源问题。4.3 RS485偶发乱码终端电阻一点都不玄学RS485在台架上通信很正常一到跑车就偶发乱码。最初怀疑是主控波特率配置有问题来回检查都是对的。后来在通信线上加上示波器看到了典型的振铃波形数据线上升沿之后有一串持续几百纳秒的衰减振荡这个振荡会干扰接收端的电平判断导致采样到错误位。振铃的根源是阻抗不匹配。RS485总线在两端都要接120Ω终端电阻我们只在主控板一端接了另一端没接相当于传输线末端开路信号在端点反射形成振铃。把另一端的终端电阻也补上之后波形立刻变得干净实测通信一个月不再丢帧。这件事看起来很小但只靠万用表量通断根本查不出来必须看到波形才能理解为什么。从那之后我们所有通信线都用示波器看过波形才上车。4.4 单片机频繁复位外部看门狗如何背锅有一段时间整车跑起来就偶发复位程序从头开始跑速度掉得一塌糊涂。起初怀疑是看门狗没喂好但代码逻辑明明没问题主循环里喂狗的位置也是对的。用示波器长时间监测复位引脚终于抓住一次复位时刻的波形复位引脚上出现了一个幅度超过3.3V的负向毛刺正好发生在电机启动瞬间。这个毛刺不是看门狗输出的复位信号而是外部干扰直接耦合到复位引脚上把MCU强制拉低复位了。修复方案很直接复位引脚外接10kΩ上拉电阻和0.1μF电容组成低通滤波把微秒级毛刺滤掉再用1N4148二极管把复位引脚钳位到地防止负电压进入MCU内部保护二极管。另外我们把外部看门狗的复位输出也接到同一网络让正常工作时的复位信号和干扰毛刺共用一条RC旁路降低误触发概率。改动之后复位问题彻底消失。分享这个案例是提醒大家很多“程序跑飞”其实是硬件干扰误触发复位别一味去查代码。5. 怎么把开源目录变成你自己的东西5.1 复现顺序与最低成本路径开源目录是给参考的不是给你无脑打板的。我的建议是先按这个顺序吃透再动手先花一个晚上读设计笔记画出自己想复现的电源树和信号流然后直接在PCB工程里看布局理解每一颗主要芯片为什么放在这个位置再打开BOM清单对照着查料搞清楚哪些是普通件、哪些是必须用指定料的。复现时绝对不要一上来就整板打样。最低成本路径是分模块验证第一轮只打电源板焊好后用电子负载实际带载测纹波、测效率确认电源稳了再进行下一步。第二轮打驱动板先不接MCU用信号发生器给PWM验证MOS管波形和自举。第三轮才把信号链和通信板加上逐块联调。一个模块一个模块过出了故障很容易定位比整板一起翻车好太多。5.2 从抄板到换板三次迭代建议真正要提高硬件水平不能一直照抄我们的板子要主动改造。我的建议是做三轮迭代。第一轮保持功能不变重新画原理图但走线布局完全重来强迫自己理解每条线为什么这样走。第二轮换掉部分芯片比如把电流检测从自搭差分运放换成专用电流检测放大器或者把MP2307换成另一颗Buck芯片体验不同方案的差别。第三轮开始给自己加功能比如增加电压电流监测、增加CAN通信预留接口、优化布局缩小面积。这三次迭代下来比你看十篇教程都有用。因为抄板过程中你会手画一遍连接关系会查数据手册核实引脚定义会在布板时重新思考回路面积这些东西只有真正上手才会进入脑子。5.3 关于开源协作和资料维护的真心话开源一个项目容易维护一个开源项目难。我们在整理目录时最深的体会是文档比代码重要调试日志比原理图重要。原理图谁都能打开但没有设计笔记别人不知道你当初为什么这么做没有调试日志别人不知道哪个点是反复踩坑后改出来的。所以如果你想在自己的项目里做开源一定要把文档当代码一样写把调试记录当作项目的一部分。另外用别人的开源资料首先要尊重开源协议。我们的仓库提供了MIT协议版本允许自由使用和修改但你在自己的开源项目里引用时无论如何要保留出处声明。这既是法律要求也是对原作者的尊重。有一点必须说在前头智能车竞赛规则通常要求作品必须由参赛队独立完成直接拿别人开源板子去打比赛是违规的参考思路、吸收设计、然后自己动手做才是正确姿势。我做这个开源目录最大的收获并不是最终那几块能跑的板子而是那些反复烧坏、反复调整的记录。每一页调试日志背后都是一次真实失败这才是开源项目里比任何一块铜箔都珍贵的东西。希望你能从这份目录里拿走的不只是原理图和PCB更是我们踩坑的线路图和“为什么这么设计”的思考过程。祝你的车也能在赛道上稳稳地跑进环岛不抖不烧不重启。