尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RoboMaster硬件基础:从6S电池、CAN总线到主控最小系统

RoboMaster硬件基础:从6S电池、CAN总线到主控最小系统 RoboMaster 队伍里有个很经典的现象代码跑不通的时候大家第一反应是翻控制算法翻完 PID 再翻状态机最后发现是底盘上一根 CAN 线松了或者电池插头氧化得只剩半个接触面。我前后带过几届队伍踩过的硬件坑比软件坑多得多而这些东西在官方文档里往往只有一句话带过。这份硬件基础讲义想讲的就是这些文档里不提、但赛场上致命的部分——从一块 6S 电池的能量链路到 CAN 总线的终端电阻到主控最小系统的上电时序再到布线与接地的隐性故障源。不管你是刚进队的新人还是已经能画板子的老队员这里的内容都能当作一份上电前的对照清单来用。V0.2.1 这个版本号我特意保留着因为硬件讲义本身就是一份不断打补丁的活文档每一版都对应着一次真实的炸板或者一次莫名其妙的丢帧。1. 从一块电池说起整车能量链路怎么走1.1 6S 动力电池的电压窗口和内阻账RoboMaster 的整车能量几乎都来自一块 6S 锂聚合物电池。标称电压 22.2V满电 25.2V单芯 4.2V放电截止一般设在 19.8V单芯 3.3V。这三个数字不是随便记的它们决定了你整车上所有 DC-DC 的工作范围。比如你选了一颗输入范围 7~24V 的降压模块满电 25.2V 一插上去就直接超压运气好是保护运气不好就是冒烟。更麻烦的是内阻带来的动态压降。一块状态健康的 6S 10000mAh 电池整体内阻大概在 6~12mΩ 之间用久了会涨到 20mΩ 以上。假设底盘四轮同时加速瞬时母线电流拉到 100A那么 15mΩ 的内阻就会带来 1.5V 的压降母线瞬间从 24V 掉到 22.5V 以下如果电池老化到 30mΩ压降就是 3V此时你那颗输入下限 20V 的模块就会开始不稳定输出表现是主控随机复位、图传闪烁。很多人以为是干扰问题其实是电池内阻问题。我的做法是给每块电池建一张简单的体检表编号、购入时间、循环次数、满电静置后的单体压差、大电流负载下的母线跌落到多少。单体压差超过 50mV 的电池就不要放在关键位置用了扔给地面测试台当耗材。测内阻不需要专业设备用一个固定阻值的大功率电阻做负载记录空载和带载时的电压差除以电流就是近似内阻误差足够做趋势判断。注意锂聚合物电池鼓包、外皮破损、插头处有焦痕的无论容量还剩多少一律退役。训练场冒烟和赛场上冒烟是两码事。1.2 XT60 之后的每一级接触电阻都算在总账里从电池插头到分电板中间可能经过 XT60 插头、航模插头转接、分电板的输入焊盘、保险丝座、开关。每一个环节都贡献接触电阻典型值在 0.5~2mΩ插拔几百次之后镀层磨损加上氧化涨到 5mΩ 也不稀奇。听起来微不足道但把它们串起来算电池插头 2mΩ 转接 3mΩ 分电板焊点 1mΩ 保险丝座 3mΩ 9mΩ。在 100A 的瞬时电流下就是 0.9V 的额外压降全部转换成热量堆在你的插头和保险丝座上。实际排查时我会用最笨但最有效的办法上电跑一段大电流动作然后立刻用手背不是手指靠近插头和保险丝座感受温度。局部明显发热的位置就是接触电阻大户。红外测温枪更好但手背在紧急情况下也够用。提示接触电阻的排查顺序按从电池到用电设备走越靠前的环节承载电流越大单位电阻的代价也越高。1.3 电压分层与功率预算表整车电压通常分成四层分层的意义是把大电流路径和小信号路径彻底隔开电压层典型来源主要负载设计要点24V 直供电池母线底盘电机驱动器、云台电机线径最粗走线最短避开信号线12V降压模块图传、部分工业传感器注意模块的动态响应和纹波5V降压模块或 BEC主控板、舵机、激光舵机堵转电流要单独核算3.3V板载 LDO 或 DC-DCMCU 内核、IMU、编码器与数字噪声隔离靠近负载放置分层之后一定要做功率预算。把所有负载的额定电流和峰值电流列出来按电压层汇总再乘 1.3~1.5 的安全系数这才是你选降压模块的依据。教材上常见的错误是用 LDO 从 24V 降到 5V此时 LDO 上消耗的功率是24-5× 负载电流带 1A 就是 19W一颗 TO-220 封装根本扛不住几秒钟就能闻到味道。压差超过 3V 的场合老老实实上同步整流的 DC-DC 降压模块。选模块时我看三个参数输入范围要覆盖 19.8~25.2V 全窗口并留余量额定输出电流要大于你的峰值负载纹波在满载下最好低于 50mV。第三个参数最容易被忽略但纹波大的模块会让你的 ADC 采样抖动、IMU 数据发飘。2. 电机与驱动器CAN 总线才是电控的骨架2.1 M3508、M2006、GM6020 各自该待在哪RoboMaster 生态里最常见的三类电机选型逻辑其实是扭矩密度和响应速度的取舍型号配套驱动器减速比特点典型位置M3508C620约 1:19扭矩大、转速中等底盘麦轮/全向轮、发射机构M2006C610约 1:36体积小、扭矩小拨弹盘、小行程机构GM6020内置驱动直驱响应快、精度高、可当舵机用云台偏航/俯仰底盘要的是把电池功率高效地变成地面推力所以选大扭矩低转速的 M3508云台要的是毫秒级的姿态跟随减速箱的间隙会直接变成控制上的死区所以要用直驱的 GM6020拨弹这种只需要稳定输出小扭矩的机构用 M2006 就够省重量也省电流。一个容易被忽略的点是减速箱的回程间隙。M3508 在换向的瞬间角度反馈会有零点几度的空走如果你的控制环带宽拉得很高这个间隙会直接引发高频振荡。我的经验是把速度环的输出限幅收紧一点同时在换向附近做一段小幅度的死区补偿实测能明显压掉那种哒哒哒的抖动声。2.2 CAN 物理层120Ω 终端电阻和线序CAN 是差分总线靠 CANH 和 CANL 之间的电压差传数据天生抗共模干扰但它的物理层有两个硬约束第一1Mbps 波特率下总线总长度不能任性拉长整车走线尽量控制在几米以内并保持主干笔直第二总线的两端各需要一个 120Ω 终端电阻中间的节点绝对不能加。我在赛场上见过最多的 CAN 故障就是终端电阻的问题。有人图省事只在主控板上装了一个电阻有人把每个电机的驱动器都当成终端结果总线上挂了四五个 120Ω。两种情况的表现都是随机丢帧电机偶尔响应、偶尔不响应重启又好一阵非常容易误判成代码里的 ID 冲突或者发送周期问题。排查方法很直接断电后用万用表测 CANH 与 CANL 之间的电阻正常应该是 60Ω两个 120Ω 并联。如果读到 120Ω说明只有一端有终端如果读到 40Ω 甚至更低说明挂了多余的终端如果读到开路说明线断了或者接插件没插好。还有一个细节是线材。双绞线能把差分信号绑在一起让外部干扰以共模形式进入、在接收端被抵消普通平行排线做不到这一点。屏蔽层如果要用记住只在一端接地两端都接会形成地环路反而变成天线。2.3 控制帧与反馈帧的解析细节DJI 这套电机的 CAN 协议控制帧用的是 0x200 和 0x1FF 这类标识符一帧里打包四个电机的电流值每个是 16 位有符号整数数值范围 -16384 到 16384 线性对应 -20A 到 20A。反馈帧是 0x201 到 0x204 这种每个电机一帧8 个字节里塞了转子机械角度、转速、实际转矩电流和温度。解析代码写错的地方集中在位拼接和符号扩展上。下面这段是常见的反馈帧解析写法typedef struct { uint16_t angle; // 机械角度 0~8191 对应 0~360 度 int16_t speed; // 转速 rpm int16_t current; // 实际转矩电流 uint8_t temp; // 温度 摄氏度 } motor_feedback_t; void parse_can_feedback(const uint8_t *data, motor_feedback_t *out) { out-angle (uint16_t)((data[0] 8) | data[1]); out-speed (int16_t)((data[2] 8) | data[3]); // 必须转成有符号 out-current (int16_t)((data[4] 8) | data[5]); out-temp data[6]; }speed和current一定要转成有符号否则负转速会变成一个巨大的正数你的速度环会瞬间输出满电流电机直接冲出去。角度用的是 0~8191 的单圈编码值要得到连续多圈角度得自己维护累计量比较本次和上次的差值跳变超过一半量程就判定为跨圈加或减一圈。注意多圈累计的角度变量在电机断电重启后会归零上位机的姿态解算如果依赖这个角度做绝对定位一定要在上电时先找机械限位做原点复位。3. 主控与最小系统从选板到引脚分配3.1 开发板选型官方板、量产板还是自绘板入门阶段用官方的开发板是最省事的接口、电源、调试器都现成你只需要专注在 CAN 收发和串口调试上。等队伍开始追求装机密度、走线整齐和成本控制就会走到自绘板这一步。自绘板的收益是布局可控、接口可定制、重量和体积能压缩代价是你得自己承担所有的硬件风险包括电源设计、晶振布局、CAN 收发器选型和阻抗匹配。我的建议是先在官方板上跑通全部功能形成一份稳定的引脚分配表再把这套分配原封不动地搬到自绘板上这样出问题时至少能确定软件是好的。3.2 最小系统必须搞定的四件事任何一块 MCU 板子能不能跑起来就看四件事供电、复位、时钟、下载。供电部分3.3V 这一路要干净。每一对电源引脚旁边放一个 100nF 的陶瓷去耦电容位置尽量贴着引脚走线尽量短因为去耦电容的作用就是把高频噪声就近短路到地线一长寄生电感就把效果吃掉了。整板再放一到两个 10μF 的储能电容兜底。复位部分复位引脚不要悬空加一个上拉电阻和一个对地的电容避免上电瞬间的抖动导致 MCU 反复复位。如果复位引脚引到了外部按键或调试接口记得加 RC 滤波否则一根长线引过来的干扰就够你查半天。时钟部分如果用了外部晶振负载电容的取值要对着晶振规格书来一般是 12pF 到 22pF 之间取大了起振慢、取小了频偏。晶振的走线要尽量短、尽量靠近芯片、下方不要走高速信号线最好有一块完整的地平面做参考。下载部分SWD 接口的 SWCLK 和 SWDIO 线尽量短必要时串一个小电阻抑制振铃。BOOT 引脚的上下拉电阻别省略否则你可能怎么都进不了下载模式还以为是芯片坏了。3.3 引脚分配表提前把冲突记下来引脚分配这件事我建议在动焊之前先在表格里排完因为 STM32 这类芯片的外设复用关系非常密集CAN、UART、SPI、定时器通道经常抢同一组引脚。功能外设引脚备注底盘 CANCAN1PA11/PA121Mbps走线最短云台 CANCAN2PB12/PB13与 CAN1 共用滤波器组遥控接收UART3PB10/PB11注意电平匹配IMUSPI1PA5/PA6/PA7时钟线尽量短调试串口UART1PA9/PA10一定要预留蜂鸣器TIM 通道PB0用于状态提示这张表最下面那行调试串口看起来最没用实际上最重要。没有调试串口你只能靠 LED 闪灯数次数来定位问题效率会低到让人崩溃。另外要注意 CAN1 和 CAN2 共享滤波器资源用的时候要把 CAN2 的起始滤波器编号配置对否则会出现CAN1 收得到、CAN2 收不到这种诡异现象。4. 传感器与信号链把物理量变成可信数据4.1 IMU 的硬件前提比算法更重要姿态解算的精度七成取决于 IMU 的硬件状态三成才是算法。三个硬件要点量程、安装刚性、零偏标定。量程要按实际工况选。云台电机的角速度在快速甩头时能到每秒几百度的量级如果陀螺仪量程只开到 500dps一甩头就饱和数据直接截顶后面的解算全乱。加速度计量程也是同理底盘经过减速带时的冲击加速度不小量程太窄同样是截顶。安装刚性是最容易吃亏的地方。有人为了让 IMU 少受震动在下面垫了很软的减震棉结果 IMU 和机架之间产生了一个低频的机械谐振姿态数据里多出一段几十赫兹的抖动滤波器怎么调都调不干净。正确做法是用刚度足够高的方式固定例如直接锁在结构件上或者用中等硬度的减震垫并确保 IMU 与云台之间没有额外的自由度。零偏标定必须在整机上电、静止的状态下做标定期间不能有任何震动和温漂干扰。零偏会随温度变化所以最好做一次温度补偿曲线把整机放在不同温度环境下静置记录零偏随温度的变化运行时按当前温度插值补偿。4.2 编码器、限位开关和光电门的接线细节这类开关量传感器的故障几乎都出在电气细节上。机械限位开关接 MCU 输入时一定要有上拉或下拉电阻确定默认电平悬空的输入引脚会随环境噪声乱跳。走线超过十几厘米的再加一个 100nF 的对地电容做硬件去抖。软件去抖也别省。典型的机械开关抖动时间是 5~20ms我在初始化阶段会连续采样几十次确认稳定状态运行中再做几次一致性校验避免单次误触发把机构送进限位。光电门用于拨弹盘计数或者发射机构检测时注意它的输出类型是集电极开路还是推挽前者需要外接上拉电阻。另外光电门对灰尘和强光敏感装在拨弹盘旁边的时候要定期清理赛前一定要擦一遍。4.3 模拟采样的三个关键分压、滤波、基准电池电压检测是最典型的模拟采样场景。以 25.2V 满电为例MCU 的 ADC 参考电压是 3.3V那么分压比至少要大于 25.2/3.3 ≈ 7.6取 1:11 比较稳妥这样满电时采样点电压是 25.2/11 ≈ 2.29V留足了余量。电阻选取要注意两点阻值不能太大否则 ADC 采样电容充电时间不够读数偏低也不能太小否则长期挂在电池上会持续耗电。上臂取 100kΩ、下臂取 10kΩ 是比较常用的组合静态电流约 0.23mA可以接受。分压点后面并一个 100nF 电容到地和上臂电阻构成低通滤波。ADC 基准电压的稳定性直接决定测量精度。用 MCU 内部的 VDD 做基准的话VDD 本身的波动会全部体现在读数里所以要么用外部基准芯片要么在软件里用内部参考电压通道反算实际 VDD做一次比值补偿。采样软件上我习惯做中值滤波加滑动平均先采 9 次取中值剔除野点再对最近若干次结果做平均读数又稳又不迟钝。5. 布线、接地与抗干扰看不见的故障源5.1 线径和长度是要算的不是凭感觉挑的导线有电阻电阻乘以电流就是压降压降乘以电流就是发热。粗略估算时可以用铜的电阻率 0.0175 Ω·mm²/m走线和回线都要算上公式是ΔU 2 × 0.0175 × L × I / S其中 L 是单程长度米I 是电流安培S 是导体截面积平方毫米。举个例子一根 1.5m 长的线要走 20A允许压降 0.5V那么需要的截面积是 2 × 0.0175 × 1.5 × 20 / 0.5 2.1 mm²约合 AWG 14 到 AWG 13 之间的线。如果你手上只有 0.75mm² 的线压降会接近 1.4V同时线自身要消耗 28W 的功率很快就会烫手甚至熔皮。截面积 (mm²)近似 AWG常见用途0.224信号线、传感器0.520小功率外设、舵机0.7518图传、中等功率模块1.516单电机供电支路4.011电池主回路、分电板输入实际布线时还有两个经验值大电流线的长度尽量短能省一半长度就省一半因为压降和发热都跟长度成正比信号线和大电流线不要平行长距离走如果非要交叉尽量垂直交叉。5.2 接地拓扑星形还是就近接地整车地线处理的核心原则是大电流回流路径不要穿过小信号区域。底盘电机的几十安培电流如果从主控板的地平面上流回去主控的参考地会随着电流波动而波动表现是 ADC 读数跳动、CAN 偶尔出错。我采用的做法是单点星形接地分电板设一个主接地点电池负极、各电机驱动器负极、各降压模块输入负极全部汇到这个点降压模块的输出侧地再单独汇总到主控附近的一个信号接地点两个接地点之间只通过一条粗线连接不形成多个回路。屏蔽线的处理也是同一个逻辑。屏蔽层的作用是把耦合进来的干扰导走如果两端都接地屏蔽层本身就成了一个环路反而会感应电流。所以我只在主控这一端接地另一端悬空或者通过一个小电容接地。5.3 连接器选型和防呆设计连接器选错是看起来很蠢但很常见的坑尤其是在振动环境下连接器载流能力特点适用场景XT60大防呆、插拔力强电池主回路XT30中体积小模块级供电MR30中三芯、带锁扣感电机支路XH2.54小有卡扣、便宜传感器、风扇GH1.25小带锁扣、抗震好板间连接、信号带锁扣的连接器在振动环境里的价值非常高。我在赛场上见过因为用了不带锁扣的杜邦线跑了几圈之后整排线松脱主控直接失联。凡是会在颠簸中运动的部位一律用带锁扣的连接器插好之后再点一点热熔胶做二次固定同时把线束用扎带在结构件上做应变消除让拉力作用在扎带上而不是焊盘上。6. 上电测试与讲义迭代把事故挡在赛场外6.1 上电前的万用表自查清单新板子或者大改之后的第一次上电我固定走这套检查目视检查焊点有没有连锡、虚焊、锡珠尤其是芯片引脚密集的区域万用表二极管档测电源输入到地是否短路正常应该读到几百欧以上的阻值或者二极管压降测各电压输出对地是否短路尤其是 5V 和 3.3V 这两路测 CANH 与 CANL 之间的电阻确认是 60Ω 左右确认所有连接器的方向和针脚定义对照图纸一根一根数不要凭印象。第二步和第三步是最省时间的。我见过一次因为一颗锡珠导致 3.3V 对地短路上电瞬间烧掉了整颗主控芯片那颗锡珠在放大镜下才看得出来。万用表测一下只要十秒。6.2 分阶段上电限流电源是救命的东西有条件的队伍一定要配一台可调限流电源。第一次上电时把电压设到额定值、电流限制设到很小的值比如 200mA观察几件事电源有没有立刻进入限流状态、有没有明显的温升、电流是不是维持在合理的静态值。如果一上电就冲到限流值说明有短路立刻断电排查此时因为电流被限制住了器件一般不会被烧穿。限流通过之后把电流上限逐步放开同时观察静态电流。静态电流明显偏大通常意味着某个器件在漏电或者某个模块在异常工作。等所有静态电流都正常了再插电池上电。注意调试阶段不要用大容量电池直接给新板子供电限流电源能救回很多本来会被烧掉的板子。6.3 常见故障速查表现象高概率原因排查方向主控随机复位母线压降大、电池内阻高带载测母线电压、查电池健康度电机偶发不响应CAN 终端电阻异常断电测 CANH-CANL 电阻IMU 数据持续抖动安装刚性不足或量程饱和检查固定方式、看原始数据是否截顶ADC 读数跳动参考电压不稳或滤波不足检查基准、增加中值滤波某个模块不工作供电不足、线径过细单独测该模块输入电压通信偶发错误信号线与动力线并行走线分离走线、检查屏蔽层接地6.4 版本号的意义为什么值得记 V0.2.1把讲义标上版本号看上去有点形式主义但对队伍来说很实用。V0.1 是最初的骨架只有器件清单和大致接线V0.1.x 这些小版本通常是在补具体的坑比如某次炸板之后加进去的限流电源必须使用某次丢帧之后加进去的CAN 终端电阻测量方法。V0.2 则往往对应一次结构性的调整比如电压分层从三层改成四层或者把底盘和云台的接地方案彻底重做。V0.2.1 这种小版本号记录的是在上一个结构版本基础上打的补丁。它值钱的地方在于当你第二年重新捡起这份文档时能顺着版本历史看到每一次事故的来龙去脉而不是面对一堆不知从哪来的规则。我带队的时候有个硬性要求任何一次赛场故障无论大小复盘之后必须在讲义里加一条并且提升一个小版本号。一个赛季下来这份讲义会变成队伍最值钱的东西比任何一次比赛的奖状都耐用。如果你现在手上正好有一块刚焊好的板子我建议先别急着上电把第 6.1 节那份清单打印出来一项一项勾完再说。这个动作我做了很多次每次都能勾出点东西来而每勾出一个就少一次炸板和一次赛场上手忙脚乱的机会。
返回列表