C610电调CAN通信协议及使用指南
基本信息及资料
- 通信协议:C610电调采用CAN通信协议
- 协议参考文档:40. CAN—通讯实验 — [野火]STM32 HAL库开发实战指南——基于H743_Pro_V
- 硬件适配:Arduino Mega2560无CAN差分信号引脚,需外接MCP2515(实现CAN差分信号与SPI信号转换)
- 推荐库:GitHub - autowp/arduino-mcp2515(Arduino MCP2515 CAN接口库)
报文接收格式
用于向电调发送控制指令控制电调的电流输出,两个标识符(0x200和0x1FF)各自对应 控制4个ID的电调。控制转矩电流值范围-10000-0-10000,对应电调输出的转矩电流 范围-10-0-10A。
即0x200用于控制1-4号电调
数据域 | 内容 | 电调ID |
---|---|---|
DATA[0] | 控制电流值高8位 | 1 |
DATA[1] | 控制电流值低8位 | 1 |
DATA[2] | 控制电流值高8位 | 2 |
DATA[3] | 控制电流值低8位 | 2 |
DATA[4] | 控制电流值高8位 | 3 |
DATA[5] | 控制电流值低8位 | 3 |
DATA[6] | 控制电流值高8位 | 4 |
DATA[7] | 控制电流值低8位 | 4 |
0x1FF用于控制5-8号电调
数据域 | 内容 | 电调ID |
---|---|---|
DATA[0] | 控制电流值高8位 | 5 |
DATA[1] | 控制电流值低8位 | 5 |
DATA[2] | 控制电流值高8位 | 6 |
DATA[3] | 控制电流值低8位 | 6 |
DATA[4] | 控制电流值高8位 | 7 |
DATA[5] | 控制电流值低8位 | 7 |
DATA[6] | 控制电流值高8位 | 8 |
DATA[7] | 控制电流值低8位 | 8 |
报文反馈格式
数据域定义
数据索引 | 内容 |
---|---|
DATA[0] | 转子机械角度高8位 |
DATA[1] | 转子机械角度低8位 |
DATA[2] | 转子转速高8位 |
DATA[3] | 转子转速低8位 |
DATA[4] | 实际输出转矩高8位 |
DATA[5] | 实际输出转矩低8位 |
DATA[6] | Null |
DATA[7] | Null |
接收数据时的CANID若为0x201
则为ID为1的电调的数据,以此类推。
若是ID为0x1FF+ID
则为ID为5-8的电调的数据。
关键参数
- 发送频率:默认1KHz(可通过RoboMaster Assistant软件修改)
- 转子机械角度范围:0
8191(对应物理角度0360°) - 转子转速单位:rpm(转/分钟)
高8位与低8位的理解
C610电调中16位数据会拆分为高8位和低8位传输,具体说明如下:
数据拆分逻辑:
16位原始数据(如二进制0011 0000 1100 0100
)拆分为:- 高8位:
0011 0000
(通过16位数据右移8位获取:原始数据 >> 8
) - 低8位:
1100 0100
(直接截取原始数据的低8位)
- 高8位:
赋值方式:
高8位赋值给DATA[n]
,低8位赋值给DATA[n+1]
(如角度数据中,DATA[0]
存高8位,DATA[1]
存低8位)
CAN数据包解析方法
解析接收的CAN数据是拆分过程的逆操作,步骤如下:
- 将高8位数据(如
DATA[0]
)转换为16位变量(自动补高位0,例:0011 0000
→0000 0000 0011 0000
); - 将高8位数据左移8位(例:
0000 0000 0011 0000 << 8
→0011 0000 0000 0000
); - 与低8位数据(如
DATA[1]
)相加,还原16位原始数据(例:0011 0000 0000 0000 + 1100 0100
→0011 0000 1100 0100
); - 转换为十进制输出即得目标数据。
示例程序
1 |
|