robot-notes /核心/硬體/通訊匯流排
通訊匯流排:CAN 與 RS485
下位機要跟馬達驅動器、BMS、多個感測節點對話,靠的是匯流排。本篇講 CAN 與 RS485 的原理、為什麼 MCU 腳位不能直接上匯流排(要收發器),以及在 STM32F4 上怎麼串接、怎麼選。
章節編號沿用原始《送餐機器人基礎原理補充》,方便與舊文件對照(故本檔編號不連續,如 §1→§5→§10,非缺漏)。 延伸閱讀:下位機運動控制、數位電路與 open-drain、系統架構
6. CAN 與 RS485:原理與 STM32F4 串接
兩者都是差分訊號匯流排(用兩條線的「電壓差」傳資料,抗共模干擾,適合馬達旁邊這種電磁噪聲環境),但層級完全不同:CAN 是一套完整協議,RS485 只是電氣規格。
為什麼「用兩條線的電壓差」就能抗干擾?第一性原理:兩條線緊鄰(常絞在一起),外界電磁干擾同時等量加在兩條線上(共模);接收端只看「兩線之差」,這個共同的干擾一相減就消掉,而真正的訊號(差模)反而加倍。
6.1 共同的前提:MCU 腳位不能直接上匯流排
STM32 腳位輸出的是 0/3.3V 單端數位訊號,匯流排上跑的是差分電平,中間必須加一顆收發器 (transceiver) 做轉換——這是接線的核心觀念,完整接線見下一節的圖。
6.2 CAN 串接(STM32F4 內建 bxCAN 控制器 ×2)
要點:
- 協議內建在硬體:訊框格式、11/29-bit ID、CRC 校驗、錯誤自動重傳、多主仲裁(兩節點同時發送時,ID 小的自動勝出,不會撞壞資料)——這些 bxCAN 外設全部硬體處理,軟體只管收發訊框。
- 仲裁「不會撞壞」的物理根:CAN 匯流排是 wired-AND 的差分版(顯性 0 覆蓋隱性 1),發 0 的節點物理上蓋過發 1 的節點,後者讀回發現不一致就自動退讓——同一個機制見 數位電路 §13.4 的 wired-AND 圖。
- 收發器常用 TJA1051、SN65HVD230(3.3V 直接配 STM32);120Ω 終端電阻只放匯流排最遠兩端,中間節點不放。
- 為什麼是 120Ω、為什麼只放兩端:訊號在雙絞線上跑到底,如果末端沒有東西「吃掉」它,能量會反射回來疊在後續的訊號上,把波形弄糊。要不反射,末端接的電阻必須等於線本身的特性阻抗——雙絞線約 120Ω,這個數字是線的物理性質決定的,不是規範挑的。只有兩端會反射(中間節點兩側都有線繼續延伸),所以只在兩端各接一顆;多接一顆就等於把匯流排負載加重,訊號幅度反而被拉低。
- 顯性 / 隱性在電位上是什麼:CAN 用差動,
CANH − CANL。沒有人主動驅動時,兩線被拉到差不多電位,差值 ≈ 0V,匯流排讀作 1(隱性,recessive)——「隱性」的意思就是「不出力,誰都可以蓋過我」。有節點要送 0 時,它主動把 CANH 拉高、CANL 拉低,差值約 2V,讀作 0(顯性,dominant)。主動驅動一定贏過不驅動,這就是「0 蓋過 1」的物理來源,也是仲裁不必協調就能收斂的原因。
- 波特率常用 500kbps / 1Mbps,由 bxCAN 的 prescaler + 時間段參數設定。
- 軟體層(HAL):
HAL_CAN_Init→ 設定 filter(硬體過濾只收自己關心的 ID,例如只收兩顆驅動器的回報)→HAL_CAN_ActivateNotification(RX FIFO 中斷)→HAL_CAN_AddTxMessage發送。 - 對馬達驅動器的實際使用:驅動器手冊會定義它的 CAN ID 表(常見直接用 CANopen 協議),例如「ID 0x601 + 8 bytes = 設定目標轉速」,照表組訊框即可。
6.3 RS485 串接(本質是 UART + 差分收發器)
RS485 沒有自己的協議——它只是把 UART 訊號變成差分電平的電氣標準。STM32 端用的外設就是普通 USART:
關鍵差異:半雙工——同一對線收發共用,任一時刻只能一個節點講話,所以收發器有 DE/RE 方向腳:發送前拉高(進入驅動模式)、發完拉低(回到接收模式)。STM32 USART 有硬體 Driver Enable 功能(UART_Init 開 DE mode 指定腳位),不必手動 GPIO 切換、不會有時序競態。
因為沒有內建仲裁與校驗,RS485 上一律採主從輪詢:STM32 當 master 逐一問、slave 答,協議自己定(業界最常見是 Modbus RTU)。
6.4 怎麼選
| CAN | RS485 | |
|---|---|---|
| 協議層 | 硬體內建(訊框/CRC/重傳/仲裁) | 無,自定(常用 Modbus RTU) |
| 拓撲 | 多主,任何節點隨時可發 | 主從,master 輪詢 |
| 錯誤處理 | 硬體自動 | 軟體自己做 |
| 即時性 | 好(ID 即優先級) | 受輪詢週期限制 |
| 成本/複雜度 | 收發器同價,軟體初始化較繁 | 最簡單,等於寫 UART |
底盤建議:馬達驅動器、BMS 走 CAN(多節點即時控制是它的主場);RS485 留給只支援 Modbus 的周邊。多數現成 FOC 驅動器兩種介面都提供。