案例 15265:日志 × 固件对照复盘(客户确认失速)
研发纠正现象版(油门 0 / MotorSpeed 0 / CAN 异常 / ESC 满功率 / 异常转速簇)见:
STALL_CASE_15265_RND_PHENOMENON_ANALYSIS.md(控制流转、风险、修复伪代码、台架项)
一句话结论: 这是一次 倒挡大电流工况触发 ESC 失速保护 后,ECU 在 feature_motorstuck 仍每 20ms 向 ESC 发非零转速指令、且不识别 STALL 拉闸 的会话;约 25 分钟后 CAN 反馈中断,ECU 才报 FAULT_ESC_COMMUNICATION,但 心跳里的 motor_speed 卡在最后一次有效值 11175,App/云端看起来像「油门 0 还在转」。全程没有出现 mode=255(蓝牙断链),客户说的「断联」在本日志里 不能等同于 RC 蓝牙断开,更接近 「有油门但车不跟 / 显示失控」。
| 项 | 值 |
|---|---|
| 轨迹 ID | 15265 |
| 分析页 | https://manager.jetwave.cn/motion/trajectoryHistory/analysis/15265 |
| OSS | https://surf-oss.oss-accelerate.aliyuncs.com/surf-oss/file/231AAAA5G000728_1_10000251_20260524113448.txt |
| 遥控 SN | 231AAAA5G000728 / 板 222AACA5E000503 |
| 固件 | ESC 0551 / ECU 0022 / BMS 0122 |
| 分支 | JetWaveECU-feature_motorstuck |
| 采样 | 3711 点,约 1.53 s/点,总长约 62 min |
1. 现场三句话 ↔ 本案例证据
| 客户说法 | 15265 里能看到什么 | 看不到什么(勿过度解读) |
|---|---|---|
| 失速 | escEventCode & 0x20000(STALL)1577 点 / 42.5% |
— |
| 遥控管不住 | STALL 段 886 点油门>0;固件 不因 STALL 停发 CAN | 不能证明 BLE 已断(无 mode=255) |
| 板还在疯转 | STALL+油门>0 时 785 点 motorSpeed>5000;末段 60 点固定 motor=11175、油门=0 | 末段转速 极可能是陈旧心跳,需 CAN/台架证实物理转动 |
2. 时间轴(UTC,按轨迹 time 字段)
| 阶段 | 时刻 | 轨迹索引 | 关键数据 | 含义 |
|---|---|---|---|---|
| 正常航行 | 09:34:48 起 | 0 | mode=0(初学),gear 变化 | 上传完整,无 >3s 空洞 |
| 倒挡大负载 | ~10:07 前 | — | thr=1000,motor≈11225,gear=15(R),电流峰值 65.8A | 倒挡满油 + 高转速 + 大电流,失速前因 |
| 首次 STALL | 10:09:34 | 2085 | thr=0, motor=0, gear=15, esc=131072 | ESC runningError bit1 → 上报 ESC_FAULT_STALL_PROTECTION |
| 用户继续给油 | 10:09:50 | 2101 | thr=362, motor=0, STALL 仍在 | 16s 后首次「有油无速」;仅 23 点属此类 |
| STALL 持续 | 10:09:34 → 10:35:01 | 2085→3611 | 1527 点连续 STALL;其中 785 点「STALL+油门>0+motor>5000」 | 日志更像 指令仍在发 / 反馈仍报高转速,不是单纯「停转」 |
| ESC 通信故障 | 10:35:01 | 3612 | esc STALL 消失,ecu=0x40000000,motor=11175 | 与固件 12s 无队列数据 置位一致;motor 为最后一帧缓存 |
| 末段抖动 | 10:35:01 → 10:36:39 | 3612→3710 | STALL/ECU 码 交替 11 次;motor 始终 11175 | 反馈异常 + 事件位闪烁,不可信 |
| 结束 | 10:36:39 | 3710 | thr=0, motor=11175, STALL 又置位 | 会话结束态 |
和旧版摘要的区别(干货):
- 失速 不是「全程无油门误报」——之前 2 分钟内刚有过 满油倒挡 65.8A。
- 失速后用户 多数时间在推油门(886/1577),其中 785 点转速仍>5000——这才是「失控感」的主数据源,不是那 23 点「有油转速 0」。
- ecu 0x40000000 比 STALL 晚约 25 分钟,且 从未与 STALL 同点置位——这是 ECU↔ESC CAN 队列空了,不是遥控器蓝牙断链码。
3. 根因链(日志现象 → 具体代码)
sequenceDiagram
participant RC as 遥控/App
participant ECU as ECU MotorSpeedControlTask
participant CAN as UAVCAN/TWAI
participant ESC as 电调0551
RC->>ECU: 倒挡满油 thr=1000 gear=R
ECU->>CAN: SendSetSpeedRequest(-10000级)
CAN->>ESC: 转速指令
ESC-->>CAN: 大电流/堵转
ESC-->>ECU: runningError bit1 STALL
Note over ECU: 无 STALL 分支,仍 SendSetSpeedRequest
RC->>ECU: 继续推油门
ECU->>CAN: 仍发非零指令
ESC-->>ECU: 反馈变慢/10:1降频
Note over ECU: 12s无新队列才 FAULT_ESC_COMMUNICATION
ECU->>RC: 心跳 motor_speed=11175 陈旧值
缺陷 F1 — STALL 不拉闸(P0,本案例主因)
MotorSpeedControlTask 只对 空转 bit9 强制 MotorSpeed=0,没有对 STALL(runningError bit1 → esc_event 0x20000) 处理:
```358:363:JetWaveECU-feature_motorstuck/App/src/esc_manager.c // 如果存在空转保护故障码,强制转速为0 if (LastEscSpeedData.runningError & (uint16_t)(0x0001 << 9)) { MotorSpeed = 0; ESP_LOGD(LOG_TAG, "Idle protection in progress, speed forced to 0"); } SendSetSpeedRequest(MotorSpeed);
**15265 对应:** 10:09:34 起 STALL 置位后,只要 mode=0/1/2 且收到油门,任务 **仍 `SendSetSpeedRequest`** → 2101 起 thr>0 与 785 点高 motor 同源。
---
### 缺陷 F2 — `mode=255` 不发零速(P0;本会话未触发但属同类风险)
```372:376:JetWaveECU-feature_motorstuck/App/src/esc_manager.c
case 255: // 蓝牙断链
ESP_LOGD(LOG_TAG, "NOBLUETOOTH");
ThrottleAndGear.throttle = 0;
MotorSpeed = 0;
break;
255 分支 没有 SendSetSpeedRequest(0)。15265 全程无 mode=255,故本案例「断联」不是这条路径,但客户其他场次若 BLE 真断,仍会 CAN 不零速。
缺陷 F3 — ESC 反馈降频 + 通信故障太慢(P0)
CAN 侧 每 10 帧才入队一次 转速反馈:
```58:61:JetWaveECU-feature_motorstuck/Protocol/src/uavcan_twai.c sendCount++; if (sendCount >= 10) { // 发送降频 SendEscSpeedResponseDataToQueue(escSetSpeedResponseData, pdMS_TO_TICKS(10));
ECU 侧 **240×50ms=12s** 才置 `FAULT_ESC_COMMUNICATION`:
```488:493:JetWaveECU-feature_motorstuck/App/src/ecu_manager.c
} else if (GetRcConnectionStatus()) { // 未收到电调数据且BLE服务器已连接
ESC_CommunicationFailure ++;
if (ESC_CommunicationFailure >= 240) { // 12S
ESC_CommunicationFailure = 240;
ecuEventCode |= FAULT_ESC_COMMUNICATION;
15265 对应: 10:35:01 索引 3612 才首次 ecu=0x40000000,恰为 STALL 连续 1527 点(≈25 min) 之后;停板不能等这个码。
缺陷 F4 — 通信失败后心跳仍报旧转速(P0,「看起来还在转」)
```105:118:JetWaveECU-feature_motorstuck/App/src/ecu_manager.c void UpdateEcuHeatbeatDataByDevice(EscRunningData_t EscData, BmsRunningData_t BmsData, uint8_t ecuStatus) { ... latestEcuHeatbeatData.motor_speed = EscData.speed; }
队列收不到新 `EscRunningData` 时 **`latestEscRunningData` 不清零**,心跳仍周期性上报:
```560:563:JetWaveECU-feature_motorstuck/App/src/ecu_manager.c
UpdateEcuHeatbeatDataByDevice(latestEscRunningData, latestBmsRunningData, 0);
mavlink_msg_ecuheatbeatdata_encode(MAVLINK_SYSTEM_ID, ECU, &HeatbeatMsg, GetLatestEcuHeatbeatData());
SendMavlinkToBleRC(&HeatbeatMsg);
15265 对应: 10:35:01 起 末 60 点全部 motor=11175、thr=0——典型 卡死最后一帧,不是用户还在加油。
缺陷 F5 — feature_motorstuck 转速异常位映射错误(P1,干扰诊断)
```225:228:JetWaveECU-feature_motorstuck/App/src/esc_manager.c if (escSpeedInfo->speed <= -20000 || escSpeedInfo->speed >= 20000) { runningErrorState |= (uint16_t)(0x0001 << 6); // 置位堵转故障码 }
bit6 经 `esc_event = runningError << 16` 会变成 **0x400000(过压掩码)**,与 STALL **0x20000** 混淆。15265 末段若出现超大/负转速,云端会更难对齐 ESC 真实状态。
---
### 缺陷 F6 — 油门丢失 1s 才 mode=254,且仍发零速指令(次要)
```320:326:JetWaveECU-feature_motorstuck/App/src/esc_manager.c
} else { // 没有油门信号
if (ThrottleLostCnt++ >= 50) { // 油门丢失1s
ThrottleLostCnt = 50;
if (ThrottleAndGear.mode != 255) {
ThrottleAndGear.mode = 254; // 蓝牙连接但不发油门
15265 在 STALL 段 mode 一直为 0(仅 17 点 mode=99,疑 App 侧异常态),说明 BLE 链路在轨迹上仍像「连着」,与客户「遥控器没反应」需区分:链路在,驱动无效。
4. 数字摘要(避免只看占比)
| 指标 | 数值 | 解读 |
|---|---|---|
| STALL 点 | 1577 / 3711 (42.5%) | 会话近半时间在失速保护态 |
| STALL 且 thr>0 | 886 | 用户在失速后 仍在操作油门 |
| STALL 且 thr>0 且 motor>5000 | 785 | 「失速了但转速很高」 — 对齐失控感 |
| STALL 且 thr>0 且 motor=0 | 23 | 脚本名 stall_with_throttle_no_motor,不是主矛盾 |
| STALL 跳变 | 11 次 | ESC/上报位 非锁死,末段不可信 |
| ECU 通信故障 | 49 点,首点 idx=3612 | 与 STALL 0 次同点 |
| mode=255 | 0 | 本日志 不支持「蓝牙断链」叙事 |
5. 和客户口述怎么对齐
- 「失速」 — 10:09:34 明确
esc=131072;前有倒挡 65.8A 峰值。 - 「遥控管不住」 — 固件 STALL 后仍发 CAN 转速;轨迹上 STALL 段 大量 thr>0。不是 mode=255 断链。
- 「板还在转」 — 分两层:
- 10:09~10:35:785 点高 motor + 油门,需 CAN 验证 ESC 真转速;
- 10:35 后:motor=11175 恒定、油门 0 → 优先怀疑 F4 陈旧心跳,不能单独当证据。
- 「日志不可信」 — 本会话虽完整上传,但末段 STALL/ECU 交替、转速冻结、曾出现负值/超大整数(全段 13 点 motor<0),与客户判断 不矛盾。
6. 必须改的代码(针对本案例验证)
| 优先级 | 改什么 | 位置 | 15265 验收现象 |
|---|---|---|---|
| P0 | STALL / 任意 esc_event 危险位 → 强制 SendSetSpeedRequest(0) 并禁止非零 |
esc_manager.c MotorSpeedControlTask |
STALL 后 thr>0 时 CAN 仍为 0 |
| P0 | mode=255/254 及 500ms 无 ESC 反馈 → 零速 |
同上 + 新 powertrain_safety |
3612 类时刻 <500ms 停转 |
| P0 | 无新 ESC 数据 → 心跳 motor_speed=0 或无效标志 |
ecu_manager.c UpdateEcuHeatbeatDataByDevice |
末段不再 11175 假高转 |
| P1 | 通信故障 12s→500ms(报障可仍 12s) | ecu_manager.c ~490 |
停板不依赖 0x40000000 |
| P1 | 修正 bit6 注释/映射;CAN 反馈 不要 10:1 降频(至少故障时全速) | esc_manager.c / uavcan_twai.c |
事件与转速时间对齐 |
详细 LSS 分层与伪代码见:JETWAVE_ECU_POWERTRAIN_DEEP_ANALYSIS_REPORT_feature_motorstuck.md §8.3、§11.8。
7. 台架复现清单(用 15265 当标杆)
| 编号 | 步骤 | 通过标准 |
|---|---|---|
| T-15265-1 | 初学 mode、倒挡 R、逐步加满油至电流 >60A | 触发 STALL 后 ≤50ms CAN 转速指令为 0 |
| T-15265-2 | STALL 保持期间 App 持续推油门 | 不再出现非零 SendSetSpeedRequest |
| T-15265-3 | 拔 CAN 或停 ESC 反馈,BLE 仍连接 | 500ms 内零速;心跳 motor 0 或无效 |
| T-15265-4 | 对比 15265 的 idx3612 场景 | 不再「thr=0 且 motor 卡 11175」 |
8. 数据与报告索引
- 深度分析:
JETWAVE_ECU_POWERTRAIN_DEEP_ANALYSIS_REPORT_feature_motorstuck.md - 历史筛选:
FAULT_FILTER_STALL_OV_ECU_REPORT.md(P0-3)、esc_fault_report_20260525_192935.md - 复现脚本:
analysis/_deep_15265.py(可重复跑统计)
分析基于 OSS 已上传轨迹 + feature_motorstuck 源码对照;失速瞬间及之后物理轴转速以 CAN 抓包 / 板载 Ulog / 台架为准。