AN总线中的电机ID、数据反馈与通信方式详解
CAN总线中的电机ID、数据反馈与通信方式详解
——从“电机是谁”到“电机怎么告诉主控自己的状态”
在学习 CAN 总线控制电机时,很多初学者都会遇到几个核心问题:
- 总线上挂了很多电机,主控怎么知道哪个数据属于哪个电机?
- 每个电机的 ID 是什么?谁分配的?
- 电机能不能主动告诉主控自己的速度和角度?
- 主控能不能主动询问电机?
- 多个电机同时通信会不会冲突?
这些问题其实都围绕 CAN 通信中的三个核心概念:
- 节点身份识别(ID)
- 数据帧区分
- 通信模式
下面从基础开始理解。
1. CAN总线上为什么需要ID?
CAN 总线最大的特点:
多个设备可以连接在同一组 CAN_H 和 CAN_L 线上。
例如:
CAN_H -------------------------------
| | | |
STM32 电机1 电机2 电机3
| | | |
CAN_L -------------------------------
所有设备都连接在同一条总线上。
那么问题来了:
如果电机1发送:
角度 = 30°
速度 = 500rpm
电机2发送:
角度 = 60°
速度 = 800rpm
STM32收到数据以后:
它怎么知道:
这个数据到底是谁发的?
这就需要 CAN ID。
2. CAN ID到底是什么?
很多人会把 CAN ID 理解成:
电机地址
这个理解不完全准确。
更准确地说:
CAN ID 是一条消息的标识符(Identifier)。
它主要有两个作用:
作用1:表示消息来源
例如 RoboMaster 电机协议规定:
电机1反馈:
ID = 0x201
电机2反馈:
ID = 0x202
电机3反馈:
ID = 0x203
电机4反馈:
ID = 0x204
那么 STM32 收到:
CAN ID = 0x203
它马上知道:
这是3号电机反馈的数据
然后解析:
角度
速度
电流
温度
作用2:决定通信优先级
CAN ID 还有一个非常重要的作用:
决定谁优先发送。
CAN采用:
非破坏性仲裁机制
例如:
两个设备同时发送:
设备A:
ID = 0x300
设备B:
ID = 0x100
因为:
0x100 < 0x300
所以:
0x100优先级更高
设备B继续发送。
设备A自动退出。
这就是 CAN 能够多个设备同时工作的原因。
3. 电机的ID是谁设置的?
这个问题非常关键。
一个 CAN 电机内部通常包含:
电机内部
+----------------+
MCU控制芯片
|
CAN协议程序
|
保存的ID
+----------------+
电机内部的软件需要知道:
自己是谁。
例如:
电机内部保存:
我的ID = 2号
那么它发送数据时:
就按照协议发送:
0x202
电机ID来源通常有几种方式:
方法1:厂家固定
很多机器人电机:
出厂时已经设置好了。
例如:
电机1 → 0x201
电机2 → 0x202
电机3 → 0x203
用户直接使用。
方法2:软件修改
一些工业电机支持:
通过电脑软件修改:
例如:
连接USB-CAN:
修改:
Motor ID:
1
保存。
重新上电后:
电机变成:
0x201
方法3:拨码开关设置
部分工业设备:
使用拨码开关:
例如:
0001 → 一号设备
0010 → 二号设备
0011 → 三号设备
设备启动时读取拨码。
4. 主控如何知道哪个电机的数据?
假设:
四个电机连接到 CAN 总线:
电机1
ID=0x201
电机2
ID=0x202
电机3
ID=0x203
电机4
ID=0x204
电机不断发送:
电机1:
ID:0x201
DATA:
角度
速度
电流
温度
电机2:
ID:0x202
DATA:
角度
速度
电流
温度
STM32收到所有数据:
收到ID=0x202
程序判断:
if(ID==0x202)
{
这是2号电机;
}
然后:
解析角度
解析速度
保存状态
所以:
CAN总线上并不是靠线的位置区分设备,而是靠ID区分设备。
5. 电机反馈数据是谁主动发送?
CAN通信有两种常见方式:
方式一:主动上报(主动反馈)
也叫:
周期发送
这是 RoboMaster 电机常用方式。
通信过程:
电机
↓
主动发送反馈
↓
STM32接收
例如:
每隔:
1ms
电机发送:
ID=0x201
角度=100°
速度=500rpm
电流=2A
STM32不用询问。
只需要监听:
0x201
0x202
0x203
0x204
即可。
类似:
你每天收到天气推送:
手机不用问:
天气APP主动告诉你。
方式二:查询-响应
另一种方式:
主控主动询问。
例如:
STM32发送:
请2号电机返回速度
电机收到:
然后回复:
我的速度是500rpm
流程:
STM32
发送请求
↓
电机
返回数据
这种方式:
工业设备比较常见。
例如:
Modbus RTU。
6. 查询时一定用同一个ID吗?
不是。
这个由协议规定。
例如:
方式A:
请求:
ID=0x100
数据:
查询2号电机速度
回复:
ID=0x202
表示:
二号电机回答。
也可能:
请求:
ID=0x200
回复:
ID=0x201
CAN本身没有规定:
必须:
请求ID = 回复ID
或者:
请求ID ≠ 回复ID
全部由协议设计。
7. RoboMaster电机为什么喜欢主动反馈?
因为机器人控制要求:
实时性高
例如:
底盘电机:
需要知道:
当前速度
当前位置
实际电流
如果采用查询:
STM32:
问一次
等待一次
再控制
会增加延迟。
主动反馈:
电机:
1ms发送一次状态
STM32:
实时获得状态
控制更加快速。
8. 一个完整的RoboMaster通信过程
例如:
STM32控制四个电机。
第一步:发送控制命令
STM32发送:
CAN ID:
0x200
数据:
电机1目标电流
电机2目标电流
电机3目标电流
电机4目标电流
第二步:电机执行
电机收到:
0x200
知道:
这是控制命令。
执行:
调整PWM
控制电流
转动
第三步:电机反馈
电机返回:
0x201
角度
速度
电流
0x202
角度
速度
电流
0x203
角度
速度
电流
0x204
角度
速度
电流
STM32:
根据ID:
分别保存:
motor1.speed
motor2.speed
motor3.speed
motor4.speed
9. CAN和RS485最大的区别
很多人会比较:
CAN:
两根线
RS485:
两根线
看起来一样。
但是区别很大。
RS485:
只负责:
电气传输
上层需要:
Modbus协议
解决:
谁发送
谁接收
CAN:
硬件已经集成:
设备识别
仲裁
错误检测
优先级管理
所以:
CAN天然适合:
- 汽车
- 机器人
- 电机控制
10. 最核心总结
1. 电机如何知道自己是谁?
靠:
内部保存的CAN ID
例如:
电机1 → 0x201
电机2 → 0x202
2. STM32如何知道谁发来的数据?
靠:
CAN报文中的ID
收到:
0x203
知道:
三号电机
3. 电机能主动发送速度角度吗?
可以。
叫:
主动反馈
RoboMaster通常采用这种方式。
4. STM32能主动询问电机吗?
可以。
叫:
查询-响应
但是否支持:
看厂家协议。
5. CAN ID是不是固定规则?
不是。
CAN标准只规定:
ID格式
仲裁规则
具体:
0x201代表谁
0x202代表什么
由设备厂家定义。
一句话总结:
CAN总线就像一条公共道路,所有电机都在这条路上传数据;CAN ID就是车辆牌照,STM32通过牌照知道是谁发来的信息,而电机是主动广播还是等待询问,则取决于厂家制定的通信协议。
对于 RoboMaster、电机控制、机器人开发来说,真正需要掌握的是:
CAN接线 → 波特率 → ID规划 → 控制帧 → 反馈帧 → 电机协议解析。

浙公网安备 33010602011771号