CAN 总线深入理解:从差分通信、节点仲裁到终端电阻
CAN 总线深入理解:从差分通信、节点仲裁到终端电阻
1. CAN 总线为什么适合机器人和电机控制?
在机器人、电动车、工业控制领域,经常需要一个控制器同时连接多个设备,例如:
- 多个电机
- 编码器
- 传感器
- 执行机构
如果每个设备都单独占用一组 UART,那么设备数量一多,线路会非常复杂。
CAN(Controller Area Network)就是为了解决这种多节点实时通信问题而设计的。
它最大的特点:
- 一根总线可以挂多个设备
- 多个设备可以主动发送数据
- 硬件自动解决通信冲突
- 具有较强抗干扰能力
这也是为什么汽车和 RoboMaster 机器人大量采用 CAN 通信。
2. CAN 总线的基本结构
一个完整的 CAN 节点通常包含:
MCU||CAN 控制器|CAN 收发器|CAN_H CAN_L|CAN 总线
例如 STM32:
- CPU 负责产生控制逻辑
- CAN 控制器负责 CAN 协议处理
- CAN 收发器负责电平转换
2.1 CAN 控制器是什么?
CAN 控制器不是单片机。
它更像 STM32 内部的一个通信模块。
类似:
- UART 控制器
- SPI 控制器
- I2C 控制器
- CAN 控制器
它负责:
- 生成 CAN 帧
- 计算 CRC
- 检测错误
- 自动仲裁
- 管理发送和接收
例如:
程序告诉 CAN 控制器:
我要发送 ID=0x201,数据长度8字节,数据内容XXXX
后面的事情:
- 加帧头
- 加校验
- 判断总线状态
由硬件自动完成。
2.2 CAN 收发器是什么?
CAN 控制器输出的是 MCU 内部数字信号:
例如:
0
1
0
1
但是 CAN 总线上需要的是:
CAN_H
CAN_L
两根差分电压信号。
所以需要 CAN 收发器。
例如:
- TJA1050
- SN65HVD系列
它负责:
数字信号
↓
差分电平
3. CAN 和 RS485 的区别
很多初学者会发现:
CAN 和 RS485 都是两根线,而且都是差分通信,它们是不是一样?
答案:
物理层类似,但是通信机制不同。
3.1 RS485
RS485 主要解决:
数据如何可靠传输
它只规定:
- 两根差分线
- 电气标准
但是:
谁发送?
什么时候发送?
数据代表什么?
需要上层协议决定。
例如:
RS485 + Modbus
结构:
主机↓RS485↓设备
一般采用:
主站询问
↓
从站回复
3.2 CAN
CAN 不仅规定电气层,还规定通信机制。
例如:
- 消息 ID
- 优先级
- 仲裁
- 错误检测
多个设备可以同时尝试发送。
CAN 自己解决冲突。
4. CAN 总线为什么只有两根通信线?
CAN 使用差分通信:
两根线:
CAN_HCAN_L
接收端判断:
CAN_H - CAN_L
的电压差。
而不是看:
某根线相对于 GND 是多少伏。
4.1 CAN 电平变化
典型高速 CAN:
隐性位(逻辑1)
CAN_H ≈ 2.5VCAN_L ≈ 2.5V差值≈0V
显性位(逻辑0)
CAN_H ≈3.5VCAN_L≈1.5V差值≈2V
CAN 的巧妙设计:
显性0可以覆盖隐性1。
5. CAN 为什么可以多个设备同时通信?
这是 CAN 最核心的地方:
总线仲裁机制
假设两个设备同时发送:
设备A:
发送1
设备B:
发送0
因为:
0 是显性
1 是隐性
所以总线上表现:
0
设备A检测:
自己发送:
1
但是总线:
0
于是知道:
有更高优先级的数据正在发送
A 自动停止。
B 继续发送。
整个过程:
- 不需要软件判断
- 不需要重新排队
- 硬件自动完成
6. CAN ID 是地址吗?
这是很多人的误区。
CAN ID 更准确叫:
报文标识符(Identifier)
它有两个作用:
作用1:区分消息
例如:
0x201代表1号电机反馈0x202代表2号电机反馈
STM32收到:
ID=0x203
就知道:
这是3号电机的数据。
作用2:决定优先级
CAN 仲裁:
ID越小,优先级越高。
例如:
0x100优先级高0x300优先级低
7. 四个电机如何区分?
假设:
四个 CAN 电机:
电机1ID=0x201电机2ID=0x202电机3ID=0x203电机4ID=0x204
它们发送:
速度
角度
温度
错误状态
主控收到数据:
看到 ID:
就知道:
谁发来的
8. 电机 ID 是怎么来的?
通常有几种方式:
方法1:厂家固定
例如 RoboMaster 电机。
协议规定:
电机1:0x201电机2:0x202
用户不能修改。
方法2:软件配置
工业 CAN 设备:
可以通过上位机修改:
例如:
设备地址:
1234
保存到内部 Flash。
方法3:拨码开关
一些设备:
直接通过硬件拨码设置地址。
9. 电机是主动发送还是被询问?
两种方式都有。
方式1:主动上报
例如 RoboMaster:
电机周期性发送:
角度速度电流温度
STM32只监听。
方式2:查询响应
类似 Modbus:
主机:
请告诉我速度
电机:
当前速度100rpm
具体采用哪种:
由设备协议决定。
CAN 本身不规定。
10. CAN 总线为什么需要120Ω终端电阻?
这是 CAN 布线非常重要的知识。
高速信号在线缆上传输时:
如果末端没有匹配:
会产生:
信号反射
类似:
水管突然堵住:
水流会反弹。
电信号也一样。
11. 什么叫阻抗匹配?
简单理解:
让信号看到:
前面的路和自己一样宽
不会突然遇到:
- 开路
- 突然变化
这样信号可以继续传播。
CAN 双绞线特性阻抗:
约:
120Ω
所以末端加:
120Ω电阻
让信号能量被吸收。
12. 120Ω电阻应该怎么接?
注意:
不是:
CAN_H 接一个120Ω
CAN_L 接一个120Ω
而是:
CAN_H||
120Ω||
CAN_L
也就是:
跨接 CAN_H 和 CAN_L。
13. 终端电阻应该放在哪里?
原则:
整条 CAN 网络两端各一个
例如:
STM32|电机1|电机2|电机3|电机4
那么:
STM32端120Ω电机4端120Ω
中间:
电机1、2、3
不要接。
14. 为什么中间节点不能接120Ω?
假设:
四个设备全部接120Ω:
等效阻抗会降低。
两个120Ω:
等效:
60Ω
多个:
越来越低。
结果:
- 总线负载增加
- 电流增大
- 信号幅度下降
- 通信不稳定
所以:
CAN 网络永远只需要两个终端电阻。
15. 短距离可以不接终端电阻吗?
例如:
四个电机距离:
10厘米以内。
实验:
可能可以通信。
但是工程:
不建议。
原因:
今天短:
明天可能:
- 加长线
- 加传感器
- 改布局
按照规范设计:
永远保留两个终端电阻。
16. CAN 总线拓扑结构
CAN 推荐:
总线型拓扑
例如:
================| | |电机1 电机2 电机3================
不推荐:
星型
例如:
电机1|电机2---STM32---电机3|电机4
原因:
分支过多:
容易产生反射。
17. RoboMaster STM32开发板中的CAN
RoboMaster C型开发板:
通常具有:
CAN1
CAN2
它们代表:
两套独立 CAN 网络。
例如:
CAN1:
底盘电机
CAN2:
云台电机
不是因为一条 CAN 必须有两个接口。
而是方便系统划分。
18. USB转CAN是什么?
USB转CAN设备:
本质:
电脑和 CAN 网络之间的转换器。
结构:
PC|USB控制器|CAN控制器|CAN收发器|CAN_H/CAN_L
用途:
- 查看 CAN 数据
- 调试电机
- 分析协议
19. 总结
CAN 最核心的几个知识点:
1.
CAN 是差分通信:
CAN_H + CAN_L
2.
CAN 不靠电压高低判断,而看差分。
3.
CAN 控制器负责:
- 仲裁
- CRC
- 错误检测
4.
CAN ID:
不是简单地址,而是报文标识符。
5.
ID越小:
优先级越高。
6.
CAN允许多个设备同时发送:
靠显性/隐性机制自动仲裁。
7.
CAN总线需要:
两个120Ω终端电阻。
8.
终端电阻:
接在物理总线两端。
9.
中间节点:
不要加终端电阻。
10.
CAN真正强大的地方:
不是“两根线”,而是:
它把多设备通信中的冲突处理、优先级管理、错误检测,都集成到了硬件里面。
这也是为什么 CAN 成为了机器人、电动车和工业控制领域最常用的通信方式之一。