Fashion Star CANBUS 舵机通信协议说明书
1. 文档说明
1.1 适用产品
适用产品
本文档适用于 Fashion Star CANBUS 系列舵机。
不同型号的额定电压、输出能力、温度传感器及部分参数范围可能不同。涉及具体机型差异时,应同时参考对应产品规格书。
本说明书按“先连接、再查表、后控制”的顺序编排。首次使用建议先阅读第 2 章;需要开发程序时重点查阅第 4~6 章;需要执行运动、停止或配置操作时查阅第 7~9 章。
1.2 适用对象
适用对象
- 舵机设备使用人员
- 机器人及自动化系统集成人员
- 上位机和 CAN 主控程序开发人员
- 产品调试、测试与维护人员
1.3 协议版本
| 项目 | 内容 |
|---|---|
| 协议名称 | Fashion Star CANBUS 舵机通信协议 |
| 协议版本 | V1.1.1 |
| 发布日期 | 2026-08-05 |
| CAN 类型 | Classical CAN |
| CAN 帧格式 | CAN 2.0A 标准数据帧 |
1.4 文档符号说明
| 符号 | 含义 |
|---|---|
0x12 |
十六进制数 |
Data[n] |
CAN 数据区第 n+1 个字节 |
ServoID |
舵机编号 |
DLC |
CAN 数据区实际字节数 |
R |
可读 |
W |
可写 |
R/W |
可读写 |
— |
无、未定义或不适用 |
1.5 使用注意事项
使用注意事项
- 本协议使用 11 位标准 CAN 数据帧,不使用扩展帧、远程帧或 CAN-FD。
- 主控和舵机必须配置为相同的 CAN 波特率。
- 多字节参数均采用小端序,低字节在前。
- 角度、速度等参数需要按本文规定的比例换算,不能直接把原始值当作工程量。
- 修改舵机编号、CAN 波特率、零点、圈数及 PID 参数前,应确认目标舵机和机械结构处于安全状态。
- 同一总线中存在多个舵机时,不应广播会产生响应的读取或写后回传命令。
2. 快速开始
2.1 CAN 接口与通信条件
CAN 总线应包含 CAN_H、CAN_L 和公共参考地。总线两端应按系统设计配置终端电阻,常见值为 120 Ω。
主控与舵机必须满足:
- CAN_H 对接 CAN_H;
- CAN_L 对接 CAN_L;
- CAN 波特率一致;
- 主控发送和接收均使用标准数据帧;
- CAN ID 设置为
0x321。
2.2 默认通信参数
| 项目 | 默认值 |
|---|---|
| CAN 波特率 | 500 Kbps |
| CAN ID | 0x321 |
| 帧格式 | 11 位标准数据帧 |
| 帧类型 | 数据帧 |
| 最大 DLC | 8 Byte |
| 普通舵机 ID 范围 | 0~254 |
2.3 CAN 标准帧格式
主控发送命令和舵机返回数据均使用:
CAN ID = 0x321
IDE = Standard(标准帧)
RTR = Data(数据帧)
舵机编号不放在 CAN ID 中,而是放在 CAN 数据区的 Data[1]。
2.4 舵机 ID 与 CAN ID 的区别
| 项目 | CAN ID | ServoID |
|---|---|---|
| 用途 | CAN 总线仲裁标识符 | 区分同一总线上的不同舵机 |
| 本协议位置 | CAN 帧标识符 | CAN 数据区 Data[1] |
| 本协议取值 | 固定 0x321 |
0~254 |
例如,读取舵机 ID 1 和舵机 ID 2 时,CAN ID 都是 0x321,区别仅在数据区第二个字节。
2.5 第一次读取舵机
以默认 500 Kbps、舵机 ID 1 为例,读取舵机型号地址 0x01:
TX CAN ID=0x321 DLC=3 Data: 72 01 01
正常响应格式:
RX CAN ID=0x321 DLC=5 Data: 76 01 01 LL HH
其中:
0x72:读取一个参数;0x01:目标 ServoID;0x01:舵机型号参数地址;LL HH:型号参数低字节和高字节。
收到正确响应表示 CAN 接线、波特率、CAN ID 和舵机编号基本配置正确。
2.6 使用配套上位机连接舵机
使用 Fashion Star 配套转接板及 CANBUS Servo 上位机时:
- 将转接板连接电脑;
- 将转接板 CAN_H、CAN_L 与舵机正确连接;
- 为舵机提供符合规格的电源;
- 在支持 Web Serial 的浏览器中打开上位机;
- 点击“连接串口”;
- 选择舵机当前 CAN 波特率;
- 设置扫描范围并开始扫描;
- 扫描到舵机后选择目标 ID,再进行监控、控制或参数配置。
3. 通信协议基础
3.1 CAN 帧参数
| 项目 | 规定 |
|---|---|
| CAN 类型 | Classical CAN |
| 帧格式 | CAN 2.0A 标准帧 |
| 标识符长度 | 11 bit |
| CAN ID | 0x321 |
| 帧类型 | 数据帧 |
| 数据长度 | 由命令决定,最大 8 Byte |
| 扩展帧 | 不使用 |
| 远程帧 | 不使用 |
| CAN-FD | 不使用 |
3.2 CAN 数据区结构
公开命令统一以命令字开头:
Data[0] = Command
Data[1] = ServoID
Data[2...] = Address、Value 等命令参数
不同命令的具体 DLC 和字段顺序见第 4 章。
3.3 字节编号
本文采用从 0 开始的数据区编号:
Data[0] Data[1] Data[2] ... Data[7]
部分原始资料可能将其写为 Byte1~Byte8,两者对应关系如下:
Byte1 = Data[0]
Byte2 = Data[1]
...
Byte8 = Data[7]
3.4 命令字
命令字为 ASCII 字符对应的十六进制值,并区分大小写。例如:
| ASCII | Hex | 功能 |
|---|---|---|
r |
0x72 |
读取一个参数 |
R |
0x52 |
读取两个参数 |
w |
0x77 |
写入一个参数 |
W |
0x57 |
写入两个参数 |
r 与 R、w 与 W 是不同命令,不能混用。
3.5 舵机 ID
- 普通 ServoID 范围为
0x00~0xFE,即十进制0~254。 0xFF为广播 ID,仅用于执行已经分别缓存到各舵机中的同步运动。- 读取命令和需要响应的命令不得使用广播 ID。
3.6 16 位参数与小端序
16 位参数按低字节在前发送:
Value16 = ValueLow | (ValueHigh << 8)
例如,十六进制值 0x1234 的数据顺序为:
34 12
3.7 32 位参数组合
32 位参数由两个相邻的 16 位地址组成:
Value32 = WordLow | (WordHigh << 16)
低地址保存低 16 位,高地址保存高 16 位。每个 16 位字仍按低字节在前发送。
例如,目标角度由 0x53/0x54 组成:
0x53 = 低 16 位
0x54 = 高 16 位
3.8 有符号数编码
单圈角度、目标角度和角度限制参数使用二进制补码表示。解析时应根据参数类型转换为:
- signed 16-bit;或
- signed 32-bit。
负角度不得转换为 0~360° 后发送。
3.9 响应匹配与超时处理
主控收到响应后至少应校验:
- CAN ID 是否为
0x321; - DLC 是否符合命令定义;
- 响应命令字是否正确;
- ServoID 是否与请求一致;
- 参数地址是否与请求一致;
- 双参数响应中的两个地址和顺序是否一致。
通信超时和重试次数可由主控根据总线负载设置。建议避免在上一次请求尚未完成时发送会产生响应的新请求。
4. 命令及封包格式
4.1 命令总览表
| ASCII | Hex | 方向 | 功能 | DLC | 响应 |
|---|---|---|---|---|---|
r |
0x72 |
主控→舵机 | 读取一个参数 | 3 | v,DLC=5 |
R |
0x52 |
主控→舵机 | 读取两个参数 | 4 | V,DLC=8 |
w |
0x77 |
主控→舵机 | 写入一个参数 | 5 | 无响应 |
W |
0x57 |
主控→舵机 | 写入两个参数 | 8 | 无响应 |
x |
0x78 |
主控→舵机 | 写入一个参数并回传 | 5 | v,DLC=5 |
X |
0x58 |
主控→舵机 | 写入两个参数并回传 | 8 | V,DLC=8 |
Q |
0x51 |
主控→舵机 | 开始连续写入 | 2 | 无响应 |
q |
0x71 |
主控→舵机 | 结束连续写入并提交 | 2 | 无响应 |
v |
0x76 |
舵机→主控 | 单参数响应 | 5 | — |
V |
0x56 |
舵机→主控 | 双参数响应 | 8 | — |
4.2 读取一个参数 r/v
请求格式:
| Data[0] | Data[1] | Data[2] |
|---|---|---|
0x72 |
ServoID | Address |
响应格式:
| Data[0] | Data[1] | Data[2] | Data[3] | Data[4] |
|---|---|---|---|---|
0x76 |
ServoID | Address | ValueLow | ValueHigh |
示例:读取 ID 1 的 0x18 单圈角度:
TX DLC=3: 72 01 18
RX DLC=5: 76 01 18 LL HH
4.3 读取两个参数 R/V
请求格式:
| Data[0] | Data[1] | Data[2] | Data[3] |
|---|---|---|---|
0x52 |
ServoID | AddressA | AddressB |
响应格式:
| Data[0] | Data[1] | Data[2] | Data[3] | Data[4] | Data[5] | Data[6] | Data[7] |
|---|---|---|---|---|---|---|---|
0x56 |
ServoID | AddressA | ValueA_L | ValueA_H | AddressB | ValueB_L | ValueB_H |
示例:读取 ID 1 的多圈角度低字和高字:
TX DLC=4: 52 01 15 16
RX DLC=8: 56 01 15 L0 L1 16 H0 H1
4.4 写入一个参数 w
封包格式:
| Data[0] | Data[1] | Data[2] | Data[3] | Data[4] |
|---|---|---|---|---|
0x77 |
ServoID | Address | ValueLow | ValueHigh |
该命令写入后不返回响应。
示例:向 ID 1 的地址 0x7B 写入停止锁力 0x0011:
77 01 7B 11 00
4.5 写入一个参数并回传 x/v
请求格式:
78 ServoID Address ValueLow ValueHigh
响应格式:
76 ServoID Address ActualValueLow ActualValueHigh
响应返回舵机写入后的实际参数值。主控应比较实际返回值与目标值,不能只依据收到响应就判断写入值完全一致。
4.6 写入两个参数 W
封包格式:
| Data[0] | Data[1] | Data[2] | Data[3] | Data[4] | Data[5] | Data[6] | Data[7] |
|---|---|---|---|---|---|---|---|
0x57 |
ServoID | AddressA | ValueA_L | ValueA_H | AddressB | ValueB_L | ValueB_H |
该命令写入后不返回响应。
4.7 写入两个参数并回传 X/V
请求格式:
58 ServoID AddressA ValueA_L ValueA_H AddressB ValueB_L ValueB_H
响应格式:
56 ServoID AddressA ActualA_L ActualA_H AddressB ActualB_L ActualB_H
4.8 开始连续写入 Q
51 ServoID
舵机收到该命令后进入连续写入缓存模式。
4.9 结束连续写入 q
71 ServoID
舵机收到该命令后提交缓存内容并结束连续写入。
连续写入规则:
- 缓存区最多接收 8 组
w或W写入; - 缓存期间
x/X分别等同于w/W,不产生响应; - 缓存期间允许使用
r/R读取参数; - 第 8 组写入后,舵机会自动写入当前缓存内容;
- 为兼容不同固件,主控仍应显式发送
q收尾; Q、写入和q应使用相同的 ServoID。
4.10 广播执行规则
ServoID=0xFF 仅允许用于同步执行已经分别缓存到多颗舵机中的运动指令。
广播执行不产生响应。读取、普通写入、参数配置和保护区操作不得使用 0xFF 广播。
5. 内存表
5.1 表格说明
内存表使用以下字段:
| 字段 | 含义 |
|---|---|
| 地址 | 参数地址 |
| 参数名称 | 参数用途 |
| 类型 | 原始数据类型 |
| 权限 | 可读、可写或只写 |
| 单位/范围 | 工程单位及有效范围 |
| 生效方式 | 写入后立即生效、执行或需要重新上电 |
| 备注 | 补充说明 |
未明确工程单位的参数应按原始 16 位值处理,不应自行换算。
5.2 内存地址总览
| 地址范围 | 分类 |
|---|---|
0x01~0x04 |
设备信息 |
0x10~0x18 |
实时状态 |
0x28 |
运动阻尼模式 |
0x50~0x59 |
角度运动控制 |
0x78~0x7B |
参数复位、校准与停止控制 |
0x80~0x90 |
通信、保护与启动配置 |
0x91~0x93 |
角度限制 |
0xC8~0xD5 |
PID 与受保护参数 |
0xFF |
保护区解锁控制 |
5.3 设备信息参数 0x01~0x04
| 地址 | 参数名称 | 类型 | 权限 | 单位/范围 | 生效方式 | 备注 |
|---|---|---|---|---|---|---|
0x01 |
舵机型号 | uint16 | R | 型号编码 | — | 只读 |
0x02 |
固件版本 | uint16 | R | 版本编码 | — | |
0x03 |
舵机序号低字 | uint16 | R | — | — | 序号低 16 位 |
0x04 |
舵机序号高字 | uint16 | R | — | — | 序号高 16 位 |
5.4 实时状态参数 0x10~0x18
| 地址 | 参数名称 | 类型 | 权限 | 单位/范围 | 生效方式 | 备注 |
|---|---|---|---|---|---|---|
0x10 |
舵机电压 | uint16 | R | 型号相关 | 实时更新 | 换算方式以具体型号为准 |
0x11 |
舵机电流 | uint16 | R | 型号相关 | 实时更新 | 换算方式以具体型号为准 |
0x12 |
舵机功率 | uint16 | R | 型号相关 | 实时更新 | 换算方式以具体型号为准 |
0x13 |
舵机温度 | uint16 | R | 型号相关 | 实时更新 | 换算方式以具体型号为准 |
0x14 |
舵机状态 | uint16 | R | 位标志 | 实时更新 | 低 8 位见第 6.8 节 |
0x15 |
多圈当前角度低字 | uint16 | R | 0.1° |
实时更新 | 与 0x16 组成 signed 32-bit |
0x16 |
多圈当前角度高字 | uint16 | R | 0.1° |
实时更新 | 与 0x15 组成 signed 32-bit |
0x17 |
当前圈数 | 16-bit | R | 圈 | 实时更新 | 方向及溢出规则以具体型号为准 |
0x18 |
单圈当前角度 | signed 16-bit | R | -180.0°~180.0° |
实时更新 | 原始单位 0.1° |
5.5 运动阻尼参数 0x28
| 地址 | 参数名称 | 类型 | 权限 | 单位/范围 | 生效方式 | 备注 |
|---|---|---|---|---|---|---|
0x28 |
运动阻尼模式功率 | uint16 | R/W | 0~1000 mW |
写入后立即执行 | 独立运动模式,不是停止阻尼功率 |
向 0x28 写入功率后,舵机立即进入运动阻尼模式,不需要再写 0x59 或 0x7B。
5.6 角度运动参数 0x50~0x59
| 地址 | 参数名称 | 类型 | 权限 | 单位/范围 | 生效方式 | 备注 |
|---|---|---|---|---|---|---|
0x50 |
到目标角度时间低字 | uint16 | R/W | ms | 参数写入 | 与 0x51 组成 uint32 |
0x51 |
到目标角度时间高字 | uint16 | R/W | ms | 参数写入 | 与 0x50 组成 uint32 |
0x52 |
运动模式 | uint16 | R/W | 0/1/2 |
参数写入 | 见第 7 章 |
0x53 |
目标角度低字 | uint16 | R/W | 0.1° |
参数写入 | 与 0x54 组成 signed 32-bit |
0x54 |
目标角度高字 | uint16 | R/W | 0.1° |
参数写入 | 与 0x53 组成 signed 32-bit |
0x55 |
角度模式执行功率 | uint16 | R/W | 0~65535 mW |
参数写入 | 停止阻尼时限定为 0~1000 mW |
0x56 |
启动加速时间 | uint16 | R/W | ms | 参数写入 | 加减速模式使用 |
0x57 |
接近目标减速时间 | uint16 | R/W | ms | 参数写入 | 加减速模式使用 |
0x58 |
最大速度 | uint16 | R/W | 0.1°/s |
参数写入 | 速度模式使用 |
0x59 |
执行角度运动 | uint16 | R/W | 0/1 |
写 1 执行 |
执行 0x50~0x58 参数 |
5.7 复位、校准与停止参数 0x78~0x7B
| 地址 | 参数名称 | 类型 | 权限 | 写入值 | 生效方式 | 备注 |
|---|---|---|---|---|---|---|
0x78 |
参数恢复出厂设定 | uint16 | W | 1 |
写入即执行 | 恢复参数出厂设定 |
0x79 |
清除当前圈数 | uint16 | W | 1 |
写入即执行 | 清除多圈计数 |
0x7A |
零点设定旗标 | uint16 | W | 0:当前位置设为零点;非零值:恢复出厂设定的零点 |
写入即执行 | 非零值只恢复出厂零点,不恢复其他参数 |
0x7B |
停止模式 | uint16 | W | 0x10/0x11/0x12 |
写入即执行 | 见第 8 章 |
5.8 通信、保护与启动配置 0x80~0x90
| 地址 | 参数名称 | 类型 | 权限 | 单位/范围 | 生效方式 | 备注 |
|---|---|---|---|---|---|---|
0x80 |
控制回应 | uint16 | R/W | 型号相关 | 型号相关 | 不同型号定义可能不同 |
0x81 |
舵机编号 | uint16 | R/W | 0~254 |
立即生效 | 后续通信使用新 ID |
0x82 |
CAN 波特率索引 | uint16 | R/W | 0~9 |
固件相关 | 可能立即生效或重新上电生效 |
0x83 |
堵转保护功能 | uint16 | R/W | 0=关闭,1=开启 |
写入配置 | — |
0x84 |
堵转功率上限 | uint16 | R/W | 0~65535 mW |
写入配置 | — |
0x85 |
低压保护电压 | uint16 | R/W | 0~65535 mV |
写入配置 | — |
0x86 |
高压保护电压 | uint16 | R/W | 0~65535 mV |
写入配置 | — |
0x87 |
温度保护值 | uint16 | R/W | 型号相关 | 写入配置 | 原始值换算以具体型号为准 |
0x88 |
功率保护值 | uint16 | R/W | 0~65535 mW |
写入配置 | — |
0x89 |
电流保护值 | uint16 | R/W | 0~65535 mA |
写入配置 | — |
0x8A |
加速度 | uint16 | R/W | 型号相关 | 写入配置 | 原始 16 位参数 |
0x8B |
功率保护迟滞 | uint16 | R/W | 0 或 50~99% |
写入配置 | 0 表示取消 |
0x8C |
上电锁力开关 | uint16 | R/W | 0=关闭,1=开启 |
写入配置 | — |
0x8E |
角度限制开关 | uint16 | R/W | 0=关闭,1=开启 |
写入配置 | 与 0x91~0x93 配合 |
0x8F |
上电缓启动开关 | uint16 | R/W | 0=关闭,1=开启 |
写入配置 | — |
0x90 |
上电缓启动时间 | uint16 | R/W | 0~65535 ms |
写入配置 | — |
5.9 角度限制参数 0x91~0x93
| 地址 | 参数名称 | 类型 | 权限 | 单位/范围 | 生效方式 | 备注 |
|---|---|---|---|---|---|---|
0x91 |
角度上限 | signed 16-bit | R/W | 0.1° |
写入配置 | 与角度限制开关配合 |
0x92 |
角度下限 | signed 16-bit | R/W | 0.1° |
写入配置 | 与角度限制开关配合 |
0x93 |
中点偏移 | signed 16-bit | R/W | 0.1° |
写入配置 | — |
5.10 PID 与受保护参数 0xC8~0xD5
| 地址 | 参数名称 | 类型 | 权限 | 单位/范围 | 生效方式 | 备注 |
|---|---|---|---|---|---|---|
0xC8 |
Kp | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xC9 |
Kd | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xCA |
Ki | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xCB |
PwmBias | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xCC |
HoldKp | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xCD |
HoldKd | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xCE |
HoldPwmBias | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xCF |
FullDeg | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xD0 |
PwmLimit | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xD1 |
NegativeDirectionMap | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xD2 |
PwmFreq | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xD3 |
DeadBand | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xD4 |
MotorDirMap | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
0xD5 |
VersionInfo | uint16 | R/W,受保护 | 型号相关 | 解锁后操作 | — |
除非具有对应机型的调试资料,否则不建议修改受保护参数。
5.11 保护区解锁地址 0xFF
解锁保护区:
77 ServoID FF E6 00
并在 500 ms 内发送:
77 ServoID FF 09 00
完成保护区读取或写入后重新上锁:
77 ServoID FF 00 00
解锁状态保持到主动重新上锁或舵机重新上电。部分固件在未解锁时读取保护区会返回格式正确但数值为 0 的响应,因此可靠读取 PID 参数前也应执行解锁流程。
6. 参数编码与状态解析
6.1 单圈角度编码
单圈角度地址为 0x18,原始类型为 signed 16-bit,单位为 0.1°:
AngleDegree = signed16(RawValue) / 10
有效工程范围:
-180.0°~180.0°
6.2 多圈角度编码
多圈角度由 0x15/0x16 组成 signed 32-bit:
Raw32 = Word_0x15 | (Word_0x16 << 16)
AngleDegree = signed32(Raw32) / 10
6.3 目标角度编码
目标角度由 0x53/0x54 组成 signed 32-bit:
RawAngle = round(AngleDegree × 10)
WordLow = RawAngle & 0xFFFF
WordHigh = (RawAngle >> 16) & 0xFFFF
当前产品支持目标角度范围:
-368640.0°~368640.0°(±1024 圈)
6.4 时间参数编码
0x50/0x51:uint32,单位 ms;0x56:uint16,单位 ms;0x57:uint16,单位 ms。
速度模式不使用、不发送运动时间内存地址 0x50/0x51;命令字 Q=0x51 仍仅用于连续写入流程,二者不是同一概念。
6.5 速度参数编码
最大速度地址为 0x58,原始单位为 0.1°/s:
RawSpeed = round(SpeedDegreePerSecond × 10)
6.6 功率参数编码
| 地址 | 功能 | 单位/范围 |
|---|---|---|
0x28 |
运动阻尼模式功率 | 0~1000 mW,写入即执行 |
0x55 |
角度模式执行功率 | 0~65535 mW |
0x55 |
停止阻尼功率 | 停止阻尼场景限定为 0~1000 mW |
6.7 电压、电流、功率与温度
0x10~0x13 返回 16 位原始测量值。不同机型可能使用不同传感器或换算参数,工程量换算应以具体型号资料为准。
使用 Fashion Star 配套上位机时,上位机会根据当前支持机型进行换算和显示。
6.8 状态寄存器位定义
地址 0x14 的低 8 位定义如下:
| 位 | 状态 | 置 1 条件 | 清零条件 |
|---|---|---|---|
| BIT0 | 执行指令中 | 正在执行运动指令 | 执行完成后自动清零 |
| BIT1 | 执行错误 | 运动指令执行错误 | 下一次正确执行后清零 |
| BIT2 | 堵转错误 | 检测到堵转 | 堵转解除后清零 |
| BIT3 | 电压过高 | 电压高于保护阈值 | 电压恢复正常后清零 |
| BIT4 | 电压过低 | 电压低于保护阈值 | 电压恢复正常后清零 |
| BIT5 | 电流错误 | 电流保护触发 | 电流恢复正常后清零 |
| BIT6 | 功率错误 | 功率保护触发 | 功率恢复正常后清零 |
| BIT7 | 温度错误 | 温度保护触发 | 温度恢复正常后清零 |
BIT8~BIT15 当前版本未定义,接收端应忽略。
7. 运动控制
7.1 运动控制流程
角度运动的一般流程:
- 写入运动模式
0x52; - 写入目标角度
0x53/0x54; - 根据模式写入时间、加减速或速度参数;
- 写入执行功率
0x55; - 向
0x59写入1执行运动。
参数也可以使用第 4.8、4.9 节的连续写入方式统一提交。
7.2 简易模式
0x52 = 0
使用参数:
- 目标角度
0x53/0x54; - 运动时间
0x50/0x51; - 执行功率
0x55; - 执行指令
0x59=1。
7.3 基于时间的加减速模式
0x52 = 1
使用参数:
- 目标角度
0x53/0x54; - 运动时间
0x50/0x51; - 加速时间
0x56; - 减速时间
0x57; - 执行功率
0x55; - 执行指令
0x59=1。
7.4 基于速度的加减速模式
0x52 = 2
使用参数:
- 目标角度
0x53/0x54; - 最大速度
0x58; - 加速时间
0x56; - 减速时间
0x57; - 执行功率
0x55; - 执行指令
0x59=1。
7.5 三种运动模式参数对照表
| 参数 | 简易模式 | 时间加减速模式 | 速度加减速模式 |
|---|---|---|---|
模式 0x52 |
0 |
1 |
2 |
目标角度 0x53/0x54 |
使用 | 使用 | 使用 |
执行功率 0x55 |
使用 | 使用 | 使用 |
运动时间 0x50/0x51 |
使用 | 使用 | 不使用 |
加速时间 0x56 |
不使用 | 使用 | 使用 |
减速时间 0x57 |
不使用 | 使用 | 使用 |
最大速度 0x58 |
不使用 | 不使用 | 使用 |
执行 0x59=1 |
使用 | 使用 | 使用 |
7.6 单圈与多圈目标角度
目标角度统一通过 0x53/0x54 发送有符号 0.1° 数据。
- 单圈应用建议限制在
-180.0°~180.0°; - 多圈应用当前产品支持
-368640.0°~368640.0°; - 负角度直接按 signed 32-bit 补码发送。
7.7 执行运动
所有必要运动参数写入后:
77 ServoID 59 01 00
即向 0x59 写入 1 执行运动。
7.8 运动阻尼模式 0x28
运动阻尼模式是一种独立运动方式,不使用目标角度、运动时间或 0x59。
向 0x28 写入 0~1000 mW 后立即执行:
77 ServoID 28 PowerLow PowerHigh
7.9 连续写入与同步运动
单颗舵机可使用 Q/q 缓存并统一提交运动参数:
51 01
57 01 53 AL0 AL1 54 AH0 AH1
57 01 50 TL0 TL1 51 TH0 TH1
77 01 52 00 00
77 01 55 PL PH
77 01 59 01 00
71 01
7.10 广播执行多个舵机
多舵机同步运动时,应先分别向每颗舵机缓存运动参数,再使用广播 ID 0xFF 执行已缓存运动。
广播不产生响应。不要使用广播读取参数或执行普通写后回传操作。
8. 停止与校准控制
8.1 停止卸力
停止运动并释放输出:
77 ServoID 7B 10 00
8.2 停止锁力
停止运动并保持当前位置:
77 ServoID 7B 11 00
8.3 停止阻尼
停止阻尼的功率来自 0x55。必须先写入 0~1000 mW,再发送停止阻尼命令:
77 ServoID 55 PowerLow PowerHigh
77 ServoID 7B 12 00
两帧应连续、按顺序发送。如果功率写入失败或数值超出范围,不应继续发送 0x7B=0x12。
8.4 运动阻尼与停止阻尼的区别
| 功能 | 功率地址 | 功率范围 | 执行方式 |
|---|---|---|---|
| 运动阻尼模式 | 0x28 |
0~1000 mW |
写入功率后立即执行 |
| 停止阻尼 | 0x55 |
0~1000 mW |
先写功率,再写 0x7B=0x12 |
两种阻尼功能不能混用。0x28 不是停止阻尼功率地址。
8.5 清除多圈圈数
77 ServoID 79 01 00
该操作会改变多圈位置基准,应确认机械结构安全后执行。
8.6 零点设定 0x7A
0x7A 根据写入值执行两种零点操作:
| 写入值 | 功能 | 示例 |
|---|---|---|
0 |
将舵机当前位置设置为零点 | 77 ServoID 7A 00 00 |
| 非零值 | 恢复产品出厂设定的零点 | 77 ServoID 7A 01 00 |
写入非零值只恢复出厂零点,不会恢复其他用户参数。
进行零点设定前,应确认机械结构安全,并先使舵机进入停止卸力或停止阻尼状态。
8.7 恢复参数出厂设定 0x78
向 0x78 写入 1:
77 ServoID 78 01 00
9. 舵机配置
9.1 修改舵机 ID
舵机编号地址为 0x81,有效范围 0~254。
示例:将 ID 1 修改为 ID 2:
78 01 81 02 00
新 ID 立即生效。写入成功后,后续通信必须使用新 ID 2。
9.2 修改 CAN 波特率
CAN 波特率地址为 0x82,写入波特率索引。
示例:将 ID 1 修改为 1 Mbps,索引为 9:
78 01 82 09 00
9.3 波特率生效时机
不同舵机固件可能采用以下任一种方式:
- 写入后立即切换;
- 参数立即保存,重新上电后切换。
推荐操作流程:
- 修改时总线上只连接目标舵机;
- 写入新波特率索引;
- 在旧波特率下尝试读回
0x82; - 若仍能在旧波特率读回新索引,则重新上电后再切换主控;
- 若旧波特率立即无响应,则主控切换到新波特率验证;
- 同一条总线上的所有舵机必须保持相同波特率。
9.4 配置角度限制
角度限制使用以下参数:
0x8E:角度限制开关;0x91:角度上限;0x92:角度下限;0x93:中点偏移。
角度上限、下限和中点偏移均为 signed 16-bit,单位 0.1°。
9.5 配置保护参数
保护参数包括:
- 堵转保护
0x83/0x84; - 低压保护
0x85; - 高压保护
0x86; - 温度保护
0x87; - 功率保护
0x88; - 电流保护
0x89; - 功率保护迟滞
0x8B。
功率保护迟滞只允许:
0 = 取消
50~99 = 百分比迟滞
9.6 配置上电行为
0x8C:上电锁力开关;0x8F:上电缓启动开关;0x90:上电缓启动时间,单位 ms。
9.7 读取和修改 PID 参数
PID 及电机控制参数位于 0xC8~0xD5,属于受保护参数区。
普通用户不建议修改该区域。需要修改时,应使用对应机型的调试参数和第 9.8 节解锁流程。
9.8 PID 保护区解锁与重新上锁
解锁:
77 ServoID FF E6 00
500 ms 内继续发送:
77 ServoID FF 09 00
完成后重新上锁:
77 ServoID FF 00 00
10. 完整通信示例
以下示例均使用标准 CAN ID 0x321,示例 ServoID 为 0x01。除特别说明外,字节均为十六进制。
10.1 读取舵机型号
TX DLC=3: 72 01 01
RX DLC=5: 76 01 01 LL HH
10.2 读取固件版本
TX DLC=3: 72 01 02
RX DLC=5: 76 01 02 LL HH
10.3 读取单圈角度
TX DLC=3: 72 01 18
RX DLC=5: 76 01 18 LL HH
RawAngle = signed16(LL | (HH << 8))
AngleDegree = RawAngle / 10
10.4 读取多圈角度
TX DLC=4: 52 01 15 16
RX DLC=8: 56 01 15 L0 L1 16 H0 H1
WordLow = L0 | (L1 << 8)
WordHigh = H0 | (H1 << 8)
RawAngle = signed32(WordLow | (WordHigh << 16))
AngleDegree = RawAngle / 10
10.5 读取实时电压和电流
TX DLC=4: 52 01 10 11
RX DLC=8: 56 01 10 VL VH 11 CL CH
物理量换算以具体舵机型号为准。
10.6 控制舵机运动到指定角度
示例:目标角度 90.0°,运动时间 1000 ms,简易模式:
57 01 53 84 03 54 00 00 # 90.0°,Raw=900
57 01 50 E8 03 51 00 00 # 1000 ms
77 01 52 00 00 # 简易模式
77 01 55 00 00 # 执行功率
77 01 59 01 00 # 执行
10.7 使用时间加减速模式运动
57 01 53 AL0 AL1 54 AH0 AH1
57 01 50 TL0 TL1 51 TH0 TH1
77 01 52 01 00
77 01 56 AccelLow AccelHigh
77 01 57 DecelLow DecelHigh
77 01 55 PowerLow PowerHigh
77 01 59 01 00
10.8 使用速度加减速模式运动
57 01 53 AL0 AL1 54 AH0 AH1
77 01 52 02 00
77 01 58 SpeedLow SpeedHigh
77 01 56 AccelLow AccelHigh
77 01 57 DecelLow DecelHigh
77 01 55 PowerLow PowerHigh
77 01 59 01 00
速度模式不发送运动时间内存地址 0x50/0x51;如使用连续写入,命令字 Q=0x51 仍按第 4.8 节使用。
10.9 进入运动阻尼模式
示例功率 500 mW:
77 01 28 F4 01
10.10 停止锁力
77 01 7B 11 00
10.11 停止卸力
77 01 7B 10 00
10.12 停止阻尼
示例停止阻尼功率 500 mW:
77 01 55 F4 01
77 01 7B 12 00
10.13 修改舵机 ID
ID 1 修改为 ID 2:
78 01 81 02 00
10.14 修改 CAN 波特率
修改为 1 Mbps,索引 9:
78 01 82 09 00
10.15 清除圈数
77 01 79 01 00
10.16 设置零点
77 01 7A 00 00
10.17 多舵机同步运动
推荐流程:
- 分别向每颗舵机发送
Q + ServoID; - 分别缓存各自的运动参数和
0x59=1; - 使用协议允许的广播执行方式同步触发已缓存舵机;
- 广播不等待响应。
同步运动前应确认所有舵机波特率一致,且不存在重复 ServoID。
11. 常见问题与故障排查
11.1 舵机没有响应
依次检查:
- 舵机供电是否正常;
- CAN_H、CAN_L 是否接反;
- 主控和舵机波特率是否一致;
- 是否使用标准帧;
- CAN ID 是否为
0x321; - ServoID 是否正确;
- DLC 和命令格式是否正确;
- 总线终端电阻和接地是否合理。
11.2 CAN ID 与舵机 ID 混淆
CAN ID 固定为 0x321。舵机 ID 位于 Data[1],不能把舵机编号写入 CAN ID。
11.3 标准帧与扩展帧设置错误
本协议使用 11 位标准数据帧。若主控配置为 29 位扩展帧,舵机不会按本协议正常通信。
11.4 CAN 波特率不一致
同一物理 CAN 总线上的所有节点必须使用相同波特率。不同波特率的舵机不能混接通信。
11.5 修改波特率后无法连接
部分固件需要重新上电后才切换波特率。请分别尝试旧波特率和新波特率,并根据第 9.3 节流程处理。
11.6 角度数值相差 10 倍
角度原始值单位为 0.1°。例如原始值 1600 表示 160.0°,不是 1600°。
发送 160.0° 时应编码:
160.0 × 10 = 1600
11.7 负角度解析错误
角度使用有符号补码。必须按 signed 16-bit 或 signed 32-bit 解析,不能按无符号数处理,也不能把负角度自动转换成 0~360°。
11.8 PID 参数读取为 0
部分固件在保护区未解锁时仍返回响应,但参数值可能全部为 0。读取 PID 参数前执行 0xFF 解锁流程,读取完成后重新上锁。
11.9 停止阻尼没有效果
检查是否按正确顺序执行:
先写 0x55 = 0~1000 mW
再写 0x7B = 0x12
不要把 0x28 当成停止阻尼功率地址。
11.10 多舵机同时响应冲突
不要广播读取命令或写后回传命令。多颗舵机同时响应会造成总线数据冲突。广播 ID 仅用于执行已缓存的同步运动。
附录 A:命令快速索引
| ASCII | Hex | 功能 | TX DLC | RX 命令/DLC |
|---|---|---|---|---|
r |
0x72 |
读取一个参数 | 3 | v / 5 |
R |
0x52 |
读取两个参数 | 4 | V / 8 |
w |
0x77 |
写入一个参数 | 5 | 无 |
W |
0x57 |
写入两个参数 | 8 | 无 |
x |
0x78 |
写入一个参数并回传 | 5 | v / 5 |
X |
0x58 |
写入两个参数并回传 | 8 | V / 8 |
Q |
0x51 |
开始连续写入 | 2 | 无 |
q |
0x71 |
结束连续写入并提交 | 2 | 无 |
附录 B:内存地址快速索引
| 地址 | 参数 | 权限 | 单位/范围 |
|---|---|---|---|
0x01 |
舵机型号 | R | 型号编码 |
0x02 |
固件版本 | R | 版本编码 |
0x03/0x04 |
舵机序号 | R | 32-bit |
0x10 |
舵机电压 | R | 型号相关 |
0x11 |
舵机电流 | R | 型号相关 |
0x12 |
舵机功率 | R | 型号相关 |
0x13 |
舵机温度 | R | 型号相关 |
0x14 |
舵机状态 | R | 位标志 |
0x15/0x16 |
多圈当前角度 | R | signed 32-bit,0.1° |
0x17 |
当前圈数 | R | 圈 |
0x18 |
单圈当前角度 | R | signed 16-bit,0.1° |
0x28 |
运动阻尼模式功率 | R/W | 0~1000 mW,写入即执行 |
0x50/0x51 |
到目标角度时间 | R/W | uint32,ms |
0x52 |
运动模式 | R/W | 0/1/2 |
0x53/0x54 |
目标角度 | R/W | signed 32-bit,0.1° |
0x55 |
角度模式执行功率 | R/W | 0~65535 mW |
0x56 |
加速时间 | R/W | ms |
0x57 |
减速时间 | R/W | ms |
0x58 |
最大速度 | R/W | 0.1°/s |
0x59 |
执行角度运动 | R/W | 写 1 执行 |
0x78 |
参数恢复出厂设定 | W | 写 1 |
0x79 |
清除圈数 | W | 写 1 |
0x7A |
零点设定旗标 | W | 0=当前位置为零点;非零=恢复出厂零点 |
0x7B |
停止模式 | W | 0x10/0x11/0x12 |
0x80 |
控制回应 | R/W | 型号相关 |
0x81 |
舵机编号 | R/W | 0~254 |
0x82 |
CAN 波特率索引 | R/W | 0~9 |
0x83 |
堵转保护功能 | R/W | 0/1 |
0x84 |
堵转功率上限 | R/W | mW |
0x85 |
低压保护电压 | R/W | mV |
0x86 |
高压保护电压 | R/W | mV |
0x87 |
温度保护值 | R/W | 型号相关 |
0x88 |
功率保护值 | R/W | mW |
0x89 |
电流保护值 | R/W | mA |
0x8A |
加速度 | R/W | 型号相关 |
0x8B |
功率保护迟滞 | R/W | 0 或 50~99% |
0x8C |
上电锁力开关 | R/W | 0/1 |
0x8E |
角度限制开关 | R/W | 0/1 |
0x8F |
上电缓启动开关 | R/W | 0/1 |
0x90 |
上电缓启动时间 | R/W | ms |
0x91 |
角度上限 | R/W | signed 16-bit,0.1° |
0x92 |
角度下限 | R/W | signed 16-bit,0.1° |
0x93 |
中点偏移 | R/W | signed 16-bit,0.1° |
0xC8~0xD5 |
PID 与保护参数 | R/W,受保护 | 型号相关 |
0xFF |
保护区解锁/上锁 | W | 控制地址 |
附录 C:CAN 波特率索引
| 索引 | CAN 波特率 |
|---|---|
0 |
50 Kbps |
1 |
100 Kbps |
2 |
125 Kbps |
3 |
200 Kbps |
4 |
250 Kbps |
5 |
400 Kbps |
6 |
500 Kbps(默认) |
7 |
750 Kbps |
8 |
800 Kbps |
9 |
1 Mbps |
附录 D:状态位速查表
| 位 | 状态 |
|---|---|
| BIT0 | 执行指令中 |
| BIT1 | 执行错误 |
| BIT2 | 堵转错误 |
| BIT3 | 电压过高 |
| BIT4 | 电压过低 |
| BIT5 | 电流错误 |
| BIT6 | 功率错误 |
| BIT7 | 温度错误 |