Skip to main content

6. 通訊與控制策略

6. 通訊與控制策略

6.1 CAN 設計(ID 規劃)

CAN ID 規劃原則

優先級 用途 ID 範圍(建議)
高(低 ID) 安全相關(SDC 狀態、AMS Fault) 0x001–0x0FF
控制指令(扭矩命令、模式切換) 0x100–0x2FF
監測數據(電壓、溫度、速度) 0x300–0x5FF
最低 儀表顯示、Log 數據 0x600–0x7FF

為什麼這樣分:CAN 是基於 ID 仲裁的,ID 越小,優先級越高。安全相關訊息必須在 Bus 繁忙時仍能優先傳輸。

CAN 訊息設計範例(AMS 狀態)

CAN ID: 0x050(高優先)
DLC: 8 bytes
Byte 0: Status(0x00=OK, 0x01=OV, 0x02=UV, 0x03=OT, 0xFF=Fault)
Byte 1: Max Cell Voltage [LSB = 1 mV](高 8 bits)
Byte 2: Max Cell Voltage(低 8 bits)
Byte 3: Min Cell Voltage(高 8 bits)
Byte 4: Min Cell Voltage(低 8 bits)
Byte 5: Max Temperature [°C, offset -40]
Byte 6: SOC [0–100%]
Byte 7: Fault Code(詳細故障碼)

發送頻率設計

  • 安全狀態訊息:10–50 ms(快速更新)
  • 控制指令:5–10 ms
  • 監測數據:50–100 ms
  • 儀表數據:100–500 ms

6.2 故障處理(Fail-safe)

Fail-safe 設計哲學通訊中斷或數據異常時,系統應進入最安全的狀態,而不是繼續運行。

CAN 超時偵測

// 偽碼示意
void CAN_RxCallback(uint32_t id, uint8_t *data) {
    if (id == MOTOR_CONTROLLER_STATUS_ID) {
        last_mc_heartbeat = get_timestamp();
        update_mc_status(data);
    }
}

void safety_check_task(void) {  // 每 10ms 執行
    if (get_timestamp() - last_mc_heartbeat > MC_TIMEOUT_MS) {
        // Motor Controller 通訊超時 → 扭矩命令設為 0
        set_torque_command(0);
        set_fault(FAULT_MC_TIMEOUT);
    }
}

各模組超時閾值建議

  • AMS:100 ms(若超時,禁止扭矩輸出,但不一定立刻斷 HV)
  • Motor Controller:50 ms(立刻設扭矩為 0)
  • 關鍵安全訊號:20 ms

故障分級

級別 說明 處理方式
Warning 非立即危險,需注意 儀表警示,繼續運行
Soft Fault 潛在問題,需降功率 限制扭矩輸出至 50%
Hard Fault 嚴重問題,需立停 扭矩設 0,禁止 RTD
Critical Fault 安全威脅 觸發 SDC 斷路(軟體觸發,補充硬體安全)

6.3 State Machine(車輛狀態設計)

整車狀態機是電控軟體的骨架。 沒有狀態機的電控系統,就像沒有骨架的人,遇到複雜情況就垮掉。

推薦狀態設計

                    ┌──────────────────────────────┐
                    │                              ↓
[INIT] → [LV_READY] → [HV_PRECHARGING] → [HV_READY] → [RTD]
            ↑               │                  │           │
            │          Fault/SDC Open      Fault/SDC    Fault/SDC
            │               ↓               Open           Open
            └─────── [FAULT] ←──────────────────┘←─────────┘
                        │
                    (SDC 斷路
                   所有 Contactor 斷開)

各狀態說明

INIT:上電初始化。自我檢測(Selftest):確認感測器通訊正常、SDC 節點狀態讀取、CAN 通訊建立。

LV_READY:GLV 系統正常,HV 尚未充電。等待駕駛操作 TSMS 進入 HV Precharge 流程。

HV_PRECHARGING:執行 AIR- → Precharge → AIR+ 流程。超時(如 10 秒後 MC 電壓未上升到閾值)→ 進入 FAULT。

HV_READY:HV 系統正常,等待 RTD 條件(煞車 + RTD 按鈕)。

RTD(Ready To Drive):正常行駛狀態。扭矩控制啟用,RTDS 已觸發。

FAULT:任何嚴重錯誤。此狀態下,扭矩輸出為 0,向 SDC 硬體發送 Fault 訊號(透過 Watchdog 停止餵狗),重置需要物理操作(重新操作 TSMS 或解除故障)。

💡 學長建議:狀態機的進入與退出條件要寫得非常嚴謹。特別是從 FAULT 返回正常狀態的條件,不能靠軟體自動 Reset,必須有駕駛或維修人員的確認動作。

小結

通訊與控制策略的核心是:預期一切可能出錯。每個 CAN 節點可能超時,每個感測器可能輸出錯誤值,每個程式模組可能有 bug。好的狀態機設計讓系統在這些情況下仍然安全地「失效」。