×

如何使用Arduino实现CANBUS通信

消耗积分:2 | 格式:zip | 大小:0.00 MB | 2023-06-16

康辅佑

分享资料个

描述

我学习 CAN 已经三周了,现在我已经完成了一些申请来验证我的学习成果。在本教程中,您将学习如何使用 Arduino 实现 CANBUS 通信。如果您有什么建议,欢迎留言。

什么是 CANBUS

关于 CAN

CAN(Controller Area Network)是一种可以实现分布式实时控制的串行通信网络。它是为汽车行业开发的,用两线总线代替复杂的线束。

CAN 协议定义了 OSI 模型中的数据链路层和部分物理层。

CAN 协议采用 ISO11898 和 ISO11519 进行 ISO 标准化。ISO11898是CAN高速通信标准,通信速度为125kbps-1Mbps。ISO11519是CAN低速通信标准,通信速度小于125kbps。

pYYBAGN26R-ANeRwAAC3SVu8D6I303.jpg
 

这里我们重点介绍高速CAN。

  • ISO-11898 描述了信息如何在网络上的设备之间传递,并符合按层定义的开放系统互连模型 (OSI)。通过物理介质连接的设备之间的实际通信由模型的物理层定义。

 

pYYBAGN26SKAA48mAACBVLGuAc8646.jpg
 
  • 每个连接到总线的 CAN 单元都可以称为一个节点。所有 CAN 单元都连接到每端用 120 Ω 电阻端接的总线以形成网络。总线由 CAN_H 和 CAN_L 线组成。CAN 控制器根据两根电线上的功率电平差异确定总线电平。总线级别分为显性和隐性级别,必须是其中之一。发送方通过在总线级别进行更改将消息发送给接收方。当在总线上执行逻辑线“与”时,显性电平为“0”,隐性电平为“1”。
  • 在显性状态下,CAN_H的电压约为3.5V,CAN_L的电压约为1.5V。在隐性状态下,两条线的电压都在2.5V左右。
  • 信号是差分的,这就是 CAN 具有强大的抗噪能力和容错能力的原因。平衡的差分信号减少了噪声耦合,并允许通过双绞线电缆实现高信号速率。每条信号线中的电流相等,但方向相反,从而产生场消除效应,这是低噪声发射的关键。平衡差分接收器和双绞线电缆的使用增强了 CAN 总线的共模抑制和高抗噪能力。

CAN收发器

CAN Transceiver 负责逻辑电平和物理信号之间的转换。将逻辑信号转换为差分电平或将物理信号转换为逻辑电平。

CAN控制器

CAN控制器是CAN的核心部件,实现了CAN协议中数据链路层的所有功能,可以自动解析CAN协议。

单片机

MCU负责功能电路和CAN控制器的控制。例如节点启动时初始化CAN控制器参数,通过CAN控制器读取并发送CAN帧等。

关于 CAN 通讯

当总线空闲时,所有节点都可以开始发送消息(多主机控制)。首先访问总线的节点获得发送权(CSMA/CA 模式)。当多个节点同时开始发送时,发送高优先级ID消息的节点获得发送权。

在 CAN 协议中,所有消息都以固定格式发送。当总线空闲时,所有连接到总线的单元都可以开始发送新消息。当两个以上的小区同时开始发送消息时,根据标识符确定优先级。ID不代表发送的目的地址,而是代表消息访问总线的优先级。当两个以上的cell同时开始发送消息时,免息ID的每一位都会被一一仲裁。仲裁获胜的单元可以继续发送消息,仲裁失败的单元立即停止发送并接收工作。

CAN 总线是一种广播型总线。这意味着所有节点都可以“听到”所有传输。所有节点总是会接收所有流量。CAN 硬件提供本地过滤,以便每个节点只对感兴趣的消息做出反应。

​框架

CAN 设备通过 CAN 网络以称为帧的数据包形式发送数据。CAN 有四种帧类型:

  • 数据帧:包含用于传输的节点数据的帧
  • 远程帧:请求传输特定标识符的帧
  • 错误帧:任何节点检测到错误时发送的帧
  • 过载帧:在数据或远程帧之间注入延迟的帧

数据框

有两种类型的数据帧,标准的和扩展的。

pYYBAGN26SSAE0KJAACV22Ei6n4517.jpg
 

图中位域的含义是:

  • SOF – 单个显性帧开始 (SOF) 位标记消息的开始,用于在空闲后同步总线上的节点。
  • 标识符- 标准 CAN 11 位标识符确定消息的优先级。二进制值越低,其优先级越高。
  • RTR – 单个远程传输请求 (RTR) 位
  • IDE – 显性单一标识符扩展 (IDE) 位意味着正在传输没有扩展的标准 CAN 标识符。
  • R0 – 保留位(供未来标准修订可能使用)。
  • DLC – 4 位数据长度代码 (DLC) 包含正在传输的数据字节数。
  • 数据——最多可传输 64 位应用数据。
  • CRC – 16 位(15 位加上定界符)循环冗余校验 (CRC) 包含用于错误检测的前面应用数据的校验和(传输的位数)。
  • ACK –ACK 是 2 位,一个是确认位,第二个是分隔符。
  • EOF——这个帧结束 (EOF),7 位字段标记 CAN 帧(消息)的结束并禁用位填充,在显性时指示填充错误。在正常操作过程中,当连续出现 5 位相同逻辑电平时,会将相反逻辑电平的位填充到数据中。
  • IFS——这个 7 位帧间空间 (IFS) 包含控制器将正确接收的帧移动到消息缓冲区中的适当位置所需的时间。

仲裁

在总线空闲状态下,首先开始发送消息的单元获得发送权。当多个单元同时开始发送时,每个发送单元从仲裁段的第一位开始。连续输出显性电平数最多的单元可以继续发送。

速度和距离

CAN总线是同时连接多个单元的总线。理论上可以连接的单元总数没有限制。然而,在实践中,可以连接的单元数量受到总线上的时间延迟和电气负载的限制。降低通讯速度,增加可连接的单元数,提高通讯速度,可连接的单元数减少。

通信距离与通信速度成反比,通信距离越远,通信速度越小。更长的距离可以是1km或更长,但速度小于40kps。

pYYBAGN26SaAd3WSAAAs10to7zc970.jpg
 

硬件

Maduino Zero CAN-BUS 模块是Makerfabs 开发的CANbus 通讯工具,它基于Arduino,带有CAN 控制器和CAN 收发器,创建一个即用型CAN-bus 端口。

poYBAGN26SmAd5QsAAD5Zz-prqM894.jpg
 
  • MCP2515 是一款实现 CAN 规范的独立 CAN 控制器。它能够发送和接收标准和扩展数据以及远程帧。
  • MAX3051 是 CAN 协议控制器和控制器局域网 (CAN) 中总线物理线之间的接口。MAX3051为总线提供差分发送能力,为CAN控制器提供差分接收能力。

联系

 

pYYBAGN26SuAQqzIAAB5QFzwCIU579.jpg
 

用电线将 DHT11 模块连接到 Maduino Zero CAN-BUS 模块,用作支持 CAN 通信的仪器。同样,将显示器连接到模块以接收数据并显示。

Maduino Zero CANBUS与DHT11的连接:

Maduino Zero CANBUS -- DHT11
3v3 ------ VCC
GND ------ GND
D10 ------ DATA

Maduino Zero CANBUS与OLED的连接:

Maduino Zero CANBUS -- OLED
3v3 ------ VCC
GND ------ GND
SCL ------ SCL
SDA ------ SDA

使用 DB9 电缆连接两个 Maduino Zero CANBUS 模块。

代码

MAX3051完成差分电平到逻辑信号的转换。MCP2515完成数据编解码等CAN功能。MCU只需要初始化控制器和发送和接收数据。

  • Github:https://github.com/Makerfabs/Maduino-CANbus-RS485...
  • 安装 Arduino 后,没有包支持需要安装的板子(Arduino 零)。
  • 选择工具 -> Board -> Board Manager,搜索“Arduino zero”并安装“Arduino SAMD Boards”。
  • 选择 Tools -> Board -> Arduino Zero (Native USB Port),选择 Tools -> Port -> com…
  • 从 GitHub 获取程序后,需要确保所有文件都在项目目录下,其中包含支持 CANBUS 的库文件。
  • 安装 Adafruit 的 DHT 传感器库,用于驱动 DHT11 获取温度和湿度。
  • 在代码Test_DHT11.ino中使用不同的地址分别发送温度和湿度。
CAN.sendMsgBuf(0x10, 0, stmp1.length(), stmp_send1);
delay(500);
CAN.sendMsgBuf(0x11, 0, stmp2.length(), stmp_send2);
delay(500);

“0x10”表示消息ID,“0”表示标准帧,“stmp1.length()”表示消息长度,“stmp_send1”表示发送的数据。

  • 在代码Test_OLED.ino中,通过查询接收 CANBUS 上的所有消息,并将所需信息显示在 OLED 上。
  • 将程序Maduino-CANbus-RS485/Test_DHT11_OLED/Test_DHT11/Test_DHT11.ino上传到与传感器相连的模块,并将程序Maduino-CANbus RS485/Test_DHT11_OLED/Test_OLED/Test_OLED.ino 上传到另一个与 OLED 相连的模块。

节目

给两个模块上电,显示屏上会显示温度和湿度。

poYBAGN26TSAEHiDAA70UP1WFas353.jpg
 

 

poYBAGN26TuAZEy1ABBQN5Xnz5o588.jpg
 

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !