iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
自我挑戰組

MCU功能介紹與實作系列 第 27

Day 27:CAN通訊

  • 分享至 

  • xImage
  •  

Controller Area Network(CAN)是一種多主機,多從機串行通訊協議,最初用於汽車領域,但現在已在各種嵌入式系統中廣泛使用。它專為工業和汽車應用而設計,具有高度的噪聲抵抗能力和可靠性。CAN通訊使用兩根差動電纜進行數據傳輸,其中一根用於傳送正數據,另一根用於傳送負數據。這種差動信號幫助降低噪聲干擾,使CAN通訊適用於嚴苛的環境。

CAN通訊的用途

CAN通訊在各種應用中都非常有用,特別是在需要可靠數據通訊的情況下。以下是一些常見的CAN通訊應用:

  • 汽車系統: CAN通訊最早用於汽車中,用於連接各種控制單元,如引擎控制單元、制動系統、空調等。它允許這些單元之間快速而可靠地交換數據,提高了車輛性能和安全性。

  • 工業自動化: CAN通訊在工業自動化中廣泛使用,用於連接PLC(可編程邏輯控制器)、儀表、傳感器和執行器。它支持實時控制和監視工業過程。

  • 醫療設備: 醫療設備,如醫療成像設備和手術機器人,使用CAN通訊來實現高度精確的控制和數據交換。

  • 能源管理: CAN通訊用於太陽能發電系統、智能電網和能源監控,以實現能源效率和監控。

  • 航空航天: CAN通訊在飛機和太空船的控制系統中得到廣泛應用,以確保安全和可靠的操作。

簡單的CAN通訊範例程式碼

以下是一個MCU發送一條包含數據的CAN訊息,另一個MCU接收並解析該訊息。

// 發送MCU代碼
#include <Arduino.h>
#include <SPI.h>
#include <mcp_can.h>

MCP_CAN CAN(10);  // 使用SPI通訊的CAN模組,將CS引腳連接到數位引腳10

void setup() {
  Serial.begin(115200);
  while (!Serial);

  if(CAN_OK == CAN.begin(CAN_500KBPS)) {
    Serial.println("CAN初始化成功!");
  } else {
    Serial.println("CAN初始化失敗...");
    while(1);
  }
}

void loop() {
  unsigned char data[] = {0x01, 0x02, 0x03, 0x04, 0x05};
  CAN.sendMsgBuf(0x100, 0, 5, data); // 發送CAN訊息,ID為0x100,包含5個字節的數據
  delay(1000);  // 延遲1秒
}


// 接收MCU代碼
#include <Arduino.h>
#include <SPI.h>
#include <mcp_can.h>

MCP_CAN CAN(10);  // 使用SPI通信的CAN模組,將CS引腳連接到數位引腳10

void setup() {
  Serial.begin(115200);
  while (!Serial);

  if(CAN_OK == CAN.begin(CAN_500KBPS)) {
    Serial.println("CAN初始化成功!");
  } else {
    Serial.println("CAN初始化失敗...");
    while(1);
  }
}

void loop() {
  unsigned char len = 0;
  unsigned char buf[8];

  if(CAN_MSGAVAIL == CAN.checkReceive()) {
    CAN.readMsgBuf(&len, buf);  // 讀取接收到的CAN訊息
    Serial.print("接收到的數據: ");
    for(int i = 0; i<len; i++) {
      Serial.print(buf[i], HEX);  // 以十六進制顯示數據
      Serial.print(" ");
    }
    Serial.println();
  }
}

上一篇
Day 26:I2C通訊
下一篇
Day 28:Ethernet通訊
系列文
MCU功能介紹與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言