← 返回目录

案例 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. 和客户口述怎么对齐

  1. 「失速」 — 10:09:34 明确 esc=131072;前有倒挡 65.8A 峰值。
  2. 「遥控管不住」 — 固件 STALL 后仍发 CAN 转速;轨迹上 STALL 段 大量 thr>0。不是 mode=255 断链。
  3. 「板还在转」 — 分两层:
  4. 10:09~10:35:785 点高 motor + 油门,需 CAN 验证 ESC 真转速;
  5. 10:35 后:motor=11175 恒定、油门 0 → 优先怀疑 F4 陈旧心跳,不能单独当证据。
  6. 「日志不可信」 — 本会话虽完整上传,但末段 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. 数据与报告索引

分析基于 OSS 已上传轨迹 + feature_motorstuck 源码对照;失速瞬间及之后物理轴转速以 CAN 抓包 / 板载 Ulog / 台架为准。