智能车竞赛电路开源:电源、驱动与信号链路的硬核实战
比赛结束快三个月了Soberup战队的开源目录终于整理完。队里那支被我们喊作“疯狂电路组”的队伍啃的是整个车队最硬的骨头——电源、电机驱动、传感器信号调理、通信接口每一块拆开都能写出几千字的血泪。这篇不说比赛名次只把做过的电路设计、计算过程、踩过的坑全部摊开给准备打全国大学生智能车竞赛的朋友或者想把手里的嵌入式开源项目做扎实的人一份可以直接抄作业的参考。1. 这个开源目录到底在讲什么1.1 疯狂电路组在车队里的分工智能车竞赛的分工和外面做产品很像机械组负责底盘和悬挂算法组负责视觉和路径而我们电路组负责“让每一伏电压、每一毫安电流都听话”。疯狂电路组听起来像自嘲实际上就是那些既要会算又要会焊的活——Buck电路的效率曲线、IR2110驱动半桥时的自举电容、编码器信号的差分放大、摄像头抗共模干扰这些东西出现问题的时候不会直接让车“死”而是让车“抽风”最难查。我们组在第二十一届智能车竞赛里承担了这么几块整车的电源树设计从7.4V锂电池一路降压到5V、3.3V甚至1.8V电机驱动的功率部分用的是IR2110为核心的半桥方案传感器信号链路包括编码器的差分放大、RC滤波、ADC采集前端的阻抗匹配还有通信和可靠性像RS485远程调试、看门狗、复位和掉电检测。可以说除了摄像头图像处理那段纯算法代码车上所有和“电”有关的板子几乎都是我们画的。1.2 开源仓库里放了什么这次整理的开源目录结构很明确没有把一堆工程文件往里塞了了事。硬件目录下是原理图源的工程、完整的PCB文件和BOM表BOM表里每个器件的封装、品牌、采购编号都标了。固件目录下是STM32的工程重点部分是ADC采集、PWM生成、IWDG配置这种和硬件强相关的代码注释写的比较啰嗦因为我们自己返工过太多次。最后还有一个docs目录里面是所有调试误区的记录比如哪次因为地线环路烧了编码器哪次因为Buck电感选错导致摄像头画面全是横纹。这份目录不是给人下下来直接打板用的——板子和车型、规则强相关下一届规则一变很多参数就要重算。它真正值钱的是计算过程、选型理由、以及“为什么当时那么做”。只要把设计思路读懂了换一套规则照样能套用。2. 系统设计思路先想清楚再动烙铁2.1 电源树为什么主电源必须用Buck而不是LDO这是组里新队员最常见的问题。一开始有人觉得LDO简单——输入输出各放几个电容上电就有电压稳得很。但算过账就笑不出来了。2S锂电池标称7.4V满电8.4V如果从7.4V降到5V线性稳压器上压差就是2.4V整车的MCU、摄像头、编码器加起来电流至少0.5A到1A对应的热耗是1.2W到2.4W。这个热量放在一块手掌大的PCB上稳压器会烫到不能碰而且热会顺着铜箔往传感器那边传温漂起来ADC读数一天一个样。所以我们整个系统用两级方案主电源用Buck先把电池电压降到5V然后5V再给传感器和MCUMCU的3.3V用一颗低压差LDO从5V转换。这样做的好处有两个第一Buck承担了大部分压差效率能到85%以上第二MCU那一路用LDO是为了隔离Buck的开关纹波模拟电路对纹波敏感3.3V上叠个几十mV的开关毛刺陀螺仪输出就会跟着抖。这里要特别提醒一点Buck的反馈采样要从输出电容的焊盘上单独走线别从电感那边直接飞线那样采到的是纹波的波峰和波谷负载一变状态就容易振荡。实测下来反馈走线只要能避开功率环电源纹波能压到20mV以内。2.2 驱动方案IR2110半桥为什么值得自己搭电机驱动有好几种现成方案集成H桥芯片比如TB6612、DRV8870便宜省事调一下逻辑电平就能跑。但我们的车载电流峰值经常到5A以上集成芯片的热阻和散热条件在连续大电流下很难看而且集成方案一般不带高边自举设计你拿不到内部栅极驱动的细节出了问题只能整个换芯片。相比之下用IR2110加两颗N沟道MOSFET搭半桥灵活度高太多。IR2110内部集成了高压电平移位和自举二极管10V到20V的栅极驱动电压直接能推满普通功率MOS比用单片机IO去直驱强几个量级。选择IR2110而不是IR2104的原因很简单IR2110每个通道都有独立的输入和关断控制做H桥的时候正反转死区控制更自由IR2104虽然内部带死区但死区时间写死了实际调试中发现MOS发热临界时想微调都无从下手。关于MOS管选型我们车上用的是逻辑电平可用的型号IR2110输出能力很充裕重点看Qg栅极总电荷和Ciss输入电容Qg太大驱动会变慢太小则开关损耗低但抗干扰能力弱。车载环境震动大栅极如果悬空容易被干扰误触发所以栅源之间必须加一个10kΩ到100kΩ的泄放电阻这条是保命的。2.3 信号链路差分、滤波、隔离一条线走通电路组最容易被算法组吐槽的就是“信号脏”。编码器输出的AB相脉冲如果传输线长了或者电机地上的噪声串进来脉冲边沿就会有一堆毛刺测速模块可能把一次脉冲数成三次角速度算出来直接起飞PID看着正常但车就是反复抽搐。所以我们在编码器接口上做了完整的信号调理首先用差分放大器把单端信号转成差分形式这样共模噪声可以在放大端被抑制掉然后在差分对输出端加一级RC低通滤波截止频率放到比编码器最高输出频率高一个数量级的位置既能滤掉边沿振铃又不至于让相位延迟影响测速实时性。最后到MCU的输入引脚前再串一个100Ω电阻配合芯片内部的施密特触发器把最后一点残留毛刺消化掉。这里面最关键的思路是“隔离”。传感器和电机虽然共用电池但大电流回路绝对不能和信号回路混在一起。电机那种几个安培的开关电流靠的是低阻抗环路回流如果你让这些电流经过信号地那么信号地上每平方英寸都会产生压降ADC参考电压跟着抖怎么滤波都救不回来。所以原理图上就要明确区分功率地、模拟地、数字地在底层用单点汇聚到电池负极。3. 核心电路计算与关键参数3.1 Buck输出电感计算实例原理图可以抄别人的电感参数必须自己算。我们给主电源选的Buck是TPS5430开关频率500kHz输入7.4V输出5V设计最大负载电流按2A算纹波电流系数取20%。根据Buck电感的经典公式L (Vin - Vout) × Vout / (fsw × ΔIL × Vin)代入数值Vin7.4VVout5Vfsw500kHzΔIL2A×20%0.4AL (7.4 - 5) × 5 / (500000 × 0.4 × 7.4) ≈ 10.8µH市面上最接近的是10µH工字电感和12µH一体成型电感。我们选的是10µH的一体成型额定饱和电流3A以上直流电阻RL小于50mΩ。看起来10µH比理论值略小纹波会比设计值稍大但一体成型电感的屏蔽效果好磁漏少对周围的ADC模拟电路干扰小得多。这里要记住Buck的电流环路上电感、续流二极管、MOS管和输出电容形成一个“热环”这个环的面积要尽量小否则开关纹波可以通过辐射耦合到天线一样长的走线里。实测的时候要注意电感不能只看感值饱和电流才是关键。电流一旦超过饱和点电感量断崖式下跌Buck立刻进入过流状态输出电压崩塌MCU复位。很多上电正常、跑一圈就死机的诡异问题查到最后就是电感买了一颗劣质货。3.2 半桥自举电容与死区时间计算IR2110驱动的半桥上管是靠自举电容提供栅极电压的因为上管的源极不是地栅极驱动必须悬浮在源极之上。这个电容的容量怎么选理论上要满足Cboot ≥ Qg / ΔV其中Qg是MOS管栅极总电荷ΔV是允许的自举电压跌落一般取0.5V以内。我们用的MOS管Qg典型值65nC那么Cboot最小也有130nF。但工程上不能卡着最小值来因为自举电容充电时间窗口在上管关断、下管导通那一小段时间里频率越高充电时间越短容量太小会充不满上管开启时Vgs不足管子进入线性区疯狂发热。我们最终用的自举电容是10µF X7R陶瓷电容并联一个0.1µF高频电容。10µF保证能量储备0.1µF负责瞬态响应。第一次画板子时图省事自举电容放得离IR2110很远结果是高频下上管驱动波形圆头圆脑MOS开关损耗大到烫手。后来把电容移到驱动芯片引脚旁边波形立刻恢复成方波。所以布局比容值更重要的道理是流汗流出来的。死区时间同样要关注。IR2110自身不带死区互补PWM必须由MCU的高级定时器生成。STM32的TIM1/TIM8死区寄存器可以精确到ns级我们按300ns配的。死区太大开关损耗上升电机高速时效率明显差死区太小上下管一瞬间直通炸管就是几微秒的事。实测建议从500ns起步量上管驱动波形看有没有明显的台阶再逐步往下压。3.3 差分放大增益与RC滤波截止频率电流采样这块我们用电感下方的低边采样方式采样电阻选0.05Ω。电机峰值电流按2A算采样电阻上压降只有0.1V这个级别的信号直接进ADC会被底噪淹没。所以要用差分放大电路把0.1V放大到接近ADC量程。运放接成同相差分结构增益定为30倍反馈电阻Rf30kΩ输入电阻Rin1kΩ。0.1V放大后变成3V既能充分利用3.3V ADC的动态范围又留了10%的余量不至于削波。选运放时最看重失调电压普通LM358的失调电压可以到2mV放大30倍就是60mV误差对应电流采样误差60mA×0.05Ω3mA虽然看起来不致命但电流反馈环吃进这个偏置会导致零电流时输出不为零电机低速时会有明显的“嗡鸣”。我们用的是OPA2333失调电压只有10µV价格稍贵但完全值得。滤波这块要小心。PWM斩波频率20kHz采样电阻上的信号只有50%的占空比开关噪声叠在上面非常难看。我们加了二阶RC低通截止频率设在5kHz左右计算公式是f 1 / (2π × sqrt(R1×R2×C1×C2))实际取值R1R21kΩC1C233nF。但要注意滤波会引入相位延迟如果PID电流环周期只有500µs一阶RC在5kHz处的相移大概会有几度二阶后相移更大环路增益太高就会振荡。所以滤波不是越狠越好够用就行。3.4 看门狗、复位与掉电检测智能车跑比赛最怕的不是输是跑到一半程序卡死不知道。摄像头算法组写了个死循环车直接冲向围挡拉都拉不住。所以我们的固件里开了独立看门狗IWDGSTM32的LSI内部低速时钟大概32kHz配置预分频器64重装载值625算出来超时时间T reload × prescaler / LSI 625 × 64 / 32000 ≈ 1.25s这个超时时间对跑图算法来说绰绰有余正常主循环几十毫秒就跑一圈喂狗完全来得及但如果程序卡死超过1.25s系统自动复位至少车不会以全速撞墙。外部复位电路我们做了双保险。STM32的NRST引脚用10kΩ上拉到3.3V并联0.1µF电容滤波这样开关机上电瞬间的抖动不会误触发复位。另外加了一颗电压监控芯片专门监视5V轨一旦低于4.63V立刻产生低电平复位信号。这招在电池快没电时特别管用锂电池放电到3V以下内阻猛增大电流一抽电压瞬间跌落没有这颗芯片的话MCU会在欠压状态下跑一段“半死”状态外设寄存器配置乱掉等电压恢复后程序还活着但传感器数据已经全错了。强制复位反而让系统重启进入干净状态。4. 实操过程从原理图到跑稳一整天4.1 PCB布局布线三条纪律画PCB之前我们定了三条纪律全部是踩坑踩出来的。第一条功率回路和信号回路物理隔离。电机驱动部分放在板子一角MCU和传感器在另一侧中间隔着一整条铺地区域任何人都不许在功率地和信号地之间直接打过孔相连必须单点汇接到电池负极。第二条去耦电容必须紧贴电源引脚。这不是玄学电容离IC引脚超过5mm寄生电感就足以让它在高频下失效。我们给MCU每个电源引脚都配了一个0.1µF陶瓷电容放得最近的那个实测纹波最小。主电源入口还加了100µF电解和0.1µF陶瓷并联电解管低频陶瓷管高频配合起来改善很明显。第三条地平面优先。两层板如果一面铺地另一面走线高频电流容易被迫绕大圈子。我们尽量让地平面保持完整走线集中在一面另一面大面积铺铜。多打过孔连接上去特别是去耦电容的地脚孔要打在电容旁边的焊盘上而不是绕到最远端的地孔。布线时宁可多绕几厘米信号线也不要在功率地平面上切一条长缝那相当于故意制造天线。4.2 电平转换和RS485通信车上有几个外设模块是1.8V电平的比如摄像头寄存器配置用的I2C、某些高精度陀螺仪的串口而我们的MCU是3.3V电平直接相连肯定烧外设。串口TX方向3.3V降到1.8V最简单的就是NPN三极管方案MCU的TX经过4.7kΩ电阻接到三极管基极三极管集电极接上拉到1.8V发射极接地输出就变成了0~1.8V电平翻转。RX方向反过来1.8V高电平对3.3V MCU来说不够高MCU的输入高电平阈值一般是0.7倍VDD大约2.31V1.8V是识别不出来的。这种情况我建议用2N7000小MOS管做双向电平转换比三极管方案更干净电路上也就是漏极各加一颗上拉电阻的事。RS485我们用它做比赛时的远程调试通道跑车的时候通过无线串口把车上的角速度、PID输出这些变量实时发到电脑上比插一根几米长的线靠谱得多。收发芯片用的MAX3485这是3.3V版本的485收发器速率到10Mbps完全够用。总线两端各放一个120Ω终端电阻这两个电阻是必不可少的485总线如果没有终端匹配长线上的信号反射会在数据传输率较高时产生误码。我们还在A、B线上各加了两个680Ω上下拉电阻保证总线空闲时差分电压有确定值不然悬空时收发器可能收到随机噪声表现就是“没发数据电脑那边乱码”。4.3 电路响应速度和PID的配合这可能是电路组和算法组吵架最多的地方。算法组改一个PID参数车就从稳定变振荡他们总觉得是电路有问题我们测下来却经常发现是电源的动态响应跟不上PID的突变需求。道理其实不复杂。PID输出的是角速度指令最终执行是靠电机电流而电流变化的速度受限于电机电感、电源内阻和母线电容。如果PID的积分项给得很大PWM占空比从10%瞬间跳到80%那么电源线上的电流需求会突然飙升要是母线电容不够总线电压会被拉低一截接着Buck开始响应但它的闭环带宽一般就几十kHz远没有PWM那么快于是电压出现一个“坑”。这个坑反馈到电机上就是力矩先掉一下然后冲上去车身的姿态就会有一个肉眼可见的抖动。我们的做法是在MOS半桥旁边加一组470µF低ESR电解电容并0.1µF陶瓷作为瞬态能量的“缓冲池”同时把PID的D项输出变化率做限幅避免占空比跳变太夸张。准备好之后用示波器同时抓占空比、母线电压和电机电流三个信号确认电压跌落小于200mV才放算法组去调参。这样分工明确谁的问题谁认领。5. 常见问题排查与避坑实录5.1 故障现象速查表调车几个月我们把常见故障整理成了表格赛前检查直接按表排查省下大量现场时间。下面这些基本都是硬件问题如果你也遇到可以照着查。故障现象可能原因排查方向与解决办法上电反复复位复位电容太大/电压监控阈值不准量NRST引脚波形换小复位电容用电池直接供电模拟欠压Buck芯片啸叫电感饱和或反馈环路补偿不对换饱和电流更大的电感检查补偿电容、反馈采样点位置电机突然启动时MCU复位母线跌落太深半桥旁加470µF电容缓冲检查电池接触阻抗编码器脉冲计数跳动信号走线和电机线平行编码器线远离功率线差分放大前加RC滤波必要时屏蔽线接地摄像头画面横纹/雪花摄像头供电纹波大单独用LDO给摄像头供电模拟地单点接地半桥MOS管高温死区时间不足或栅极电阻过大量上下管栅极波形确认无直通减小栅极电阻但不要小于1Ω485偶发乱码缺少终端电阻或电平转换没加确认总线两端120Ω电阻A/B加偏置电阻检查信号地接法表格里最后一条485乱码我们折腾了最久。那时候总线只有两米长120Ω终端电阻都在收发器边上没有任何问题后来换到无线调试装置把线延长到十米以上就开始出现偶发帧错。最后发现终端电阻没有放在总线“物理两端”而是在调试装置那里并了一个120Ω相当于把匹配电阻放在了非法位置信号反射照样存在。5.2 接地和EMI说多了都是泪如果只让说一条电路组经验那就是接地。电源地和信号地无论怎么强调都不过分。我们第二版主板在编码器接口那边为了走线方便把信号地的铜皮和功率地之间通过一个过孔直接连通了结果电机一通电编码器脉冲毛刺多到测速完全不可用用示波器一量信号地已经变成了一条“天线”上面全是几十毫伏的开关噪声。后来改成星形接地每路信号地都直接单独走回电池负极汇总点信号地之间没有串联公共路径。地线环路是模拟电路最大的敌人尤其是编码器、运放、ADC前级这些高阻抗节点只要地环路面积大于手掌心噪声就基本不可控。另外电机两端我们也加了RC吸收网络0.1µF电容串10Ω电阻跨接在电机两出线端把电刷换向产生的火花高频分量就地消化掉这个成本不到一毛钱但整个系统的EMI水平肉眼可见地下降。还有一条容易被忽略的液晶屏或者摄像头排线的地。FPC排线现在都是同轴结构或者有地线夹在信号中间但如果你采购的是便宜排线信号线之间没有地隔离那数据总线就是一根根互相串扰的天线。我们最后直接上40pin的FPC软排线把每一个信号都用地线隔开高频串扰问题才算彻底解决。最后再分享一个小技巧做完整套开源目录我自己最大的体会是比分享“我做对了什么”更有价值的是分享“我搞砸过什么”。仓库里所有板子和代码都能下载但真正能帮到下一届的其实是docs里那几篇故障排查记录。每次踩坑之后写清楚现象、原因、波形特征和解决动作这份文档比原理图值钱得多。如果你也在整理自己的项目我特别建议不管多忙都留一份这样的笔记半年后回看会让你少走一半弯路。开源的时候别只放成品把思考和取舍也放进去。有人能从你的错误中避开短路有人能从你的计算中举一反三这才是我理解的“开源”的真正意义。