AN总线中的电机ID、数据反馈与通信方式详解

CAN总线中的电机ID、数据反馈与通信方式详解

——从“电机是谁”到“电机怎么告诉主控自己的状态”

在学习 CAN 总线控制电机时,很多初学者都会遇到几个核心问题:

  • 总线上挂了很多电机,主控怎么知道哪个数据属于哪个电机?
  • 每个电机的 ID 是什么?谁分配的?
  • 电机能不能主动告诉主控自己的速度和角度?
  • 主控能不能主动询问电机?
  • 多个电机同时通信会不会冲突?

这些问题其实都围绕 CAN 通信中的三个核心概念:

  1. 节点身份识别(ID)
  2. 数据帧区分
  3. 通信模式

下面从基础开始理解。


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规划 → 控制帧 → 反馈帧 → 电机协议解析。

posted @ 2026-07-25 21:31  wangya216  阅读(22)  评论(0)    收藏  举报