1. 疯狂电路组到底在比什么:赛道解析与开源目录的价值
1.1 第二十一届智能车竞赛的“疯狂”点在哪
全国大学生智能车竞赛每年吸引大量高校队伍,21届各个组别的规则和赛道元素比往年更考验硬件基本功。这里说“疯狂电路组”,并不是官方定义的正式组别名称,而是大家对那一届里电路复杂度高、硬件故障率也极高的几类赛道的统称。摄像头识别、电磁循迹、AI视觉、完全模型组等等,哪一个拿出来都离不开一套可靠的电路系统:电源要稳、信号要准、驱动要扛得住反复急加速和急转弯,稍有闪失,轻则丢线,重则直接冒烟。
21届比较让人头疼的几个点,首先是电池电压平台差异大,有的队伍用8.4V锂电池,有的用12V铅酸,电压不同,电源树的拓扑就不一样。其次是电机驱动电流大,堵转电流可能超过10A,PCB上稍微走细一点铜皮,过孔一热,焊盘就直接脱落。第三是传感器信号通道多,摄像头采集、电磁电感、编码器、陀螺仪、按键和OLED显示全部挤在一小块主板上,模拟信号和数字信号互相干扰,调得好的车和调不好的车,差距往往就在地线布局和滤波电路上。
所以那一年的“疯狂”是有原因的:电路组不仅要会画板子,还得懂电池充放电管理、功率变换、信号调理、保护逻辑和嵌入式底层驱动。把这么多东西装进一辆几十厘米长的小车里,本身就是一场硬件基本功的大考。soberup战队选择在赛后把整套开源目录放出来,对后来的队伍来说,等于把当时踩过的坑、调过的参数、画错的板子原原本本摆在了明面上,这是非常有参考价值的。
1.2 soberup战队开源了什么:目录总览
从开源仓库或者帖子里的目录结构来看,soberup战队的分享思路比较清晰,把硬件、软件、文档、测试工具都分开归类,而不是把所有文件一股脑丢进去。一个比较典型的开源目录会包含这几块内容。
- Hardware:核心板、驱动板、传感器板、电源板的原理图、PCB文件、BOM清单和封装库。
- Firmware:主控工程代码,包含各个模块的驱动、控制算法、任务调度和调试输出。
- Tools:上位机脚本、串口调试助手、参数调节工具、固件烧录脚本、采集数据解析工具。
- Docs:设计说明、调试日志、赛道元素处理逻辑、参数表、常见问题记录。
- Test:实验室拍摄的实车调试视频、波形截图、实测数据,以及针对每个测试场景的说明。
这种结构最大的好处是后来者能够按图索骥。比如你想看电源设计,直接打开Hardware下的电源板工程,而不需要从几千行代码里猜这个电路是怎么接的。再比如你想知道某个滤波系数怎么来的,可以在Docs里找到对应的调试日志,里面会记录当时的车速、弯道角度和波形表现。
真正有价值的东西其实不在于原理图画得多漂亮,而在于每一处关键电路旁边的注释、每一个参数背后的实测依据。开源目录里最值得花时间读的,反而是那些看起来不起眼的README、调试笔记和问题清单,因为它们记录了从“能亮灯”到“能跑完一圈”的真实过程。
2. 核心电路模块拆解:从电源入口到电机输出
2.1 电源树设计:Buck/Buck-Boost与多路稳压
智能车上所有电路都挂在同一个电源树上,电池电压进来之后,要变成多路稳定电压供给MCU、摄像头、编码器、OLED、蜂鸣器、电机驱动逻辑等模块。电池电压随电量变化很大,比如2S锂电池满电8.4V,放到7.2V甚至更低,而摄像头和MCU要求电压纹波很小,所以不能直接拿电池供电,必须做一级一级的变换。
很多队伍在21届选用的方案是Buck降压。Buck电路核心思想就是通过高频开关把输入电压斩波成脉冲,再经过LC滤波得到平滑的直流输出,输出电压约等于输入电压乘以占空比。常用的控制芯片有MP1584、TPS5430、LM2596,还有不少队伍直接用单片机的PWM配合低压差LDO,其实也是一种简化做法。如果电池电压可能低于某个负载所需电压,比如希望输出5V但电池放到7.2V仍然没问题,那就不用Buck-Boost;但有的传感器需要6V或者7V输入,而电池电压只有7.4V左右,此时用Buck-Boost会更稳,只是效率略低,电路也复杂一点。
设计电源树时有一个容易被忽略的细节:各个负载的瞬态电流变化很大,尤其是电机驱动瞬间拉高电流时,如果电源出口只有一颗大电容,可能扛不住高频脉冲,导致电压瞬间跌落,进而让单片机复位。合理做法是电源板靠近负载侧再加小容量的MLCC陶瓷电容,比如10uF配0.1uF组合,利用高频低ESR电容吸收瞬态噪声,同时还要注意电容摆放位置,尽量靠近芯片电源脚。
我见过不少同学只关注电感的额定电流,却忽略了电感饱和电流。Buck电路里电感如果选得太小或者磁芯易饱和,电流尖峰就会变大,芯片发热也会很快。建议选电感时按照最大负载电流的1.5到2倍余量来选,同时看实际波形,别只看电感值。还有一个很实际的体会:电源板调试时先把负载断开,用示波器看每个输出点的电压纹波和上电时序,确认没有过冲之后再接负载,不然很容易烧器件。
2.2 电机驱动与半桥:IR2110、图腾柱、续流
电机驱动是电路组里最容易冒烟的模块。常见的方案有集成驱动芯片(如BTN7971、DRV8701)和分立MOS管方案,21届很多强队还是倾向于用半桥驱动芯片加N-MOS来做,因为可控性好、发热较低、成本也低。IR2110是很典型的半桥驱动芯片,自带自举电路,可以用一个芯片驱动上管和下管,输出端再接电机形成H桥或半桥。
IR2110使用时有几个关键点。第一是自举电容和自举二极管的选型。自举电容负责给上管提供栅极驱动电压,如果容量太小,开关频率高时电容电压来不及补充,上管就会驱动不足,管子进入线性区,发热严重。容量一般取0.1uF到1uF之间,具体要看开关频率和栅极电荷量,频率高时可以适当减小,但不能低于芯片手册给出的最小值。第二是死区时间。半桥上下管不能同时导通,否则直接短路,需要设置一个死区时间,常见的做法是用PWM互补输出,程序里配合定时器死区寄存器来实现,像STM32高级定时器就专门有死区配置,IR2110本身也要求输入信号有适当的间隔。
图腾柱电路其实在很多PWM输出场合都有应用。它本质上是用两个三极管或MOS管组成推挽结构,一个负责拉电流、一个负责灌电流,从而提高驱动能力。IR2110的输出级本身就有类似推挽结构,但如果直接用单片机GPIO去驱动大功率MOS管,由于栅极电荷大,上升下降沿会变慢,开关损耗升高,这时候可以在单片机输出和MOS栅极之间加一个图腾柱,或者用专门的栅极驱动芯片。
续流二极管也是电机驱动里绝对不能省的东西。电机是感性负载,关断瞬间电流不能突变,回路里必须提供续流通路,否则会产生很高的尖峰电压,直接击穿MOS管。续流二极管要选快恢复或肖特基,耐压至少是电源电压的2倍,电流额定值也要大于堵转电流。有些驱动板上看到MOS管旁边并联的RC吸收电路,就是用来抑制开关尖峰的,设计时最好保留这部分,虽然会增加元件,但对可靠性帮助很大。
无源蜂鸣器驱动看起来简单,实际上也容易翻车。直接用单片机引脚驱动蜂鸣器,电流不够声音很小,而且要加续流二极管,不然反向电动势会打坏引脚。通常用一个NPN三极管做开关,基极串电阻接GPIO,集电极接蜂鸣器,发射极接地,同时蜂鸣器两端反并联一个二极管。这样的电路最稳妥,声音也响亮。
2.3 传感器信号调理:差分放大与运算放大器经典应用
智能车需要采集各种模拟信号,最常见的是电磁传感器、陀螺仪、编码器信号和电流采样。这些信号的幅度很小,经常混在噪声里,不能直接送到单片机的ADC,需要经过放大和滤波。运放在这里面的作用就是把微弱信号放大到ADC适合的范围。
先看电磁循迹。电磁传感器用的是工字电感加谐振电容,检测赛道导线上交变磁场产生的感应电动势,信号只有几十毫伏,通常要用运放放大几十到几百倍,同时滤掉带外噪声。常用的电路是LC谐振后接同相放大,放大倍数由电阻比值决定。增益太高会把噪声也放大,容易出现方向盘高频抖动;增益太低又对距离变化不敏感。一般调的时候用信号发生器模拟传感器输出,边调增益边看波形,找到一个阈值稳定的位置再固定下来。
差分放大电路在电流采样里非常常见。电机母线电流大,要采集电流值做保护或环流控制,最简单的方法是采样电阻两端的电压,但采样电压很小,而且两端都带有较高的共模电压,直接接运放没办法工作。这时候用差分放大或仪表放大电路,把两个输入端的差值提取出来,抑制共模电平。INA240、AD8210这类差分放大器就是专门干这事的。如果手头没有专用芯片,用普通运放搭建一个差分电路也可以,但电阻必须精密配对,否则共模抑制比会大幅下降。
运算放大器的11种经典电路,这里就不一一列举了,但有几个电路在智能车上特别好用。反相放大器可以放大负信号或做信号极性转换,同相放大器输入阻抗高适合接传感器输出,电压跟随器用来缓冲信号源和ADC之间的阻抗匹配,有源低通滤波器用来做传感器信号平滑,比较器用来做赛道边沿检测等等。掌握这些基础电路之后,遇到什么信号就知道怎么处理,而不是套一个网上找的电路图然后跑不通。
在PCB布局上,运放电路的反馈电阻和输入电阻要尽量靠近运放引脚,反馈路径越短,寄生电容越小,高频稳定性越好。输入走线要避开电机驱动和电源开关节点的下方,模拟地和功率地之间可以采用单点连接或磁珠连接,避免地环路噪声。
3. 嵌入式部分:从模糊到清晰的控制链路
3.1 MCU选型与最小系统:复位、看门狗、时钟
电路组开源项目里面,主控芯片的选择很有代表性。21届很多队伍用STM32F103或者TC264这类性价比高、资料多的芯片,近年来也有用RP2040、Kinetis的。无论哪颗芯片,最小系统不可或缺的三件事是复位电路、时钟电路和下载调试接口。
复位电路看起来简单,就是一个电阻加电容,实际上对上电时序很敏感。如果电容选太大,复位信号下降沿太慢,芯片可能在电源还没稳定时就开始运行,造成随机死机;选太小又容易受干扰误复位。通常参考芯片手册给出的最小RC时间常数来选,同时可以加一个手动复位按键,方便比赛现场快速恢复。看门狗电路则是防止程序跑飞的最后一道防线。硬件看门狗需要定期喂狗,如果程序进入了死循环或者主频异常,看门狗就会把芯片拉复位。这个电路要注意喂狗时机,不能在中断里喂,否则主循环卡死时中断还在跑,看门狗不会触发;最好在主任务循环的固定位置喂狗,同时把喂狗操作放在一个独立的低优先级任务里。
时钟电路同样关键。很多人直接用内部RC振荡器,方便但温漂大,对于需要精确通讯和稳定PWM频率的场合,还是建议接外部晶振。晶振的两个负载电容要按晶振手册来选,不能随手夹两个电容就完事。我见过有的队伍因为晶振负载电容不对,导致串口波特率偏差,上位机收到的数据全是乱码,排查了半天才发现是电容值不对。如果MCU支持,可以用示波器测量时钟引脚的波形,看振幅度和频率对不对。
485电路在赛场上也有不少应用场景。多车通讯、无线模块、检测桩通讯都可能用到RS485。485电路的核心是收发器和终端电阻。收发器如MAX3485、SP3485,A和B两根差分线之间一般要接120Ω匹配电阻,防止信号反射。如果只一对一共线,主机和从机两端的终端电阻都要接,但中间节点不需要。另外要注意收发切换控制脚的时序,如果切换太快,可能丢数据,通常程序里在发送完毕后延时几个字节时间再切回接收模式。
3.2 PID控制与角速度输出:“pid输出角速度”到底是什么意思
搜索热词里“智能车pid输出角速度”出现频率很高,这确实是21届控制链路的重点。简单理解,智能车在赛道上行驶时,转向控制系统要根据当前偏差(例如摄像头看到的横向偏移、电磁传感器测到的偏差)计算出应该转多大的角度或多大角速度。
这里的PID输出并不是直接就是舵机角度,而是经过映射后才给到执行器。理想情况下,舵机角度与车身转角存在一个近似线性关系,但实际由于转向机构存在间隙和非线性,控制量需要做标定和限幅。角速度这个概念主要出现在使用陀螺仪做闭环转向的时候,通过IMU测出车身当前的横摆角速度,和期望角速度做差,再进行一次PID校正,这样能提高转向的稳定性。
一个常用做法是:摄像头或电感给出位置偏差,外环PID输出目标角速度,然后内环PID用陀螺仪测得的实际角速度去跟踪这个目标角速度,最终输出给舵机。外环负责“看多远”,内环负责“转多稳”,这种串级结构比单纯一个PID好用很多,尤其是在高速入弯和出弯加速时,可以有效抑制转向过冲。陀螺仪的角速度数据需要用卡尔曼滤波或互补滤波处理,滤波系数要根据实际震动环境调整,太小数据噪声大,太大延迟明显,具体数值只能靠实车采集波形来确定。
调PID没有捷径,但可以按步骤来。先调内环角速度环,断开外环,给定一个固定目标角速度,观察实际角速度跟随情况,记录上升时间、超调量和稳态误差,从P开始一点点往上加。内环稳定后再加外环,外环的输出限幅要小于执行机构能承受的范围,不然车在高速时容易突然猛打方向。整定过程中建议开启数据录制,用板载SD卡或者串口把目标值和实际值发出来,后期在电脑上画波形对比,比用肉眼看车跑更靠谱。
3.3 代码结构中的模块化与状态机
开源项目里最影响可读性的就是代码组织方式。soberup战队的固件目录如果按模块划分,通常包括传感器采集、控制算法、执行器输出、通信、调试指令等,每个模块一个C文件加一个头文件,接口定义清晰,其他人接手时能快速定位问题。
任务调度方面,很多队伍直接在主循环里轮询,简单但效率低。20ms采集图像、5ms读取陀螺仪、10ms更新PID,如果全堆在主循环,不同模块之间的时序就容易互相影响。比较好的做法是用定时器中断做系统心跳,把不同频率的任务挂到不同时间节点,或者用RTOS(如FreeRTOS)来管理。比赛程序一般不需要特别复杂的调度,但至少要把摄像头中断、串口中断和主控制循环分开,避免采集和决策耦合。
状态机在赛道元素处理里很常用。比如判断环岛、坡道、十字,不能只看一帧图像,需要连续多帧投票或者进入候选状态,确认之后再切换为执行状态。状态机的设计要注意边界条件,比如进入环岛后丢失外侧线多久需要复位,等待状态超时后要能回到循迹状态,这些都是赛场上经常出现的翻车点。开源项目里通常会保留这些状态机的状态转移图或者枚举定义,阅读时可以先从这里入手,快速理解赛题处理的整体思路。
另一个容易被忽略的细节是中断服务函数里不要做太多计算。有一次我看到一个队伍的代码,在摄像头采集中断里做了整帧图像的二值化加中心线提取,结果中断耗时太长,把串口接收和PID更新全部打乱了。这种问题在开源项目里如果写清楚注释和注意事项,能帮后来者节约大量排查时间。
4. 从开源目录到落地:避坑清单与调参实录
4.1 常见问题排查表
整理一份赛场上常见的电路问题和排查思路,联合测试时能省很多时间。有问题可以直接对照下面表格逐项排查。
| 现象 | 可能原因 | 排查思路与解决办法 |
|---|---|---|
| 上电瞬间MCU反复复位 | 电源跌落、复位电容不合适、看门狗误触发 | 示波器测电源电压波形,看是否有跌落尖峰;增大复位电容延迟;检查看门狗喂狗位置 |
| 电机低速时抖动,高速无响应 | PWM频率过低、死区不当、驱动芯片欠压 | 提高PWM频率到15kHz以上;检查自举电容容量;测量MOS栅极驱动波形是否完整 |
| 摄像头图像出现斜纹或水波纹 | 电源纹波过大、摄像头地环路干扰 | 摄像头独立LDO供电,模拟地与数字地单点连接;信号线屏蔽或加磁珠 |
| 电磁传感器数值波动大 | 运放增益过高或滤波不足 | 降低增益,增加有源低通滤波;检查谐振电容误差 |
| 陀螺仪数据漂移严重 | 供电不稳或采样频率过低 | 陀螺仪AVDD单独滤波,采样频率提高到1kHz以上;检查I2C总线上拉阻值 |
| 串口数据乱码 | 波特率不匹配、晶振负载电容错误 | 核对波特率;测时钟频率;检查两端共地 |
| 蜂鸣器声音很小 | 三极管基极电流太小或未加续流二极管 | 计算基极限流电阻,使三极管充分饱和;检查蜂鸣器类型是有源还是无源 |
| 按键无反应 | 按下后电平抖动、软件消抖不充分 | 增加RC硬件消抖或软件延时消抖;检查引脚是否被复用 |
这些问题的根源大多不是单一元件损坏,而是电路设计和软件逻辑的配合出了问题。建议每调一个新板子,先跑一轮最小系统测试、电源测试、外设点亮测试,再上控制逻辑,这样故障范围能缩小很多。
4.2 实测数据与参数参考
开源项目里的参数表是真正的财富。这里整理一些常见的参考范围,实际值要结合自己的车模、赛道和电源方案来调试,不能盲目照抄。
| 参数项 | 参考范围 | 说明 |
|---|---|---|
| 电机PWM频率 | 15kHz-20kHz | 高于人耳可听范围,同时避免电感啸叫和MOS发热 |
| Buck开关频率 | 200kHz-500kHz | 视控制芯片而定,频率高电感小,但开关损耗增大 |
| 视觉运行周期 | 10ms-20ms | 对应图像采集和处理的帧率,常用50-100Hz |
| 角速度环PID比例P | 0.05-0.5 | 单位根据量纲调整,从0.02开始逐步加 |
| 位置环PID比例P | 0.05-2.0 | 摄像头图像偏差点数做输入时,P值要结合分辨率 |
| 电磁运放增益 | 50-500倍 | 信号太弱可分段调试,避免饱和 |
| 采样电阻 | 0.01Ω-0.05Ω | 大电流时尽量用毫欧级,很小的阻值会有很大压降,选精密合金电阻 |
| 陀螺仪滤波系数 | 互补滤波系数0.4-0.6 | 数据动态响应和信噪比平衡点需实测 |
有一个强烈建议:所有参数在调试时要记录下来,包括当天的电池电压、赛道类型、车速、PID值,以及当时的波形截图。没有记录等于没有调参,过了一晚之后车变了个样子,你根本不知道哪里变了。开源项目里如果能附带一个参数记录表模板,对新队伍的帮助会非常大。
4.3 开源协作与版本管理心得
开源一个智能车项目,不能只是把最终代码和原理图放出来,更重要的是让其他人能够复现和继续改进。这里分享一些协作层面的体会。
硬件部分尽量使用版本化命名,比如BOM有v1.2、v1.3,PCB有v1.0、v1.1,每次改版在原理图或PCB标题栏里更新版本号,同时保留一份变更说明,哪怕只是“修改了电源芯片的电容值”这样一行字,也能避免后人拿着新板子配旧代码的混乱。原理图和PCB建议用通用的EDA格式导出PDF和网表,不要只放供应商专有的工程文件,否则没有安装对应软件的人就看不了。
固件部分用Git管理,主分支保持稳定,开发分支放新功能,给每个正式版本打标签,比如tag v1.0.3-release,标签信息里写清楚对应的硬件版本和重要参数。代码里尽量增加注释,尤其是一些看起来“奇怪”的写法,很可能是为了解决某个bug,例如延时、屏蔽某个中断、固定的数值偏移,这些地方必须写注释,否则三个月后你自己都看不懂。
关于开源协议,个人队伍在发布时最好明确协议类型,比如MIT、GPL或CC BY-SA。如果使用了别人的库,要注意保留版权声明。分享的目的不是把文件丢到网盘里就算完事,而是希望后来的爱好者能站在前人肩膀上,把车跑得更远更快。开源目录是否完整,判断标准很简单:一个从零开始的大学生在不看原队伍任何内部资源的情况下,照着目录能不能复刻出一辆能跑的车。
说到最后我再分享一个自己带队伍时常用的习惯。每辆车的电路板都会留一组调试点,比如PWM输出、ADC输入、I2C时钟、地线,用排针引出来,方便示波器探针直接夹。开源项目里也建议保留这个设计,因为下一次调试时,你会发现这些小小的排针比什么高级仿真都管用。真正值钱的不是那颗芯片、那截铜线,而是你踩过的坑和找出这些坑的办法。soberup战队的开源目录让人敬佩的地方也在这里,它把“疯狂电路组”从结果还原成了过程,后来的队伍照着这份目录走一遍,相当于提前避开了大多数足以让车冒烟的陷阱。