ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

智能车疯狂电路组开源导读:从电源设计到调试实录

智能车疯狂电路组开源导读:从电源设计到调试实录

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是差分传输,抗共模干扰能力强,适合赛道这种电机噪声极大的环境。收发芯片用的MAX3485,3.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,更是我们踩坑的线路图和“为什么这么设计”的思考过程。祝你的车也能在赛道上稳稳地跑进环岛,不抖不烧不重启。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进