ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

智能车竞赛开源:从电源设计到串级PID的完整硬件方案

智能车竞赛开源:从电源设计到串级PID的完整硬件方案 赛前我们约定的口号很简单“最后一圈跑完把能开的源全开了。”结果真到了21届智能车竞赛冲线那天代码里还有一堆临时patchPCB上还飞着两根杜邦线。等到这周把 soberup 战队的开源目录彻底整理出来已经是赛后第四周中间还经历了补测、拆车、还焊台三件事。这份开源目录包含我们整个赛季的电路设计、底层驱动、控制算法和调试工具主力平台是 STM32 系的板卡比赛车模使用普通四轮车模组别是队内自己命名的“疯狂电路组”。说白了这就是一支把电源、传感、驱动、保护四块电路全都自己啃下来的队伍在用完了一个赛季的运气和炸掉的若干片MOS管之后把所有能交给下一届的东西打包放在了一起。这篇博客就当作开源目录的导览和说明书写给准备打智能车、或者对嵌入式硬件开源项目感兴趣的读者看。1. 为什么一支“电路组”队伍要公开全部家底1.1 从赛道边的熬夜到实验室的炸板疯狂电路组的来历队名叫 soberup中文意思是“清醒过来”但整个赛季我们做的事和这个词基本无关。实验室的常态是凌晨三点有人在测 Buck 电感的温升有人在用示波器抓 IR2110 高端驱动的自举波形还有人一边改摄像头排线一边骂赛道上那两块减速带。“疯狂电路组”不是官方组别名。我们学校车队的组织架构按赛道组划分但队内又按职能拆了机械、电控、电路三摊。电路组负责的范围很贪心整车的电源树、传感器信号调理、电机驱动、可靠性保护电路、调试通信全都要沾手。于是我们就自嘲为疯狂电路组因为别的组可能等代码等设计我们每天等的是“别炸板”。这个背景和开源直接相关。赛季中期我们踩了很多坑但几乎没有系统的参考资料。B站和论坛上的开源项目大多是 18、19 届的芯片型号老一代电路方案也比较传统。当时我就想着如果能把一整套 21 赛季实际跑通车的电路方案整理成开源项目至少下一届学弟学妹就不用再经历一遍“照着旧方案改电感参数改了三个晚上”的日子。1.2 开源目录里到底放了什么这次开源除了代码仓还有完整的硬件工程和文档索引整体分五块hardware/原理图和 PCB 工程文件以及关键模块的 BOM 表。我用的是立创EDA专业版工程同时导出了 PDF 原理图和 Gerber 光绘文件方便没有安装 EDA 工具的同学直接看图。firmware/嵌入式软件工程分了driver/、algorithm/、task/三个目录。driver 里是外设驱动比如摄像头 DCMI 采集、PWM 输出、编码器接口、陀螺仪 SPI 读取algorithm 里是PID控制器、图像处理、动态阈值二值化task 里是调度逻辑。host/PC 上位机源码主要负责实时显示摄像头画面、赛道偏差曲线、陀螺仪角速度波形。后期调车我们大部分时间都在看这个上位机。doc/电路设计笔记、调试日志、赛场突发问题记录。这部分是我个人觉得最有价值的很多坑的完整排查链路都写在里面。config/整车参数配置包括 PID 初始增益、赛道元素阈值、供电电压标定值每个参数后面都写了修改理由。开源目录的定位不是“给你一个能直接跑飞车的完整成品”而是“给你一套可复现的硬件方案和一整套调试方法论”。车这个东西每个队的机械结构、轮胎摩擦、赛道材质都不一样直接抄 PID 不可能一样但电路基础方案和调试思路是可以直接继承的。1.3 你适合从这个开源里拿走什么如果你是新队员可以对电路完全没概念建议按doc/里的设计笔记配合hardware/的原理图看。这里每块电路都写了我为什么选这个拓扑、为什么定这个参数而不是只丢给你一张图。哪怕最后不用我们的板子这套分析思路也能帮你判断别人开源项目的质量。如果你是带队队长或者有一定经验的队员重点可以直接放在host/上位机和config/参数表里。我们花了大量时间做数据可视化有些问题只有看到波形才能定位。你从波形里发现“这里怎么有一个不该有的震荡”再回去翻硬件设计才知道是哪条地线惹的祸。如果你是纯软件方向的同学我希望你至少把hardware/里电源那一块看一眼。因为智能车最大的特点就是“嵌入式软件跑在脏电源上”电机一启动3.3V 上的纹波就能让你的陀螺仪数据多出好几度的漂移。不看电路软件调死都调不出来。2. 电源链路设计Buck、Boost与每一步抗干扰取舍2.1 为什么智能车电源几乎离不开Buck和Boost赛车上最稳定的能量来源只有动力电池组室内赛用 7.4V 两节锂电的情况比较多。但板卡需要的电压是 5V、3.3V摄像头可能需要 5V 或 2.8V运放要 5V 或者 3.3V 单电源驱动芯片有时又要 12V 做外部供电。这么多电压等级不可能每个都用线性稳压器去处理。线性稳压器的优点是输出纹波低、电路简单、价格便宜但它的效率在压差大的时候惨不忍睹。7.4V 降到 3.3V压差 4.1V即便是低压差 LDO在 200mA 电流下也有接近 0.8W 的功耗变成热量。车上空间就那么一点风扇都没有热到最后传感器都在温漂。而 Buck 电路是开关电源理想情况下没有线性区损耗用同步 Buck 拓扑效率做到 90% 以上很轻松。Boost 电路在我们的方案里主要用来做局部电压抬升比如把 5V 升到 12V 给无源蜂鸣器驱动、风扇和一些测试模块用。它不是整车功率主干但少了它有些外围模块就是起不来。除了这些还有一个容易被忽略的原因Buck 和 Boost 的输入范围宽能容忍电池在满电和欠压之间波动时保持输出稳定这一点对比赛稳定性的价值远大于那零点几伏的精度。2.2 Buck电路设计要点与纹波估算开源目录里的主 Buck 方案选用的是同步降压控制器方案不是集成模块。集成模块虽然省事但很难针对自己的负载特性去优化纹波。我们实际遇到一个典型问题电机堵转瞬间电池电压会拉低Buck 输入电压突变导致环路响应不过来3.3V 上出现一个 200mV 的掉坑单片机直接复位。解决这个问题的关键其实在输入电容。很多人只关注输出电容忽略了输入电容承担着高频开关电流的回流。我在输入侧并了一个 22μF 陶瓷电容和 100μF 铝电解电容的组合。陶瓷电容负责高频瞬态铝电解电容负责低频能量缓冲。加完之后堵转时输入电压的跌落明显变小复位问题消失。电感选值我用的是最常看的公式L (Vin - Vout) × Vout / (Vin × ΔI_L × fsw)其中 ΔI_L 取输出电流的 30%。假设输入 7.4V输出 5V开关频率 500kHz负载电流 1A那么 ΔI_L 0.3A算出来电感大概是 10.8μH我最终选了 10μH 的功率电感。输出纹波电压也可以用经典公式粗算ΔVout ≈ ΔI_L / (8 × fsw × Cout) ΔI_L × ESR_Cout所以输出电容我用了两颗 22μF 的 X5R 陶瓷电容并联顺带留了一个小的 0.1μF 高频去耦电容。注意 X5R 陶瓷电容在直流偏压下实际容值会下降比如 25V 耐压的 22μF 电容在 5V 偏压下可能只剩 60% 容量。选型时一定要看容压曲线不然计算值和实测值差很多。2.3 供电网络的抗干扰与防抖处理电源部分的“抗干扰”不只是加电容更关键的是地平面规划和滤波网络的摆放位置。我们的板卡是两层板虽然不像四层板那样有完整地平面但依然能通过“分区铺铜单点连接”做出比较干净的地。具体做法是把 Buck 电路的功率地、单片机数字地、模拟信号地分开然后在主控下方的某一点汇合。功率地上的高频开关电流和电机驱动回流不能流过 MCU 的地平面否则 ADC 采样和运放输出都会带上毛刺。这个不是玄学是电流总是走低阻抗路径如果路径穿过传感器地那传感器地就被污染了。“防抖电路”这个说法在热词里出现得挺多我们理解的防抖包含两层含义。第一是电气防抖供电线上串联磁珠配合 π 型滤波器抑制电机火花和舵机瞬态电流对传感器电源的干扰。第二是机械防抖摄像头支架和 IMU 安装位置之间用泡棉减震避免车过坡道和减速带时瞬间冲击影响图像稳定。这两个都得做只做硬件滤波处理不了低频机械振动。调试时最满意的改进是把摄像头供电单独拉了一路 LC 滤波。摄像头启动瞬间的电流尖峰会拉低共享的 5V 总线直接影响编码器供电导致左右轮测速毛刺。加了一个 10μH 电感加 100μF 电容的 LC 滤波后图像横条纹彻底消失测速毛刺也基本清零。实测效果比改软件滤波明显得多这算是我在电源设计上收获最大的一条经验。3. 传感器信号链路差分放大、运放经典电路与防抖3.1 信号调理是“电路组”的主场智能车上最需要电路组出力的地方其实是信号链路。摄像头数字输出还好但车模速度信号、陀螺仪模拟输出、以及部分辅助传感器信号都需要经过运放调理后才能进单片机 ADC。这部分电路看上去简单就是“放大-滤波-送ADC”但实际工程里每一步都有坑。比如运放的供电轨单电源运放输出不能到负如果信号是双极性的必须在输入端加一个直流偏置把信号抬到量程中间。我们在设计时把基准电压源设为 3.3V/2 1.65V所有单电源运放都以这个电压为虚拟地。偏置电路不是简单分压就行。如果用两个电阻分压出 1.65V然后直接接运放同相端电源噪声会直接进信号链路。我们的做法是用一个电压跟随器单独缓冲基准再接运放。跟随器输出阻抗低带载能力强而且隔离了分压电阻热噪声。开源目录里hardware/下专门有一个ref_bias.sch文件画的就是这个。3.2 差分放大电路与共模噪声的博弈赛场上常见的共模干扰有两个来源电机换相产生的宽频噪声、无线模块的地电势差。单端放大电路很容易把共模噪声一并放大所以差模信号必须用差分放大结构。我们用的标准差分电路长这样一个四电阻差分放大器增益由反馈电阻和输入电阻的比例决定Vout (Rf / Rin) × (V - V -)四颗电阻必须等差值配比否则共模抑制比 CM RR 会被电阻误差拉低。计算很简单但真正的坑在选电阻。我用的是 0.1% 精度的精密电阻普通 5% 贴片电阻在温差和焊接应力下桥臂失配会超过 2%共模抑制性能直接废掉。如果你实在没有精密电阻也可以用集成差分放大器芯片比如 AD620 或者 INA 系列它们的内部电阻已经做了激光校准。差分信号进入运放前我先接了一阶 RC 低通截止频率按实际信号带宽来定我们取 10kHz 左右。这个前置滤波不是为了好看而是避免高频共模噪声通过运放的非线性区混叠到低频段。不加这个滤波你会发现示波器上放大后的信号满是毛刺怎么换运放都没用。3.3 运放偏置、滤波与电气防抖开源doc/里我专门写了“运放11种经典电路”的学习笔记这不是标题党是真的把同相放大、反相放大、电压跟随、差分放大、加法器、积分器、有源滤波这些电路逐个搭出来、用信号发生器实测过。我的体会是同一个电路仿真里完美不代表实板完美。板上任何一根走线的寄生电感、寄生电容都会在 1MHz 以上频率改变运放的实际响应。以电压跟随器为例很多人以为把运放输出直接连反馈就行但在驱动长线时负载电容会引起输出震荡。我们用了一个低值串联电阻33Ω放在输出端把负载电容和运放输出隔开震荡立刻消失。电气防抖在信号链路上的体现也很有意思。摄像头行中断和场中断信号是数字信号理论上不需要滤波但实际排线长了以后电机噪声会耦合进来导致中断误触发。我在信号线上加了 22Ω 串联电阻加一小颗 33pF 电容到地构成一个截止频率大概 200MHz 的低通滤波既能滤掉高频干扰又不影响行信号上升沿。硬件上牺牲一点点边沿速率换来的是图像采集不再随机丢帧绝对值得。4. 驱动与系统可靠性IR2110半桥、图腾柱和看门狗4.1 电机驱动为什么选择IR2110半桥方案车模电机尤其是主驱电机瞬间电流可以从几安到十几安。普通集成电机驱动芯片输出能力有限炸芯片是家常便饭。所以我们的驱动板用了“MCU 栅极驱动芯片 大功率 MOSFET”的分立方案栅极驱动芯片选的是 IR2110。IR2110 是一款半桥驱动器可以同时驱动一个高边 MOSFET 和一个低边 MOSFET自带自举供电结构逻辑输入兼容 3.3V这对 STM32 来说很方便。我们用两个 IR2110 搭成一个全桥驱动有刷电机四个 N-MOSFET 构成 H 桥。为什么不直接用集成的全桥驱动器集成驱动芯片虽然板子小但散热差、电流上限低而且一旦烧毁往往整个芯片连逻辑部分一起报废。分立 MOSFET 方案的好处是驱动芯片坏了只需要换 IR2110功率管坏了只需要换 MOSFET而且可以按整车需求自由选择更大封装的管子。对于比赛这种高强度运行场景可维护性就是战斗力。4.2 图腾柱与自举电容那些坑IR2110 驱动高边 MOSFET 用的自举电容一定要认真选。自举电容负责在高端管导通时给上管栅极提供能量如果容量太小上管栅极电压维持不住管子会进入线性区发热量剧增。计算公式大概可以参考C_boot Qg / ΔVQg 是所选 MOSFET 的总栅极电荷ΔV 是允许的电压跌落一般取 0.5V 左右。我们用的 MOSFET 的 Qg 在 30nC 量级取 ΔV0.5V算出来需要至少 60nF我留了余量选了 100nF 低 ESR 陶瓷电容实际工作正常。另一个容易翻车的地方是图腾柱驱动。IR2110 本身自带驱动能力但如果你用的是不带驱动芯片的逻辑电平 MOSFET或者想直接用小 MOSFET 驱动大 MOSFET 的情况就需要用图腾柱结构。图腾柱就是两个互补的三极管或者 MOSFET一个拉电流一个灌电流共同组成推挽输出。MCU 引脚直接驱动大 MOS 的栅极由于栅极电容大上升沿会变缓开关损耗暴增。加了图腾柱以后上升沿从 400ns 缩短到 80ns开关损耗小了非常多。最痛苦的一个坑和死区有关。H 桥上下两个 MOS 管如果同时导通就是直通短路电流瞬间几百瓦地把管子打穿。IR2110 自身不生成死区时间必须在程序 PWM 里设置互补带死区输出。我们早期在代码里只设置了 100ns 死区结果换了一个栅极电荷更大的 MOS 管后关断时间变长实际死区不够又烧了两片管。后来直接在定时器里配置了 500ns 死区同时把驱动芯片的输入波形在示波器上看了确认无交叠才算稳定。4.3 看门狗、复位与485调试电路让系统更耐跑跑场地时最怕的不是算法写错而是系统跑到一半“莫名其妙”进入死循环。智能车赛道路况复杂静电、干扰、电源瞬态都可能让单片机跑飞。我们的兜底方案是硬件看门狗加复位芯片双组合。STM32 的独立看门狗IWDG用内部 LSI 时钟时钟频率约 40kHz。它的超时时间大约可以算T (预分频系数 × 重装载值) / 40000预分频系数取 64重装载值取 625超时就是 1 秒。我们在主循环里喂狗同时把喂狗放在任务调度的最低优先级意味着如果低优先级任务能跑说明系统大体没卡死如果卡在高优先级中断里太久看门狗超时复位车自动重启。这里要特别提醒看门狗复位之后车立马上赛道如果没有妥善处理“复位后初始状态”车会在原地转圈。我们的做法是复位后先强制停车 200ms同时重新读取赛道信息等图像稳定后再启动。复位电路方面我们用了类似 MAX809 的上电复位芯片它在 VDD 上升到阈值前保持复位防止上电瞬间程序乱飞。有些同学直接用 10μF 电容加电阻做 RC 复位省成本但电源上升斜率慢时会出问题芯片复位不彻底。485 电路则是调试阶段的生命线。我们用 SP3485 做了一路 RS-485 接口通过 USB-485 转换器连电脑上位机实时传送图像和传感器数据。485 用差分信号传输抗干扰能力比 UART TTL 电平强很多。硬件上注意 A/B 两根线要加 120Ω 终端电阻A 线上拉 1kΩ 到 3.3VB 线下拉 1kΩ 到 GND这样总线空闲时状态确定不会乱帧。无源蜂鸣器驱动电路也在开源目录里。小蜂鸣器直接用三极管驱动就行但续流二极管一定要加否则关断瞬间的反向电动势会击穿三极管基极。我们驱动频率选择 4kHz效果比默认的 2kHz 更响。5. 电路与代码的交点PID输出角速度与摄像头循迹5.1 为什么我要输出“角速度”而不是PWM很多人写转向环外环拿摄像头偏差算出一个 PWM 直接给舵机这叫位置式单环。我们第二年改成了串级结构外环用图像偏差计算“期望角速度”内环再用陀螺仪实时角速度做反馈输出 PWM 给舵机。为什么输出角速度因为直接算 PWM 有一个问题同一份 PWM车速不同时转向角速度完全不同。低速时 50% PWM 可能只转 10°/s高速时可能转 30°/s。如果外环期望的是角速度那么内环就会自动补偿车速带来的变化整车转向特性更接近线性。内环频率要足够高。我们控制周期 1ms陀螺仪数据用 SPI 读取经过零漂校准和低通滤波后计算的角速度非常平滑。外环频率 20ms因为摄像头采集一帧图像加处理的时间在 10~20ms跑低频没有问题。这个结构在直道入弯和弯道出坡时表现尤其稳不会出现“同一个偏差值时灵时不灵”的情况。5.2 摄像头信号与单片机的中断配合摄像头组里硬件和软件的交界线就在信号同步那里。我们用的数字灰度摄像头输出场中断、行中断、像素时钟和 8bit 数据。主控用 DCMI 接口采集但行中断需要注意时序。电路设计上摄像头排线要短数据线尽量等长并且用接插件固定不然车震动时会传输错误数据。我额外加了一路施密特触发器对场中断信号整形避免长线上沿不陡导致中断触发抖动。前期没有这个整形图像偶尔会上下跳动换了施密特缓冲器之后一场比赛跑下来再也没有出现图像撕裂。图像数据处理方面我们做了动态阈值二值化而不是固定阈值。因为赛道在不同灯光下平均灰度差很大固定阈值会在过暗时把赛道和背景混在一起。二值化后提取每一行赛道边界和中心线偏差这个偏差就是外环 PID 的输入。5.3 联合调试中的几个真实翻车点联调时最经典的翻车是软件显示偏差巨大但实际车走得很正。看着上位机控方向盘跟踪最终发现是摄像头安装角度偏了机械基准和图像中心差了两个像素软件再怎么调 PID 都没用。另一个翻车点在内环参数。角速度环的 P 太大时车会走蛇形P 太小时转向响应慢入弯推头。尤其换新轮胎后同样的参数手感完全不同。我写了一个简单脚本在调试模式下给舵机一个阶跃角速度指令记录车模实际角速度响应曲线从曲线上读延迟和超调代替“盲调”。还有一个我特别想强调的编码器测速受电源干扰时会跳动带着跳动会让速度环产生高频振荡。我们后来给编码器供电加了电感滤波再用 10ms 窗口求平均轮速数据才终于平滑。这个问题的排查链路是速度环啸叫 - 看速度波形有毛刺 - 用示波器抓编码器 VCC 有 50mV 纹波 - 加 LC 滤波 - 解决。所以遇到软件行为异常第一件事永远是查电源不是查代码。6. 开源目录的打开方式复现、避坑与扩展6.1 目录结构与文件对应关系整理开源目录时我费了很大劲才把文档和工程文件对应清楚。如果你下载下来后觉得“文件好多不知道从哪开始”可以参考我的阅读顺序。第一步看doc/00_start_here.md这是一篇 2000 字左右的导读把整车架构、供电树、信号流和数据流画成了表格说明。第二步看hardware/block_diagram.pdf这是我手画的整板模块划分图里面有每一块电路之间的电气连接关系。第三步对照hardware/BOM.csv核对元器件。我在 BOM 里写了替代料列表比如某颗电阻可以用哪个封装的相近阻值替代。第四步打开firmware/README.md里面写清楚了每个外设驱动的初始化和接线引脚对应关系。必须承认我们的工程不是一尘不染的整齐代码。firmware 里有些驱动文件是赛季中改的注释不全但 README 里记录了每个文件的“最后一次修改原因”。比如有一行写着“ov7725.c最后改动解决行中断抖动加入边沿滤波”这就是一条很好的索引线索。6.2 复现时必须注意的元器件与布局细节复现我们的硬件时最不建议做的就是“随手换料”。原理图里有些电阻值是经过波形实测确定的比如运放反馈电阻 10k 搭配输入电阻 4.7k看着像随便取值但这是把带宽、噪声、稳定性综合考虑后的结果。你换成 100k 和 47k放大倍数一样但运放输入偏置电流带来的失调会变大输出零点可能偏到 ADC 量程外面。布局方面建议严格参考我们的 PCB 工程。我在关键位置做了丝印注释比如“功率地单点连接点”、“自举电容靠近芯片”这些不是装饰。两层板下如果不按这个布局寄生电感会让开关节点产生振铃轻则噪声大重则在坏温度下打坏驱动芯片。焊接顺序也有讲究。先焊电源部分确认 Buck 输出正常再焊主控再焊驱动。千万别一次性全焊完再上电否则短路都不知道是哪个模块烧的。团队后勤把“分模块上电”写进了实验规范后面的故障排查效率高了很多。6.3 下一届可以继续做深的方向开源不是终点。我们留下的这套目录只代表 21 赛季的一种最优解很多方向还有明显的提升空间。首先是电源效率。我们的 Buck 方案用了同步降压控制器但还有进一步提升的空间比如负载点电源设计把 3.3V 分成数字 3.3V 和模拟 3.3V中间用磁珠隔离能进一步降低 ADC 噪声。其次是驱动电路的智能保护。我们现在只有硬件过流保护没有实时的电流闭环。下一届可以考虑在 MOSFET 源极加采样电阻用运放放大后送 ADC软件做限流。这样电机堵转时不会硬顶而是自动降功率。然后是 485 调试链路可以做无线化。虽然没有必要把整车数据无线化但在现场调车时一根调试线绕着赛道走真的很痛苦。用常见无线模块转发 485 数据或者直接走无线串口会舒服很多。最后是控制算法层面。现在串级 PID 已经很稳定但未来可以引入模型预测或者模糊自适应参数。前提是先对车的动力学模型做离线辨识不然一堆高级算法不如把内环带宽调到位更有效。整理开源目录本身也让我重新看了一遍自己画的每一张原理图、写的每一段驱动。有些当时靠“试出来”的参数这回通过计算和推导终于理解了为什么会是这个值。这就是开源最大的收获不只是给别人看更是逼着自己把闭环过程想明白。如果你也正在打智能车或者准备在未来做一个开源硬件项目我特别建议一边做项目一边写文档不要等到比赛结束再补。当时的直觉、波形和翻车原因过两个月回头看已经模糊了大半而记录下来的那部分才是真正能被下一支 soberup 继承的财富。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表