跳转至

MIT 轮询回复说明

本文说明 BXI 电机在 MIT 模式下的回复帧格式,以及 mit_aux_enable 打开后的 AUX 轮询回复解析方式。上位机周期发送 MIT 控制帧后,电机会返回一帧状态反馈;AUX 轮询数据复用回复帧最后两个字节。

除特别说明外,本文中的 CAN ID、数据字节、原始值和示例数值均使用十六进制。物理量、频率和单位换算结果会按十进制标出。

1. 使用前确认

MIT 回复由上位机发送 MIT 控制帧触发。电机会响应下面两类控制帧:

控制帧 CAN ID 说明
can_id 发给当前电机的单播 MIT 控制帧
0x7FF 广播 MIT 控制帧,电机按自身 can_id 取对应的 8 字节控制块

电机回复帧使用 master_id 作为 CAN ID。默认情况下:

master_id = can_id | 0x010

例如 can_id=1 时,默认 master_id=0x11,上位机应接收 CAN ID 为 0x11 的回复帧。修改 can_id 时,程序默认会同步更新 master_id;也可以通过寄存器单独修改 master_id。寄存器命令和寄存器表选择见“电机寄存器通信协议”和对应版本的寄存器表。

Warning

多电机同时使用 MIT 轮询时,应保证各电机的 master_id 不冲突。否则多个电机可能使用同一个 CAN ID 回复,上位机无法可靠区分来源。

2. MIT 回复帧格式

MIT 回复帧长度固定为 8 字节:

字段 内容
CAN ID master_id
DLC 8
data[0] 当前电机 can_id
data[1..5] 位置、速度、扭矩反馈
data[6..7] 默认温度反馈;打开 mit_aux_enable 后为 AUX 轮询数据

字节布局如下:

回复帧 data[0] data[1] data[2] data[3] data[4] data[5] data[6] data[7]
mit_aux_enable=0 ID POS[15:8] POS[7:0] VEL[11:4] VEL[3:0]TOR[11:8] TOR[7:0] NTC1 NTC2
mit_aux_enable=1 ID POS[15:8] POS[7:0] VEL[11:4] VEL[3:0]TOR[11:8] TOR[7:0] aux[15:8] aux[7:0]

这里的位置、速度、扭矩和 AUX 都是按位段拼接。具体拼接方式见文末“位段解析说明”。

3. 基础反馈解析

先从 data[1..5] 解析出原始值:

id_raw  = data[0]
pos_raw = (data[1] << 8) | data[2]
vel_raw = (data[3] << 4) | (data[4] >> 4)
tor_raw = ((data[4] & 0x0F) << 8) | data[5]

再按线性映射还原物理量:

value = raw * (max - min) / ((1 << bits) - 1) + min

各字段使用的范围如下。范围值来自电机配置,不同型号或配置可能不同,解析前建议读取对应配置或查看对应版本寄存器表。

字段 位宽 默认范围
POS 16 bit [-max_pos, max_pos],默认 [-12.5, 12.5] rad
VEL 12 bit [-max_vel, max_vel],默认 [-45.0, 45.0] rad/s
TOR 12 bit [-max_tor, max_tor],默认值随电机型号不同

常用解析公式:

position_rad = uint_to_float(pos_raw, -max_pos, max_pos, 16)
velocity_rad_s = uint_to_float(vel_raw, -max_vel, max_vel, 12)
torque_Nm = uint_to_float(tor_raw, -max_tor, max_tor, 12)

Note

正常运行时 TOR 表示扭矩反馈。打开电流测试相关功能时,该字段可能被程序用于返回 q 轴电流,具体以当前程序功能状态为准。

4. AUX 轮询回复解析

mit_aux_enable 控制 MIT 回复最后两个字节:

mit_aux_enable = 0 -> 旧协议:data[6]=NTC1,data[7]=NTC2,均为 8 bit 编码
mit_aux_enable = 1 -> AUX 轮询:data[6..7] 携带 aux_id + payload

mit_aux_enable 上电默认关闭,且不保存到 Flash。需要 AUX 轮询数据时,上位机需要在本次运行中写入 mit_aux_enable=1。当前查看到的程序中该配置项地址为 0x6D,不同配置版本仍应以对应寄存器表为准。

打开后,data[6..7] 解析为一个 16 bit AUX 字段:

aux = (data[6] << 8) | data[7]
aux_id = (aux >> 12) & 0x0F
payload = aux & 0x0FFF

等价拆法:

aux_id = data[6] >> 4
payload = ((data[6] & 0x0F) << 8) | data[7]

不要按“第几帧”固定判断数据类型;每帧都应先解析 aux_id,再按 aux_id 解释 payload

5. AUX 轮询顺序和频率

AUX ID 按下面顺序轮询:

0x0 -> 0x1 -> 0x2 -> 0x3 -> 0x4 -> 0x5 -> 0x6 -> 0x7 -> 0x8 -> 0x9 -> 0xF -> 0x0

AUX 总频率等于 MIT 回复频率;单项更新频率约为 MIT 回复频率除以 11。

MIT 回复频率 单项更新频率
1000 Hz 90.9 Hz
500 Hz 45.5 Hz
100 Hz 9.1 Hz

6. AUX 数据解析

aux_id 数据 payload 解析 通信范围 分辨率
0x0 NTC1 温度 temp_C = payload / 10.0 - 30.0 -30.0..150.0 C 0.1 C
0x1 NTC2 温度 temp_C = payload / 10.0 - 30.0 -30.0..150.0 C 0.1 C
0x2 绕组温度观测器 temp_C = payload / 10.0 - 30.0 -30.0..150.0 C 0.1 C
0x3 总线电压 v_bus v_bus = payload / 10.0 0.0..100.0 V 0.1 V
0x4 母线电流 i_bus_filt current_A = payload / 10.0 - 150.0 -150.0..150.0 A 0.1 A
0x5 q 轴电流 i_q_filt current_A = payload / 10.0 - 150.0 -150.0..150.0 A 0.1 A
0x6 d 轴电流 i_d_filt current_A = payload / 10.0 - 150.0 -150.0..150.0 A 0.1 A
0x7 程序状态和运行标志 见下方 bit 定义 0x000..0xFFF bitfield
0x8 温控降额系数 temper_coefficient coeff = payload / 1000.0 0.000..1.000 0.001
0x9 电压利用率 util = payload / 1000.0 0.000..2.000 0.001
0xF 心跳计数 heartbeat = payload 0..4095,循环 1

payload = 0xFFF 表示该数据无效或当前程序不支持。心跳 0xF 例外,因为它正常会循环到 0xFFF

解析 payload 时,先通过 aux_id 判断数据类型,再把 payload 作为无符号整数代入对应公式。表中的除法、偏移量和单位换算使用十进制计算。

温度类数据包括 aux_id=0x00x10x2

payload = 0x02BC = 700
temp_C = 700 / 10.0 - 30.0 = 40.0 C

电压数据 aux_id=0x3

payload = 0x0F0 = 240
v_bus = 240 / 10.0 = 24.0 V

电流类数据包括 aux_id=0x40x50x6

payload = 0x05DC = 1500
current_A = 1500 / 10.0 - 150.0 = 0.0 A

系数类数据包括 aux_id=0x80x9

payload = 0x02EE = 750
coeff = 750 / 1000.0 = 0.750
util = 750 / 1000.0 = 0.750

心跳 aux_id=0xF 不需要单位换算,payload 就是当前心跳计数。该计数会递增并在 12 bit 范围内循环,可用于判断 MIT 回复是否持续更新。

7. 状态字 0x7

aux_id=0x7 时,payload 为状态字:

bit0..3   FSM state
bit4      FOC armed
bit5      ENCI calib_valid
bit6      ENCO calib_valid
bit7      field_weaken_mode
bit8      mit_mode
bit9..11  control_mode

bit6 与外部输出编码器有关,在不支持该硬件或功能的程序中可能始终为 0。

FSM state 常见取值:

0  STARTUP
1  MENU
2  MOTOR
3  ENCI_AUTO
4  ENCI
5  ENCO
6  ENCI_SLS_AUTO
7  SETUP
8  ERROR
9  OPEN
10 SLS

8. 默认协议温度解析

mit_aux_enable=0 时,data[6]data[7] 不是 AUX 字段,而是两个 8 bit 温度值:

ntc1_C = data[6] * 180.0 / 255.0 - 30.0
ntc2_C = data[7] * 180.0 / 255.0 - 30.0

这种模式下只能从 MIT 回复直接得到 NTC1 和 NTC2 温度;其他 AUX 数据需要打开 mit_aux_enable 后读取。

9. 解析示例

假设收到一帧:

11#017FFF7FF7FF30F0

其中 CAN ID 0x11master_id,数据拆开为:

data[0] = 0x01
data[1] = 0x7F
data[2] = 0xFF
data[3] = 0x7F
data[4] = 0xF7
data[5] = 0xFF
data[6] = 0x30
data[7] = 0xF0

基础反馈原始值为:

pos_raw = 0x7FFF
vel_raw = 0x7FF
tor_raw = 0x7FF

如果 mit_aux_enable=1,最后两个字节解析为:

aux_id = 0x3
payload = 0x0F0

aux_id=0x3 表示总线电压,所以:

v_bus = 0x0F0 / 10.0 = 24.0 V

10. 位段解析说明

MIT 回复帧中的 POSVELTORaux 使用高位在前的位段拼接方式。解析时应按位移和掩码恢复原始值。

例如 data[6]=0x30data[7]=0xF0 时:

aux = (0x30 << 8) | 0xF0 = 0x30F0
aux_id = (0x30F0 >> 12) & 0x0F = 0x3
payload = 0x30F0 & 0x0FFF = 0x0F0

再按 aux_id 对应的公式解析 payload,即可得到实际物理量或状态字段。