21届智能车竞赛结束之后,我们soberup战队做的第一件事,不是聚餐庆祝,而是坐下来把所有资料整理成开源目录。疯狂电路组这个名号,听起来有点中二,但实际上我们确实在电路这条路上走得比较疯——整个备赛周期里,从核心板到驱动板,从电源到传感器调理板,前前后后画了十几个版本,废了不少板子,也攒下一大堆只有踩过坑才写得出的笔记。这篇内容就是一份阅读导览:开源目录里到底放了什么、每个模块为什么这么设计、哪些地方是我想特别提醒你注意的。不管你是准备参加下一届比赛的新队员,还是单纯对智能车硬件感兴趣、想拿成熟电路练手的工程师,都可以照着这个目录快速找到自己需要的东西。
1. 先说说为什么要把整个电路组的东西全部开源
1.1 疯狂电路组到底是做什么的
我们战队内部把硬件电路设计这块单独拎出来,叫“疯狂电路组”。外面人听这个名字以为我们天天烧板子,其实不完全是——烧板子的次数确实不少,但我们的核心工作是把整车所有跟电有关的东西做成一套稳定、可复用、经得住赛场电磁环境考验的系统。具体包括:主控最小系统、电源变换、电机驱动、传感器信号调理、通信接口、蜂鸣器/按键这些人机交互的外围电路。
竞赛的赛道环境其实很恶劣,除了跑道上的电磁干扰源,还有电机换向产生的火花干扰、大电流母线上的纹波、数字电路高频开关带来的噪声。这些东西不会写在任何一本教科书里,只有整车跑起来你才能感受到。有些队伍代码写得花里胡哨,结果硬件在赛场上几分钟就复位一次,那是真的很崩溃。所以我们这支队伍从第一天就定了规矩:电路设计必须作为独立模块认真做,不能只当“焊板子的”。
1.2 开源目录的整理原则:别人拿到能不能直接复刻
整理开源目录的时候,我们内部吵了好几轮。有人建议只放最终版原理图,有人建议连失败版本都放进去。最后定了一个原则:要让一个有一定基础的新人,拿着这份资料,不找我们问一句话,就能把车复刻出来并且跑起来。
这个原则听着简单,做起来相当费劲。光是整理文档就花了一周,因为要把当时随手记的实验数据、示波器截图、引脚分配表全部规范成 Markdown。我们甚至把每个模块的“设计理由”和“改动历史”都写了进去,比如某个电容从10uF改成47uF是因为高频纹波超标,某个电阻从1k改成2.2k是因为运放增益带宽积不够导致信号衰减。这些信息如果只给原理图,别人是永远看不出来的。
仓库顶层结构大概是这样:
soberup-21th-car/ ├── docs/ 技术文档、调试记录、踩坑笔记 ├── pcb/ 各板卡工程文件与制板文件 ├── firmware/ 单片机固件工程与引脚配置 ├── tools/ 调试脚本、串口上位机、图像调试工具 └── mechanical/ 结构件图纸与装配说明我强烈建议你拿到仓库后先读 docs 目录下的00-README.md,里面写了每个板卡的功能定位和它们之间的连接关系。别一上来就打开原理图硬啃,那样很容易迷路。
2. 开源目录全景:拿到仓库之后先看哪里
2.1 板卡目录与功能对照
整个硬件系统按功能拆成了五块板,下面是完整对照表:
| 板卡名称 | 目录位置 | 核心功能 | 主控/核心器件 |
|---|---|---|---|
| 主控核心板 | pcb/main-board | 单片机最小系统、调试接口、LED/按键 | STM32系列,预留TC264兼容焊盘 |
| 电源板 | pcb/power-board | 电池电压变换、多路稳压、上电时序 | BUCK、BUCK-BOOST、LDO |
| 驱动板 | pcb/driver-board | 电机驱动、蜂鸣器、风扇 | IR2110半桥、推挽驱动 |
| 传感器板 | pcb/sensor-board | 摄像头接口、运放调理、差分信号接收 | OV7725、运放阵列 |
| 通信板 | pcb/com-board | 485通信、蓝牙透传、串口扩展 | SP485、HC-05 |
每块板卡目录下都有三个子目录:hardware放原理图和PCB工程,test放上电测试点与测试步骤,notes放该板卡的设计说明。我觉得最有价值的就是notes,里面有我们在调试现场写的只言片语,比如“上电瞬间D2闪了一下,怀疑是浪涌,加了TVS后解决”这种,真实得不行。
2.2 固件与上位机的组织方式
固件部分我们没有按“库”的抽象层次去组织,而是按“功能外设”分文件。firmware/下每个目录对应一个外设或模块:motor、sensor-camera、uart-485、watchdog、pid-control。每个目录里都有一个README.md,说明这个模块的初始化顺序、关键寄存器配置、以及和电路板上的哪个元件对应。
这里有个经验想分享:固件和硬件必须一一对应。很多队伍喜欢把代码抽象得很通用,结果稍微改一个引脚,代码和原理图就对不上了。我们在目录里特意放了一份pin-mapping.csv,把所有引脚分配做成表格,硬件改版时先改这个表,再改代码和原理图,保证三者永远同步。这个习惯看似笨,但真的能救命。
tools 目录里放的都是我们自己写的小脚本,比如串口波形显示工具、摄像头图像采集上位机、PID参数在线调节面板。这些工具代码写得不算精致,但都是经过赛场验证的,拿过去直接能用。
3. 电源系统:BUCK、BUCK-BOOST与上电时序这三关
3.1 整车电源架构:从7.2V到每一路精密电压
竞赛用电池一般是7.2V镍氢或者7.4V锂电池组,放电平台电压会在6.5V到8.4V之间波动。而板上需要的电压种类很多:主控的3.3V、运放的5V、摄像头的2.8V/3.3V、电机驱动的7.2V直供。如果全部用线性稳压,效率低不说,压差大的场合发热根本扛不住。所以我们的电源方案是“DC-DC做主,LDO补屁股”。
具体分层是这样的:电池电压先经过一级BUCK降压到5.5V左右,再通过LDO得到稳定的5V给运放等模拟电路;同时电池电压经过一级BUCK-BOOST稳压到5V给主控和数字电路;电机驱动直接吃电池电压,但母线上加了大容量电解电容和CBB薄膜电容吸收瞬态能量。
之所以BUCK输出5.5V再进LDO,是因为 LDO 的纹波抑制能力在压差1V左右时最好,既能保证输出纯净,又不会像直接从8V降到3.3V那样发热严重。这是很多新手容易忽略的细节——DC-DC后面不一定要直接接负载,给LDO当预稳压器也是常见玩法。
3.2 BUCK电路的电感、纹波与环路补偿
开源目录里的BUCK电路用的是最常见的大功率同步整流方案,控制芯片选的是国产性价比很高的型号,外围极其简单。这里我重点说电感选型。BUCK电感值决定了纹波电流大小,公式是:
ΔI = (Vin - Vout) × D / (fsw × L)其中占空比 D = Vout / Vin,fsw 是开关频率。我们按最大负载电流2A、纹波系数取30%来反推电感值,最终选了22uH。这里有个权衡:电感太大,动态响应慢,电流变化剧烈时输出电压会塌;电感太小,纹波大,后面LDO压力大。30%的经验值在智能车这种负载频繁变化的场景下比较折中。
另一个关键点是输出电容的ESR。BUCK输出电压纹波主要靠输出电容吸收,ESR太大会出现尖峰。我们用了“一个大容量电解电容并联两个小容值MLCC”的组合,电解电容扛低频纹波,MLCC负责高频分量。示波器实测下来,这个组合比单纯堆大电容效果更好,因为MLCC的ESR低、响应快。
环路补偿这块,如果有条件一定要用网络分析仪扫一下环路增益。没条件的话,至少要用示波器看负载瞬态响应:用电子负载在10%和90%之间切换,观察输出电压的过冲和振铃。我们第一版BUCK在轻载时会轻微振荡,后来在COMP引脚补偿网络上并联了一个47pF电容,把相位裕度拉回来了。这些调整细节都写进了notes里。
3.3 BUCK-BOOST:电池电压波动时的稳压底线
电池快没电时电压会掉到6.5V以下,这时候如果还要稳定的5V输出,普通BUCK就无能为力了。BUCK-BOOST可以同时做升压和降压,在输入电压高于或低于目标输出时都能稳住输出。
这里画电路不难,难的是电感选型和PCB布局。BUCK-BOOST的电感电流比普通BUCK更大,而且四个功率管轮流导通,开关节点更多,PCB上如果布局不好,纹波会非常难看。我们的经验是电感底下走线全部掏空,反馈分压电阻靠近FB引脚,SW节点铜皮面积控制,避免寄生产生振荡。这个电路在仓库里有完整工程,你直接拿去做制板没有问题,但要注意器件封装和规格别乱换。
3.4 复位电路、看门狗电路与上电时序
很多队伍把复位电路当成一个10k电阻加一个104电容就完事,其实赛场上的复位问题大部分都是电源毛刺引起的。我们用的是带手动复位输入和电源监控功能的复位芯片,阈值设在2.93V,一旦电源跌落到阈值以下,芯片立刻拉低复位引脚,避免单片机在欠压状态下跑飞。
看门狗电路我们用的是独立看门狗芯片,喂狗信号由单片机的一个GPIO控制。这里踩过一个大坑:调试时一进低功耗模式就整机复位,排查了很久发现是看门狗超时没有在休眠前正确暂停。后来我们改了策略——看门狗只在主循环里喂狗,中断里不喂,这样如果主循环卡死,不管中断怎么跑,看门狗都能拉闸。这个设计思路我觉得很值得参考。
上电时序这块也容易翻车。主控板、摄像头、电机驱动如果同时上电,浪涌电流叠加,电池电压瞬间跌落,轻则复位,重则烧MOS管。我们的方案是电源板上用MOS管做程控开关,主控起来之后按延时顺序依次给外设供电:先给摄像头,稳定100ms后再给运放,最后才使能电机驱动。这样每一级负载上电时都有一段缓冲,实测整车上电时电池电压跌落从0.8V降到了0.3V以内。
4. 传感器信号链:运放、差分放大与摄像头抗干扰
4.1 为什么传感器的信号不能直接进单片机
不管是电磁组的电感信号还是其他模拟传感器,输出信号幅度往往很小,几毫伏到几十毫伏。单片机ADC的参考电压一般是3.3V,分辨率虽然够,但信噪比和输入阻抗匹配都很难处理。如果直接接,信号被噪声覆盖,算法再厉害也白搭。
所以在传感器板和主控板之间,我们专门做了一级模拟预处理。用运放把信号放大到ADC量程的中段,同时做滤波和阻抗变换。这样ADC读到的数字量才有意义。这套思路不新鲜,但很多人做的时候会犯一个错误:滤波器带宽算错了。智能车运动信号频率其实不高,主要是直流和低频分量,但电机PWM和开关电源产生的高频噪声很强,所以低通滤波器的截止频率要放在几百Hz量级,把高频噪声滤干净,而不是随便放一个RC。
4.2 运放经典电路里,智能车最常用的三种
网上流传的“运算放大器11种经典电路”我们基本都玩过,但真正在车上用的也就那几种。
第一种是同相放大电路,输入阻抗极高,适合直接接传感器输出,不会拉低源信号。我们用于摄像头输出缓冲和电磁信号放大。
第二种是差分放大电路,用来做差分信号的接收和共模噪声的抑制。这个下面细说。
第三种是有源低通滤波器,也就是运放加RC构成的二阶低通。我们用于运放输出级,把高频毛刺削掉。这里有个小技巧:可以用同一个运放同时做放大和滤波,把滤波电容放在反馈回路上,形成一个带增益的低通,省一级电路也省一级噪声。
4.3 差分放大电路:用对称走线换共模抑制
差分放大电路在智能车上最常见的用途是电磁组的水平电感信号处理。两个电感差分输出,经过差分放大后,共模干扰在理想情况下被完全抵消。但教科书上讲的是理想电阻匹配,实际板上电阻偏差1%就能把共模抑制比拉到50dB以下。
我们的做法是:差分放大器的四个匹配电阻全部选0.1%精度,并且从原理图到PCB都用同一阻值同一封装同一方向放置,减少热应力和工艺偏差。PCB走线时,两路差分输入线严格等长、紧贴走,保证寄生电容一致。实测共模抑制比从40dB提到了70dB以上,这个提升对电磁组来说是决定性的。
如果你做的是非差分传感器,也可以利用差分结构——比如把远端地线通过缓冲器接回来,形成一个“伪差分”结构,同样能抑制地环路噪声。这个思路在很多工业采集卡上都有,我们在车上也用了。
4.4 摄像头信号与模数混合地的处理
摄像头组永远离不开一个核心问题:数字地和模拟地到底怎么分。网上说法很多,有的说干脆不分割,有的说完全分开然后单点连接。我们最后采用了“局部单点连接”的方案:摄像头数字信号和模拟供电在传感器板上就近共地,整个传感器板的地和主控板的数字地在排针处单点相连。这样的好处是数字信号回流路径短,不会穿过模拟敏感区域。
还有一点:摄像头的I2C配置线和PCLK像素时钟线,我们串了33欧姆的小电阻,并加了ESD保护二极管。别小看这两个元件,赛场上静电和插拔造成的损坏,基本都是它们挡下来的。摄像头排线我们也从10cm砍到6cm,信号线之间用地线隔开,花屏问题少了很多。
5. 驱动侧电路:蜂鸣器、推挽、图腾柱与IR2110半桥
5.1 无源蜂鸣器驱动:一个三极管加一个续流二极管的学问
无源蜂鸣器需要用一定频率的方波驱动,不能用直流。很多新手直接用一个NPN三极管开关蜂鸣器,然后发现声音发闷、音量小。原因是蜂鸣器是感性负载,开关瞬间会产生反电动势,三极管没有续流通路,能量无处释放,声音自然差。
我们的驱动电路是:单片机GPIO经过限流电阻控制NPN三极管,蜂鸣器接在三极管集电极和电源之间,集电极对地并联一个续流二极管。这样三极管关断时,蜂鸣器电感里的电流通过二极管续流,不会击穿三极管,声音也干脆多了。更讲究一点,可以在蜂鸣器两端反并联一个小阻值电阻,加速阻尼,声音会更脆,但耗电稍微大一点。这个电路很基础,但每年都有队伍在这一块翻车,具体原因就是续流二极管放反或漏放。
5.2 推挽电路与图腾柱电路:栅极驱动的两兄弟
控制电机驱动MOS管时,单片机GPIO直接驱动是不行的,因为MOS管的栅极电容很大,需要瞬时充放电电流,GPIO根本给不了。这时候就要用到推挽电路或者图腾柱电路。
这两个词经常混用,但严格说:推挽是指两个互补三极管交替导通,一个推电流一个拉电流;图腾柱就是在推挽结构上再叠一层,常见的是用两个NPN和一个PNP组成的离散图腾柱,专门用于快速关断MOS栅极。
我们电机驱动板上用了图腾柱驱动芯片或者分立元件方案,关键在于关断速度要比开启速度快。MOS管关断时如果太慢,会长时间停留在线性区,发热巨大。我们在栅极电阻上做了不对称处理:开启用10欧姆,关断通过二极管旁路到2欧姆,这样开通慢一点避免振铃,关断快一点降低开关损耗。这个细节在示波器上看得清清楚楚,但原理图上一眼看不出来,所以我特意在notes里画了时序波形。
5.3 IR2110半桥电路与自举原理
驱动板上的电机全桥是用IR2110搭建的。IR2110是半桥驱动芯片,一片能驱动上下两个MOS管,自带电平位移功能。全桥就用两片IR2110,一共四个MOS管。这里最需要理解的是自举电容的工作原理。
IR2110的高边驱动悬浮电源靠自举电容提供。当低边MOS管导通时,自举电容通过二极管从VCC充电;高边MOS管导通时,电容放电维持栅极电压。所以自举电容的容量和ESR很关键。我们用了1uF的CBB电容并联0.1uF陶瓷电容,位置紧贴芯片的VB和VS引脚。如果容量太小,高边驱动电压维持不住,MOS管会半导通;如果走线太长,寄生电感会让自举电压产生剧烈振荡。
还有一个常见坑:低边MOS管的PWM占空比不能长时间接近0%,否则自举电容没有足够的充电时间,高边会直接罢工。我们的PWM最低限制在5%,就是在IR2110上踩过坑之后加的保护。
6. 通信与调试接口:485电路与下载口的坑
6.1 485电路:终端的120欧姆电阻到底加在哪
485通信在智能车上主要用于主控和上位机之间的长线调试,以及和裁判系统之类的外部设备通信。485是差分信号,抗干扰能力强,但它的正确性非常依赖终端匹配。
标准做法是在总线最远端两端各接一个120欧姆电阻。但“最远端”这个概念经常被忽略。如果车上只挂了一个485节点,这个电阻到底加不加?我们的经验是:短距离调试(1米以内)不加也能用,但一上赛场、线缆变长、干扰变多,问题就出来了。所以我们通信板上做了跳线帽设计,默认焊上120欧姆电阻,做短距离点对点调试时可以直接拔跳线帽去掉,非常灵活。
485收发器的A、B线上我们还加了TVS管和共模电感,因为赛场上电机火花会产生很强的共模干扰,这些干扰如果不滤掉,轻则丢帧,重则烧芯片。偏置电阻我们也加了——拉高A端、拉低B端,保证总线空闲时电平确定,不会出现乱收数据的情况。
6.2 下载调试接口与“调试口复用”问题
主控板的调试接口(SWD或者JTAG)是最容易被忽略但又最能影响开发效率的。我们把SWD接口做成了标准4针(SWDIO、SWCLK、GND、VCC)加一个复位引脚,全部用排针引出,并且放在板子边缘,方便插调试器。
这里有个很坑的点:很多单片机引脚是复用的,SWDIO和SWCLK同时是普通GPIO。如果初始化代码里把这两个引脚配置成其他功能,调试器就再也连不上了——俗称“闭锁”。我们备赛期间至少遇到三次。后来养成了习惯:调试接口引脚单独做一个小封装,默认不引出到功能电路,确需复用时也要加跳线帽。开机初始化流程里还加了一个延时判断,按住某个按键就不初始化外设,只等调试器连接。这个“救砖技巧”在目录里单独写了一个文档,强烈建议所有做嵌入式开发的人都看一眼。
6.3 防抖电路和按键处理
按键防抖在智能车上其实不是一个高深话题,但我们的按键直接连到单片机外部中断,用于模式切换和参数调节。机械按键按下时会有几毫秒到几十毫秒的抖动,如果只靠软件延时消抖,中断响应就变慢了,而且过程中还会误触发多次。
我们的方案是硬件RC低通滤波加施密特触发器,一劳永逸。电容取0.1uF,电阻取10k,时间常数1ms,再经过施密特整形,抖动被消除得很干净。软件里就不需要再做延时消抖了,中断只要触发就一定是有效按键。这个电路占地方很小,但对调试体验的提升非常明显——你按一下按键,功能就切一下,绝不会出现按一下切三下的鬼畜现象。
7. 踩坑实录:几块PCB上肉眼看不见的教训
7.1 BUCK电感啸叫:不是电感坏了,是环路在振荡
有一版电源板打样回来,上电就听到电感发出吱吱声,声音不大但听着心慌。我第一反应是电感饱和,换了个更大规格的,结果没用。后来用示波器测输出纹波,发现低频段有一个十几kHz的振荡分量,才反应过来是环路不稳定。
原因是补偿网络的零点频率设置得太低,轻载时系统相位余量不够,产生了次谐波振荡。解决办法很简单:调整补偿电阻电容,把环路增益交点压在开关频率的1/10以下,同时加大输出电容的MLCC容量。修改之后再测,啸叫消失,纹波也从80mV降到了30mV以内。这个案例让我明白了一个道理:PCB上的很多“神秘现象”,本质都是控制环路问题,不要一上来就怀疑器件。
7.2 运放自激振荡:示波器探头一碰就正常
传感器板调试时发现了一个很诡异的现场:运放输出信号有高频毛刺,但用示波器探头碰上去,毛刺反而消失了。一开始以为探头接触不良,后来查资料才明白,这是运放自激了——探头本身带了10pF左右的输入电容,这个电容刚好压住了振荡频率,等于“外挂”了一个补偿电容。
解决方法是直接在运放输出端和反相输入端之间并联一个22pF的小电容,把带宽压一压,防止自激。这个电容在原理图上看着多余,但在实际电路里非常关键。如果不用加电容的方案,也可以在运放输出串联一个小电阻再接负载电容,隔离容性负载。两种方法我们都在不同板卡上用过,后者对信号完整性更好,但多一个元件。
7.3 摄像头花屏:排线才是最大干扰源
有段时间摄像头图像在上位机上总有几条横纹,一开始怀疑是摄像头本身,换了一个问题依旧。后来发现是排线问题:排线走过电机驱动板附近,PCLK信号被耦合了噪声,导致图像数据错位。
改进办法是把排线长度缩短,信号线之间插入地线,并且排线在PCB上的连接器周围做了包地处理。还有一个细节:排线折弯处不能成直角,否则信号线之间间距会被压缩,串扰增加。我们最终把排线从10cm换成6cm,花屏问题基本绝迹。这个案例告诉我们,高速信号的完整性问题,往往从物理结构上解决比从电路上解决更有效。
7.4 看门狗误复位:主循环里的一次“堵车”
看门狗误复位是另一个经典问题。我们的主循环里有图像处理任务,偶尔会出现一个比较重的运算,比如图像二值化加边缘提取,耗时几十毫秒。如果这时候看门狗还在倒计时,主循环一卡,喂狗不及时,系统就复位了。
解决思路不是无限调大看门狗超时时间,而是把耗时操作拆解到多个循环周期里,或者把喂狗动作放在主循环最前面,只要程序没彻底卡死,就至少能喂一次狗。真正的死机(比如死循环)依然会被看门狗抓住。这个策略既保证安全性,又避免误伤正常任务。
8. 复刻这套资料前,我想先跟你交代几件事
8.1 元器件采购与替代建议
开源目录里所有元器件的型号和封装都写在BOM表里,但个别器件尤其是运放和驱动芯片,可能因为渠道和价格原因不太好买。我的建议是:不要随意替换核心参数不同的器件。比如把运放换成带宽更低的,信号链路的增益带宽积立刻变化,之前调好的滤波特性全乱套。替代选型时至少要对上这几个参数:供电电压范围、增益带宽积、压摆率、输入偏置电流、封装。
电源部分的电感也不要乱换,DCR和饱和电流是硬指标。有些便宜的工字电感直流电阻大,满载时效率低还发热,车身一烫,性能就飘。BOM表里我们标注了每一颗电感的品牌和订购链接,照着买是最稳的。
8.2 建议的测试工具与调试顺序
如果你要复刻这套硬件,我强烈建议至少准备以下几样东西:一台双通道以上示波器(100MHz带宽起步)、一个电子负载或者至少是大功率电阻、一个可调电源、一个串口转USB模块。花费不高,但能解决80%的硬件问题。
调试顺序也很重要,千万别一上来就全板上电。我的习惯是:先空载测电源板,确认各路电压正常,再带载测纹波;然后单独给主控板烧录最小程序,确认调试接口通畅;接着接传感器,用上位机看数据是否合理;最后才接电机驱动,而且第一次不让电机转,只测PWM波形和栅极驱动波形。每一步都确认无误再进行下一步。这套顺序写在了仓库docs/debug-order.md里,照做可以省下大量排查时间。
8.3 给下一届队员和想入坑的朋友的一句话
开源目录不是让你拿来直接交差的,而是给你省掉“从零踩坑”时间的。真正有价值的是那些 notes 里记录的实验数据和失败过程——它们比最终的原理图珍贵得多。如果你复刻过程中发现了更好的方案,欢迎回头提issue或者直接改代码,这才是开源的意义。
我个人在整理完这些资料之后的最大体会是:智能车竞赛比的不是谁的理论课学得好,而是谁能在有限时间里把每一个细节做到位。电路组尤其如此——一块板子的稳定性,可能决定整个车队一整个赛季的努力能不能在赛场上兑现。希望这套开源目录能帮你少走点弯路,也希望你们队的电路组,也能像我们一样“疯狂”但靠谱。