0 写在前面
官方使用说明:
关节电机采用CAN通信方式,通信线有两根,通过can转USB工具与调试器相连,调试器需要提前安装ch340驱动,默认工作在AT模式。
需要注意的是,我们是根据特定的can转USB工具开发的调试器,因此需要用我们推荐的串口工具来进行调试器调试,如果想要移植到其他调试器平台可以参照说明书的第三章进行开发。
can转USB工具推荐使用YourCee的USB-CAN模块,对应串口协议的帧头为41 54,帧尾为0D 0A。
本文采用的是YourCee的USB-CAN模块利用AT指令与两台CyberGear进行通信。
0.0 驱动器通信协议及使用说明:
电机通信为 CAN 2.0 通信接口,波特率 1Mbps,采用扩展帧格式,如下所示:
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 通信类型 | 数据区 2 | 目标地址 | 数据区 1 |
电机支持的控制模式包括:
- 运控模式:给定电机运控 5 个参数;
- 电流模式:给定电机指定的 Iq 电流;
- 速度模式:给定电机指定的运行速度;
- 位置模式:给定电机指定的位置,电机将运行到该指定的位置。
注意:数据区采用的是单精度(32位),右高字节。(换算工具)
0.1 通信协议类型说明
0.1.1 获取设备 ID (通信类型 0)获取设备的 ID 和 64 位 MCU 唯一标识符
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 0 | bit15~8:用来标识主机CAN_ID | 目标电机CAN_ID | 0 |
应答帧:
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 0 | 目标电机 CAN_ID | 0XFE | 64 位 MCU 唯一标识符 |
0.1.2 运控模式电机控制指令 (通信类型 1)用来向电机发送控制指令
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 1 | Byte2:力矩 [0~65535]对应(-12Nm~12Nm) | 目标电机CAN_ID | Byte0~1: 目标角度 [0~65535]对应(-4π~4π) [0~65535]对应(-30rad/s~30rad/s) [0~65535]对应(0.0~500.0) [0~65535]对应(0.0~5.0) |
应答帧:应答电机反馈帧(见通信类型 2)
0.1.3 电机反馈数据 (通信类型 2) 用来向主机反馈电机运行状态
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 2 | bit8~bit15:当前电机 CAN ID bit21~16:故障信息(0无1 有) bit21: 未标定 bit20: HALL 编码故障 bit19: 磁编码故障 bit18: 过温 bit17: 过流 bit16: 欠压故障 bit22~23:模式状态 0 : Reset 模式[复位] 1 : Cali 模式[标定] 2 : Motor 模式[运行] | 目标电机CAN_ID | Byte0~1: 目标角度 [0~65535]对应(-4π~4π) [0~65535]对应(-30rad/s~30rad/s) [0~65535]对应(-12Nm~12Nm) |
0.1.4 电机使能运行 (通信类型 3)
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 3 | bit15~8:用来标识主CAN_ID | 目标电机CAN_ID |
应答帧:应答电机反馈帧(见通信类型 2)
0.1.5 电机停止运行 (通信类型 4)
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 4 | bit15~8:用来标识主CAN_ID | 目标电机CAN_ID | 正常运行时,data 区需清0; Byte[0]=1 时:清故障。 |
应答帧:应答电机反馈帧(见通信类型 2)
0.1.6 设置电机机械零位(通信类型 6)会把当前电机位置设为机械零位(掉电丢失)
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 6 | bit15~8:用来标识主CAN_ID | 目标电机CAN_ID | Byte[0]=1 |
应答帧:应答电机反馈帧(见通信类型 2)
0.1.7 设置电机 CAN_ID(通信类型 7)更改当前电机 CAN_ID , 立即生效。
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 7 | bit15~8:用来标识主 CAN_ID Bit16~23: 预设置 CAN_ID | 目标电机CAN_ID |
应答帧:应答电机广播帧(见通信类型 0)
0.1.8 单个参数读取(通信类型 17)
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 17 | bit15~8:用来标识主 CAN_ID | 目标电机CAN_ID | Byte0~1: index(表0.1.11) Byte2~3: 00 Byte4~7: 00 |
应答帧:
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 17 | bit15~8:用来标识主 CAN_ID | 目标电机CAN_ID | Byte0~1: index(表0.1.11) Byte2~3: 00 Byte4~7: 参数数据,1字节数据在Byte4 |
0.1.9 单个参数写入(通信类型 18) (掉电丢失)
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 18 | bit15~8:用来标识主 CAN_ID | 目标电机CAN_ID | Byte0~1: index(表0.1.11) Byte2~3: 00 Byte4~7: 参数数据 |
应答帧:应答电机反馈帧(见通信类型 2)
0.1.10 故障反馈帧(通信类型 21)
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 21 | bit15~8:用来标识主 CAN_ID | 目标电机CAN_ID | Byte0~3: fault 值(非 0:有故障,0:正常) bit16: A 相电流采样过流 bit15~bit8: 过载故障 bit7: 编码器未标定 bit5: C 相电流采样过流 bit4: B 相电流采样过流 bit3: 过压故障 bit2: 欠压故障 bit1: 驱动芯片故障 bit0: 电机过温故障,默认 80 度 Byte4~7: warning 值 bit0: 电机过温预警,默认 75 度 |
0.1.11 波特率修改(通信类型 22)(1.2.1.5 版本可修改,请参照文档流程谨慎修改,操作错误会出现无法连接电机、无法升级等问题)
数据域 | 29 位 ID | 8Byte 数据区 | ||
大小 | bit28~bit24 | bit23~8 | bit7~0 | Byte0~Byte7 |
描述 | 22 | bit15~8:用来标识主 CAN_ID | 目标电机CAN_ID | Byte0:电机波特率 1:1Mbps 2:500kbps 3:250kbps 4:125kbps |
应答帧:应答电机广播帧(见通信类型 0)
0.1.12 可读写单个参数列表 (7019-7020 为 1.2.1.5 版本固件可读)
参数 index | 参数名称 | 描述 | 类型 | 字 节 数 | 单位/说明 | R/W 权限 |
0x7005 | run_mode | 0: 运控模式 1: 位置模式 2: 速度模式 3: 电流模式 | uint8 | 1 | W/R | |
0x7006 | iq_ref | 电流模式 Iq 指令 | float | 4 | -23~23A | W/R |
0x700A | spd_ref | 转速模式转速指令 | float | 4 | -30~30rad/s | W/R |
0x700B | limit_torque | 转矩限制 | float | 4 | 0~12Nm | W/R |
0x7010 | cur_kp | 电流的 Kp | float | 4 | 默认值 0.125 | W/R |
0x7011 | cur_ki | 电流的 Ki | float | 4 | 默认值 0.0158 | W/R |
0x7014 | cur_filt_gain | 电流滤波系数filt_gain | float | 4 | 0~1.0,默认值0.1 | W/R |
0x7016 | loc_ref | 位置模式角度指令 | float | 4 | rad | W/R |
0x7017 | limit_spd | 位置模式速度限制 | float | 4 | 0~30rad/s | W/R |
0x7018 | limit_cur | 速度位置模式电流限制 | float | 4 | 0~23A | W/R |
0x7019 | mechPos | 负载端计圈机械角度 | float | 4 | rad | R |
0x701A | iqf | iq 滤波值 | float | 4 | -23~23A | R |
0x701B | mechVel | 负载端转速 | float | 4 | -30~30rad/s | R |
0x701C | VBUS | 母线电压 | float | 4 | V | R |
0x701D | rotation | 圈数 | int16 | 2 | 圈数 | W/R |
0x701E | loc_kp | 位置的 Kp | float | 4 | 默认值 30 | W/R |
0x701F | spd_kp | 速度的 Kp | float | 4 | 默认值 1 | W/R |
0x7020 | spd_ki | 速度的 Ki | float | 4 | 默认值 0.002 | W/R |
0.2 控制模式使用说明
0.2.1 运控模式
电机上电后默认处于运控模式;3→1→2
- 发送电机使能运行帧(通信类型 3)
- 发送运控模式电机控制指令(通信类型 1)
- 收到电机反馈帧(通信类型 2)
0.2.2 电流模式
18→3→18
- 发送电机模式参数写入命令(通信类型 18)设置 runmode 参数为 3
- 发送电机使能运行帧(通信类型 3)
- 发送电机模式参数写入命令(通信类型 18)设置 iq_ref 参数为预设电流指令
0.2.3 速度模式
18→3→18→18
- 发送电机模式参数写入命令(通信类型 18)设置 runmode 参数为 2
- 发送电机使能运行帧(通信类型 3)
- 发送电机模式参数写入命令(通信类型 18)设置 limit_cur 参数为预设最大电流指令
- 发送电机模式参数写入命令(通信类型 18)设置 spd_ref 参数为预设速度指令
0.2.4 位置模式
18→3→18→18
- 发送电机模式参数写入命令(通信类型 18)设置 runmode 参数为 1
- 发送电机使能运行帧(通信类型 3)
- 发送电机模式参数写入命令(通信类型 18)设置 limit_spd 参数为预设最大速度指令
- 发送电机模式参数写入命令(通信类型 18)设置 loc_ref 参数为预设位置指令
0.2.5 停止运行
发送电机停止运行帧(通信类型 4)
0.3 串口协议说明
以该指令为例:41 54 90 07 e8 0c 08 0a 70 00 00 00 00 80 3f 0d 0a
41 54 | 90 07 e8 0c | 08 | 0a 70 00 00 00 00 80 3f | 0d 0a | ||
帧头 | 扩展帧canid | 数据位个数 | 数据帧 | 帧尾 | ||
0x41 A | 0x54 T | ID(4字节) | 数据长度 | 数据内容 | 0x0d \r | 0x0a \n |
usb转can模块会把canid左移3位,右边加100
扩展帧
hex | 90 | 07 | e8 | 0c | ||||||
bin | 1001 | 0000 | 0000 | 0111 | 1110 | 1000 | 0000 | 1100 | ||
去掉右边的100 | 0001 | 0010 | 0000 | 0000 | 1111 | 1101 | 0000 | 0001 | ||
hex | 12 | 00 | FD | 01 | ||||||
18(dec) 通信类型 | / | 主机id | 电机canid |
数据帧
0a | 70 | 00 | 00 | 00 | 00 | 80 | 3f |
index=0x700a 转速模式转速指令 | 00 | 参考数据spd_ref=1rad/s (右高字节单精度) |
该指令意思为:通信类型 18 的单个参数写入,转速模式转速指令,参数为1rad/s
1 代码说明
import serial
import struct
import time
# Connect to the CAN bus with 1 Mbit/s bitrate
ser = serial.Serial('COM6', 921600, timeout=1)
# Enter "AT command mode"
ser.write(bytes.fromhex('41 54 2b 41 54 0d 0a'))
# 双电机给定速度运行,速度模式的通信类型:18-->3-->18-->18
# 通信类型18:发送电机模式参数写入命令,设置runmode=2
# 90 07 e8 0c-->12 00 FD 01(电机1的canid=1) 05 70 00 00 02 00 00 00-->0x7005的runmode=2
ser.write(bytes.fromhex('41 54 90 07 e8 0c 08 05 70 00 00 02 00 00 00 0d 0a'))
# 90 07 e8 14-->12 00 FD 02(电机2的canid=2) 05 70 00 00 02 00 00 00-->0x7005的runmode=2
ser.write(bytes.fromhex('41 54 90 07 e8 14 08 05 70 00 00 02 00 00 00 0d 0a'))
# 通信类型3:发送电机使能运行帧
# 18 07 e8 0c-->03 00 FD 01(canid1使能运行)
ser.write(bytes.fromhex('41 54 18 07 e8 0c 08 00 00 00 00 00 00 00 00 0d 0a'))
# 18 07 e8 14-->03 00 FD 02(canid2使能运行)
ser.write(bytes.fromhex('41 54 18 07 e8 14 08 00 00 00 00 00 00 00 00 0d 0a'))
# 通信类型18:发送电机模式参数写入命令,设置 limit_cur 参数为预设最大电流指令
# 90 07 e8 0c-->12 00 FD 01(canid1) 18 70 00 00 00 00 b8 41 0d 0a-->0x7018的limit_cur=23
ser.write(bytes.fromhex('41 54 90 07 e8 0c 08 18 70 00 00 00 00 b8 41 0d 0a'))
# 90 07 e8 14-->12 00 FD 02(canid2) 18 70 00 00 00 00 b8 41 0d 0a-->0x7018的limit_cur=23
ser.write(bytes.fromhex('41 54 90 07 e8 14 08 18 70 00 00 00 00 b8 41 0d 0a'))
#通信类型18:发送电机模式参数写入命令,设置 spd_ref 参数为预设速度指令
# 90 07 e8 0c-->12 00 FD 01(canid1) 0a 70 00 00 00 00 b8 41 0d 0a-->0x700a的spd_ref=5
ser.write(bytes.fromhex('41 54 90 07 e8 0c 08 0a 70 00 00 00 00 a0 40 0d 0a'))
# 90 07 e8 14-->12 00 FD 02(canid2) 0a 70 00 00 00 00 b8 41 0d 0a-->0x700a的spd_ref=5
ser.write(bytes.fromhex('41 54 90 07 e8 14 08 0a 70 00 00 00 00 a0 40 0d 0a'))
# 通信类型4:电机停止运行
# 20 07 e8 0c-->04 00 FD 01(canid1停止运行)
ser.write(bytes.fromhex('41 54 20 07 e8 0c 08 00 00 00 00 00 00 00 00 0d 0a'))
# 20 07 e8 14-->04 00 FD 02(canid2停止运行)
ser.write(bytes.fromhex('41 54 20 07 e8 14 08 00 00 00 00 00 00 00 00 0d 0a'))
# Close the serial port
ser.close()