SuperPower 是主控侧的超级电容 CAN 通信模块,负责接收超电状态帧、同步裁判系统功率上限,并把控制帧发回超电控制板。
这个模块只做通信和状态缓存,不负责电机限幅计算,也不负责 UI 绘制。功率控制由 PowerControl 使用这里提供的实测功率和在线状态完成,底盘 UI 只读取这里的只读状态。
- 接收超电状态帧
0x051 - 解析底盘功率、裁判系统总功率、最大输出功率和输出能力
- 订阅
chassis_ref话题,缓存裁判系统底盘功率上限 - 收到有效状态帧后,在 CAN 接收回调里按
5 ms最小间隔发送控制帧0x061 - 使用连续相同状态帧计数判断离线,不再使用定时超时检测
| 项目 | 约定 |
|---|---|
| CAN 类型 | Classic CAN |
| 帧格式 | 标准帧 |
| 数据长度 | 8 字节 |
| 字节序 | STM32 本地小端 |
| 状态帧 ID | 0x051,超电到主控 |
| 控制帧 ID | 0x061,主控到超电 |
代码使用 packed 结构体描述 8 字节数据区,并通过 memcpy 在 CAN 数据区和结构体之间转换。
状态帧由超电控制板发送给主控,标准帧 ID 为 0x051。
struct __attribute__((packed)) StatusData {
uint8_t power_limit;
uint16_t chassis_power;
uint16_t referee_power;
uint16_t superpower_output_max;
uint8_t output_capability;
};| 偏移 | 字段 | 类型 | 含义 |
|---|---|---|---|
| 0 | power_limit |
uint8_t |
超电侧当前功率限制原始值 |
| 1 | chassis_power |
uint16_t |
底盘实际功率编码值 |
| 3 | referee_power |
uint16_t |
裁判系统总输出功率编码值 |
| 5 | superpower_output_max |
uint16_t |
超电可向 A 侧输出的最大功率 |
| 7 | output_capability |
uint8_t |
输出能力原始值,范围 0~255 |
chassis_power 和 referee_power 需要按下面公式解码后再对外提供:
power_w = (static_cast<float>(encoded) - 16384.0f) / 64.0f;superpower_output_max 按直接功率值读取,不使用零点偏移公式。
当前代码不做功率滤波,收到新状态帧后直接缓存解码结果。模块离线时,功率接口返回 0。
控制帧由主控发送给超电控制板,标准帧 ID 为 0x061。
struct __attribute__((packed)) CommandData {
uint8_t flags;
uint16_t referee_power_limit;
uint16_t reserved0;
uint8_t reserved1;
int16_t reserved2;
};| 偏移 | 字段 | 类型 | 当前写入 |
|---|---|---|---|
| 0 | flags |
uint8_t |
bit0 固定置 1,使能 enableCONV |
| 1 | referee_power_limit |
uint16_t |
chassis_ref.rs.chassis_power_limit |
| 3 | reserved0 |
uint16_t |
0 |
| 5 | reserved1 |
uint8_t |
0 |
| 6 | reserved2 |
int16_t |
0 |
控制帧不单独开线程发送。收到有效状态帧后,接收回调会检查距离上一次发送是否已经超过 5 ms,满足条件才发送一帧。
模块启动后,在收到第一帧有效状态帧之前认为离线。
每次收到有效状态帧时,会和上一帧完整的 StatusData 比较:
- 数据变化时,连续相同帧计数重置为
1 - 数据相同时,连续相同帧计数加
1 - 连续相同帧数量达到
200时认为离线,并清空对外状态
这里不再使用最后接收时间做超时判断。
- 构造时根据
can_bus_name查找 CAN 总线 - 注册标准帧过滤器,只接收 ID
0x051 - 订阅
chassis_ref,保存裁判系统底盘功率上限 - CAN 接收回调检查状态帧长度,长度不足 8 字节时丢弃
- 有效状态帧进入重复帧计数和协议解析
- 在线时按
5 ms最小间隔发送控制帧
| 接口 | 在线返回 | 离线返回 |
|---|---|---|
GetChassisPower() |
解码后的底盘实际功率,单位 W | 0 |
GetRefereePower() |
解码后的裁判系统总输出功率,单位 W | 0 |
GetSuperPowerOutputMax() |
最大输出功率,单位 W | 0 |
GetPowerLimit() |
超电侧功率限制原始值 | 0 |
GetCapEnergy() |
output_capability / 255.0f |
0 |
IsOnline() |
true |
false |
GetCapEnergy() 是为兼容旧上层命名保留的接口,当前表示输出能力比例,不表示电容容量或剩余电量。
最小配置如下:
- id: superpower
name: SuperPower
constructor_args:
can_bus_name: can1can_bus_name 必须对应 User/app_main.cpp 中已经注册的 CAN 设备。系统里还需要有 Referee 模块持续发布 chassis_ref 话题,否则控制帧里的 referee_power_limit 只会保持默认值或上一次缓存值。
Required Hardware:
- can
Depends:
- qdu-future/Referee
代码入口:
Modules/SuperPower/SuperPower.hpp