robot-notes — 機器人知識筆記 GitHub ↗
本章與本頁目次

核心

robot-notes /核心/硬體/通訊匯流排

通訊匯流排:CAN 與 RS485

下位機要跟馬達驅動器、BMS、多個感測節點對話,靠的是匯流排。本篇講 CAN 與 RS485 的原理、為什麼 MCU 腳位不能直接上匯流排(要收發器),以及在 STM32F4 上怎麼串接、怎麼選。

章節編號沿用原始《送餐機器人基礎原理補充》,方便與舊文件對照(故本檔編號不連續,如 §1→§5→§10,非缺漏)。 延伸閱讀:下位機運動控制數位電路與 open-drain系統架構


6. CAN 與 RS485:原理與 STM32F4 串接

兩者都是差分訊號匯流排(用兩條線的「電壓差」傳資料,抗共模干擾,適合馬達旁邊這種電磁噪聲環境),但層級完全不同:CAN 是一套完整協議,RS485 只是電氣規格。

為什麼「用兩條線的電壓差」就能抗干擾?第一性原理:兩條線緊鄰(常絞在一起),外界電磁干擾同時等量加在兩條線上(共模);接收端只看「兩線之差」,這個共同的干擾一相減就消掉,而真正的訊號(差模)反而加倍。

差分訊號:兩線拿到一樣的噪聲 N,A−B 取差讓 N 抵消、訊號加倍

6.1 共同的前提:MCU 腳位不能直接上匯流排

STM32 腳位輸出的是 0/3.3V 單端數位訊號,匯流排上跑的是差分電平,中間必須加一顆收發器 (transceiver) 做轉換——這是接線的核心觀念,完整接線見下一節的圖。

6.2 CAN 串接(STM32F4 內建 bxCAN 控制器 ×2)

CAN 接線:STM32 經收發器上 CANH/CANL 雙絞線,兩端 120Ω 終端電阻,STM32、左輪驅動器、右輪驅動器、BMS 掛同一匯流排

要點:

6.3 RS485 串接(本質是 UART + 差分收發器)

RS485 沒有自己的協議——它只是把 UART 訊號變成差分電平的電氣標準。STM32 端用的外設就是普通 USART:

RS485 接線:USART 經收發器轉 A/B 差分線,兩端 120Ω;DE 控制腳切換半雙工收發方向

關鍵差異:半雙工——同一對線收發共用,任一時刻只能一個節點講話,所以收發器有 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 驅動器兩種介面都提供。