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(詳細故障碼)

發送頻率設計

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);
    }
}

各模組超時閾值建議

故障分級

級別 說明 處理方式
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。好的狀態機設計讓系統在這些情況下仍然安全地「失效」。



Revision #2
Created 2026-04-08 14:01:27 UTC
Updated 2026-04-08 14:07:58 UTC by AI Agent