RM2025超级电容模组 Plus「使用手册」
本文是给电控写的,不会提及太多技术细节。
本文参考的制作规范与规则手册均为2024年12月25日的1.1.0版本。
声明
感谢您对本战队开源的超级电容模组的借鉴。在使用之前,请务必确保自身有足够的技术水平能够解决基础问题,一旦使用,即视为您的技术水平能够确保您所复刻的超级电容模组与本开源一致。若您对本开源进行了更改,造成的后果与损失与作者无关,作者只能保证本项目的所有源文件的有效性。
本文仅对作者在2025赛季中开源的超级电容控制板Plus进行使用说明,请勿将本文的内容套到其他队伍开源的超级电容模组上,也请不要以其他队伍的开源套到本超级电容控制板Plus上。
超级电容控制板Plus如果不按照本文的说明进行使用,性能无法得到保证,且因此产生的后果与作者无关。
简介
超级电容控制板PLUS采用STM32G431芯片作为主控,采用升压/降压作为功率拓扑,使用PI控制器对环路进行控制。软件、硬件方面拥有多重保护机制,确保超级电容运行的稳定性。搭配7串3V60F超级电容组可以获得较高的能量利用率。
相较于Lite版本,Plus增加了硬件保护电路,可以一定程度上避免因为超级电容烧毁导致的【通道0超载】现象。
超级电容组采用Hcccap的3V60F超级电容串联7个组成标称1890J的超级电容组,均衡板与电容组使用WingTAT连接器-金手指卡进行连接,目前搭配的均衡板为BW6103芯片制作的被动均衡板。
超级电容模组是RoboMaster机甲大师超级对抗赛中规则允许参赛队伍自制的用于给底盘提供额外能量的装置,其作用主要是为底盘的运动提供超出【底盘功率上限】部分的能量,从而避免【底盘功率超限】导致【缓冲能量】耗尽引发底盘断电。
说明
【底盘功率上限】:为规则中对机器人定义的一个性能指标,其根据机器人类型的不同拥有不同的数值,并且能够随着机器人等级的提升而提高。
【底盘功率超限】:裁判系统电源管理模块会实时检测【Chassis功率】,假若【Chassis功率】超出了【底盘功率上限】,即为【底盘功率超限】。根据超出的功率大小,以10Hz的频率对【缓冲能量】进行消耗结算,若【缓冲能量】消耗殆尽,则裁判系统将会对机器人底盘进行断电。
【Chassis功率】:Chassis是裁判系统电源管理模块对底盘进行供电的端口,其供电功率为【Chassis功率】。
【缓冲能量】:规则中对机器人【底盘功率超限】的一种保护机制,避免参赛队伍功率控制不当产生的瞬时的【底盘功率超限】造成底盘的错误断电,提供一个容错机会。
能量与功率不是一个东西,能量(Energy)的单位是焦耳(Joule),功率(Power)的单位是瓦特(Watt),他们之间的关系为 。能量是一个"总量",功率表示单位时间消耗的能量的"速度",以恒定的功率 P 运行 t 秒的时间,就会消耗 焦耳的能量 E。
60J 的缓冲能量,不代表可以超出【底盘功率上限】60W 去使用,还要关系到能够"超功率"的时间。超10W可以用6s,超60W可以用1s。
在2025赛季中,裁判系统删除了【Chassis功率】的反馈,要求参赛队伍自行检测功率用于功率闭环,提高了参赛队伍对功率控制的要求。我了解到一些队伍使用一种"基于缓冲能量的功率控制算法",尽量去消耗缓冲能量以提高底盘使用功率。以往缓冲能量消耗殆尽只是会扣血,而2025赛季改为了底盘断电,“基于缓冲能量的功率控制算法"的容错率大幅降低,所以我不建议使用这种算法来进行底盘功率控制。
听说往年的比赛出现过不少裁判系统数据延迟的情况,过度依赖裁判系统也不太好。以上为未装备超级电容模组而进行的分析。
对于本文,另外做以下几个定义:
【充电功率】:超级电容控制板PLUS从电源管理模块Chassis接口对超级电容组进行充电所消耗的功率。在没有无线充电的情况下,此功率计入【Chassis功率】,受到【底盘功率上限】的影响。
【放电功率】:超级电容控制板Plus将超级电容组内存储的能量释放到Chassis上的功率,其数值不会计入【Chassis功率】,不受【底盘功率上限】的影响,受到超级电容组存储的能量,超级电容模组的性能所限制。
【电机功率】:底盘运动的时候,电机所消耗的功率,由电控进行控制。
【放电功率】是不能直接控制的,他是自动分配的结果。超级电容控制板Plus会实时检测【Chassis功率】与【电机功率】,自动分配功率,使他们趋近于以下关系【Chassis功率】<=【底盘功率上限】,【放电功率】=【电机功率】-【Chassis功率】。
特性
使用1Mbps CAN总线进行通信;
CAN总线反馈频率可调,总线ID可调;
支持远端补偿,确保功率准确;
支持底盘功率反馈;
通过96位UID进行拟合参数与板子的匹配识别;
具有过温、过流、过压等多种保护机制;
规格
母线电压(Vbat)范围:20-35V(UVP可调);
电容组电压(Vcap)范围:1-21V;
最大瞬时电容电流:30A;
额定功率:150W@24Vbat,12Vcap,温升50℃ *;
额定效率:96%@额定功率下;
CAN总线比特率:1Mbps;
体积:75×45×25mm;
工作环境温度:0 至 40℃。
- 室温20℃,六面悬空,自然冷却。
连接

- 【裁判系统】电容管理模块PwrCtrl端口(XT30母头)–连接控制板Plus「电容」端口
- 【裁判系统】电容管理模块SuperCap端口(XT30公头)–连接电容组
- 控制板Plus「底盘」端口(XT30母头)–连接底盘电机所在的分电板
- 控制板Plus「电容补偿」端口(MMCX-KWE)–连接电容组「远端补偿」端口(选装)
- 控制板Plus「电容」端口(XT30公头)–连接【裁判系统】电容管理模块PwrCtrl端口
- 【裁判系统】电容管理模块RSVD端口,用于检录
- 超级电容控制板Plus
- 【裁判系统】电容管理模块
- 【裁判系统】电容管理模块通信接口(GH1.25-4PIN)-连接【裁判系统】电源管理模块
- 电容组NTC输出端口(MX1.25-2PIN)–连接控制板Plus「温控」端口(选装)
- 超级电容组
- 电容组「远端补偿」端口(SMA-KE)–连接控制板Plus「电容补偿」端口(选装)
- 控制板Plus「电池」端口(XT30公头)–连接【裁判系统】电源管理模块Chassis端口
- 控制板Plus「电容补偿」端口(MMCX-KWE)–连接远端补偿小板(选装)
- 控制板Plus「CAN」端口(GH1.25-2/4PIN)–连接C板CAN总线
- 控制板Plus「温控」端口(MX1.25-2PIN)–连接电容组NTC输出端口(选装)
- 控制板Plus「调试」端口(ZH1.5-4PIN)–UART与SWD接口
- 【裁判系统】电源管理模块Chassis端口(XT30母头),可选装远端补偿小板
- 【裁判系统】电源管理模块
为什么 [13] 叫「电池」端口呢?
首先,Chassis的中文翻译为"底盘”,而我想保持使用中文丝印的风格,这与底盘电机接口冲突。并且底盘给我的第一感觉是接电机那边的。
其次,在备赛期,绝大多数队伍是没有【裁判系统】电源管理模块的,这个时候,[13]端口就需要直接接入电池。
所以我觉得使用「电池」作为这个端口的名称非常合理。
指示灯描述
可以通过修改代码来修改指示灯的状态,以下是对源代码的默认状态进行的相关描述。状态指示灯会以表格中状态,优先级从上到下进行指示。
正常工作状态下,仅允许使用【电池】端口对超级电容组进行供电,超级电容控制板跟随底盘上下电。不允许在调试端口对其进行供电,否则会导致程序跳过上电初始化,从而爆炸💥。
| 状态 | 描述 |
|---|---|
| 全部熄灭 | 程序未运行。无匹配UID的ADC校准参数。 |
| 跑马灯 | 上电初始化 |
| 红、绿、蓝灯常亮 | 超级电容控制板Plus保险丝熔断(超载或者半桥爆炸),需换保险丝后,重新上电恢复。 |
| 红灯闪烁,绿、蓝灯交替闪烁 | 超级电容模组过温保护(100°C,5s),降温5秒后恢复。 |
| 红灯常亮,绿、蓝灯熄灭 | 母线欠压保护(20V,1s),更换供电电池后,重新上电恢复。 |
| 红灯闪烁,绿灯常亮、蓝灯闪烁 | 母线过流保护(30A,200ms);降低电流5秒后恢复。 |
| 红灯闪烁,绿灯熄灭、蓝灯闪烁 | 母线过压保护(35V,200ms);降低电压5秒后恢复。 |
| 红、绿、蓝灯同时闪烁 | CAN离线保护(1秒收不到CAN消息);1秒内收到10次CAN消息后恢复。 |
| 红灯闪烁,绿灯闪烁,蓝灯熄灭 | 电容组能量耗尽,欠压保护(8V,500ms);充电到10V后5秒恢复 |
| 红灯熄灭,绿、蓝同时闪烁 | 电容组失能,不工作 |
| 红灯熄灭,绿、蓝灯常亮 | 电容组满电 |
| 红灯熄灭,绿灯常亮,蓝灯熄灭 | 超级电容模组正在充电 |
| 红灯熄灭,绿灯熄灭,蓝灯常亮 | 超级电容模组正在放电 |
可以看到,只要红灯亮起,则说明电容组处于保护状态,不可用。
正常使用的情况下,都不会触发带有"保护"字样的状态,如果出现了,则说明使用场景过于恶劣,超出了本设计的使用范围。
CAN通信协议
超级电容控制板Plus接收报文格式
用于向超级电容模组发送控制指令控制超级电容模组的正常运行状态。
- 标识符:0x001
- 帧格式:DATA
- 帧类型:标准帧
- DLC:8字节
| 数据域 | 内容 |
|---|---|
| DATA[0] | 【使能】控制:1使能,0失能 |
| DATA[1] | 空 |
| DATA[2] | 【功率上限】单位瓦(W):数值必须小于或等于【底盘功率上限】 |
| DATA[3] | 空 |
超级电容控制板Plus只会以100Hz刷新接收到的数据。
向超级电容控制板发送消息的频率需大于10Hz,否则超级电容控制板会处于离线状态。
解释:
- 【使能】控制:决定是否让超级电容Plus模组工作。如果失能,则超级电容Plus模组将会停止工作,消耗极小的功率(1W以下)。
- 【底盘功率上限】:此参数为一个参考值,不可以用来做控制。应当把他看成常量,与裁判系统中读取到的【底盘功率上限】一致,否则会影响超级电容模组的性能。
超级电容控制板Plus反馈报文格式
超级电容模组向总线上发送的反馈数据。
- 标识符:0x100
- 帧格式:DATA
- 帧类型:标准帧
- DLC:8字节
| 数据域 | 内容 |
|---|---|
| DATA[0] | 【可用】标志:1可用,0不可用 |
| DATA[1] | 【状态】标志:有好多状态,具体查阅控制板的代码 |
| DATA[2] | 【电容组能量】:0-100%啦,0%的时候会自动关闭 |
| DATA[3] | 【电机功率】:单位瓦(W)。范围0 ~ 500 |
| DATA[4] | 自行检测的电池电压:放大了10倍,例:222就是22.2V |
| DATA[5] | 【Chassis功率】:单位瓦(W)。范围0 ~ 255。 |
发送频率:200Hz,可调。
解释:
- 【可用】标志:超级电容模块只有处于充电状态、充满状态、放电状态和待机的时候才是可用,其余均为不可用。在可用的情况下才能使能超级电容模组进行放电(无法强制放电)。在不可用的情况下,请等待其自动恢复。
- 【状态】标志:各个状态对应前文的指示灯描述中的状态。
- 【电容组能量】:顾名思义,建议仅作为UI的电量显示。不需要刻意设置低于多少的时候关超电,超级电容模组会在保证在安全范围内自己关,并且改变相应的【状态】标志。如果电控自己写低能量判断,请务必把逻辑写好,避免在临界状态反复开关。
- 【电机功率】:此数值为超级电容模组反馈到CAN总线上的数值,但是请注意,由于CAN总线数据类型为uint8,发送的时候为了提高量程,右移了一位(除2),故在读取的时候,需要左移一位(乘2)进行还原,并且使用uint16进行接收。电控应使用此数值作为功率闭环的反馈量,只要经过拟合校准,其与裁判系统电源管理模块的误差不超过1W(经过远端补偿)。
- 自行检测的电池电压(其实这个C板也能读):由于uint8只能传输0-255,而电池电压如果取整,20-26会显得变化不大,添加一位小数已经可以满足通过电池电压粗略判断电池剩余电量的需求了,但是不能传输小数,所以放大10倍进行传输,使用的时候只需要将该值/10则可以还原为电池电压,单位为伏(V)。
- 【Chassis功率】:放着看的,可以给C板统计底盘总能量消耗。
使用示例
底盘任务
// 这里是chassis_task.c
#include "chassis_power_control_with_supercap.h"
#include "CAN_supercap_communication.h"
//超级电容发送数据
CAN_SuperCapTXDataTypeDef sSuperCapTXdata = {ENABLE,CHARGE,0,0};
/*
* 一大堆代码
*/
uint32_t Counter =0;
//某个什么函数
void chassis_power_update(){
/*
* 一大堆代码
*/
uint8_t referee_power_limit = 0;
get_chassis_power_limit(&referee_power_limit);
if(SHIFT){
//SHIFT就是你想用超电的某个按键啦,当作加速跑路模式。
//这里+多少,就代表需要超级电容模组补多少,建议不超过200W,提升不是线性的,很浪费。
//超级电容使用功率与时间的关系,看文章末尾。
set_chassis_power(referee_power_limit + 50);
}else if(FLY){
//FLY这里代指飞坡模式,需要测试出能够飞坡的功率数值,直接赋值就可以稳定飞坡
//这里超级电容模组补充的功率,是随着等级提升减小的:200 - referee_power_limit。
set_chassis_power(200);
}else{
//这里就是不使用超级电容补充底盘功率的模式啦
set_chassis_power(referee_power_limit);
}
//你也可以自己多写几个else,分几个不同的档位+不同的功率去让超级电容模组补偿。
sSuperCapTXdata.Enable = ENABLE;//在你不想使用超级电容的时候再发DISABLE,否则一直是ENABLE
sSuperCapTXdata.PowerLimit = referee_power_limit;
Counter ++;
if((Counter & 0x07) == 1){
//做一个8分频计数,降低CAN发送频率,避免CAN爆炸。
CAN_cmd_SuperCap(&sSuperCapTXdata);
}
}
//另一个什么函数
void chassis_control_loop(chassis_move_t * chassis_move_control_loop){
/*
* 又是一大堆代码
*/
//在给电机赋值电流之前
chassis_power_control_with_supercap(&chassis_move_control_loop);
for(i = 0;i < 4;i++){
chassis_move_control_loop -> motor_chassis[i].give_current = (int16_t)(chassis_move_control_loop -> motor_speed_pid[i].out);
}
}CAN接收
//这里是CAN_receive.c
#include "CAN_supercap_communication.h"
//什么回调函数
void HAL_CAN_RxFifoMsgPendingCallback(CAN_HandleTypeDef *hcan){
/*
* 一大堆代码
*/
HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_header, rx_data);
if(hcan == &SUPERCAP_CAN){
if(rx_header.StdId == SUPERCAP_RX_ID){
transfer_SuperCap_measure(rx_data);
}
}
/*
* 别的另一堆代码
*/
}chassis_power_control_with_supercap.h 是基于西交利物浦电机模型功率控制开源的库改编的,里面包含超级电容控制板Plus消息的处理,与功率、缓冲能量闭环。
CAN_supercap_communication.h 是对超级电容控制板Plus的通信内容进行解析,将数据处理后封装成函数对外声明进行调用。
使用效果

机器人示例代码库
功率控制与超电通信库.zip(大小:0.01MB)
项目关联
- [开源]【RM2025超级电容控制板Plus「硬件篇」】桂林理工大学-群星战队-RoboMaster 社区
- [开源]【RM2024超级电容组】桂林理工大学-群星战队-RoboMaster 社区
参考资料
- 【RM2023-电机功率模型与功率控制开源】西交利物浦大学-RoboMaster 社区