4,自定义协议指令使用说明
注意事项:
1. 协议使能方法
需要选择私有协议,方可使用,下面两个方法效果一样:
方法1:屏幕菜单à通信协议à私有协议
方法2:使用“设置协议指令”,设置使用正点原子自定义协议
2. 协议通用性说明
本协议适用于以下三种通信接口版本的设备:
串口TTL 版本
RS485 版本
CAN 版本
其中,协议的指令格式与数据内容在三种版本中保持一致,仅在物理层和部分收发规则上存在差异。
3. CAN 版本的特殊要求
在 CAN 总线上使用本协议时,需要注意以下几点:
仅支持标准帧 (StdId Frame)。
报文 ID 规范:支持任意11位标准帧ID。
除上述限制外,协议内容(指令、数据格式、校验规则等)与 串口TTL/RS485 版本保持完全一致。
4. 串口 TTL 与 RS485 默认通信参数
波特率115200、
停止位1、
数据位8、
检验位None
5. CAN 默认通信参数
波特率:500 Kbps
6. 从机地址
出厂默认从机地址为 01H
文档中示例均以 01H 作为从机地址。
功能码表:
|
指令类型 |
功能码 |
功能说明 |
|
系统指令(0x00 ~ 0x0F) |
校准编码器 | |
|
0x02 |
复位重启 | |
|
0x0 3 |
恢复出厂设置 | |
|
0x0 4 |
参数保存 | |
|
| ||
|
读参数指令 (0x20 ~ 0x3F) |
0x20 |
读取软硬件版本 |
|
0x21 |
读取电机磁链 | |
|
0x22 |
读取相电阻和相电感 | |
|
0x23 |
读取相电流 | |
|
0x24 |
读取总线电压 | |
|
0x25 |
读取电流环 PID 参数 | |
|
0x26 |
读取速度环 PID 参数 | |
|
0x27 |
读取位置环 PID 参数 | |
|
0x28 |
读取输入累计脉冲值 | |
|
0x29 |
读取电机实时转速 | |
|
0x2A |
读取电机实时位置 | |
|
0x2B |
读取电机位置误差 | |
|
0x2C |
读取电机运行状态 | |
|
0x2D |
读取堵转标志 | |
|
0x2E |
读取堵转电流 | |
|
0x2F |
读取使能状态 | |
|
0x30 |
读取到位标志 | |
|
0x31 |
读取系统参数 | |
|
0x32 |
读取驱动参数 | |
|
| ||
|
设置参数指令 (0x60 ~ 0x7F) |
0x60 |
设置从机地址 |
|
0x61 |
设置分组地址 | |
|
0x62 |
设置工作模式 | |
|
0x63 |
设置位置环 PID 参数 | |
|
0x64 |
设置位置环最大力矩限制 | |
|
0x65 |
设置细分 | |
|
0x66 |
设置目标电流 | |
|
0x67 |
设置串口波特率 | |
|
0x68 |
设置 CAN 波特率 | |
|
0x69 |
设置协议 | |
|
0x6A |
设置堵转保护功能 | |
|
0x6B |
设置堵转电流 | |
|
设置发送 CAN_ID | ||
|
0x6D |
设置 DIR 正转电平 | |
|
0x6E |
设置 EN 脚有效电平 | |
|
0x6F |
设置指令回响 | |
|
0x70 |
设置按键锁定 | |
|
0x71 |
设置自动熄屏 | |
|
0x72 |
设置 IO 启停电平 | |
|
0x73 |
设置速度环 PID 参数 | |
|
0x74 |
设置到位指令是否到位回响 | |
|
| ||
|
限位回零指令 (0x90 ~ 0x9F) |
设置左限位原点位置 | |
|
0x91 |
设置有无限位回零 | |
|
0x92 |
触发回零 | |
|
0x93 |
强制中断并退出回零操作 | |
|
0x94 |
读取回零参数 | |
|
0x95 |
修改原点回零超时时间 | |
|
0x96 |
读取回零状态 | |
|
0x97 |
设置上电自动回零 | |
|
0x98 |
设置右限位原点位置 | |
|
0x99 |
设置左右限位开关状态 | |
|
| ||
|
运动控制指令 (0xE0 ~ 0xFF) |
0xE0 |
开环速度模式控制 |
|
0xE1 |
开环绝对位置模式控制 | |
|
0xE2 |
开环相对位置模式控制 | |
|
0xE3 |
开环脉冲模式控制 | |
|
0xE4 |
IO 启停模式 | |
|
0xF0 |
力矩模式控制 | |
|
0xF1 |
速度模式控制 | |
|
0xF2 |
绝对位置模式控制 | |
|
0xF3 |
相对位置模式控制 | |
|
0xF4 |
脉冲模式控制 | |
|
0xF5 |
脉宽位置模式控制 | |
|
0xF6 |
脉宽力矩模式控制 | |
|
0xF7 |
脉宽速度模式控制 | |
|
0xF8 |
将当前位置角度清零 | |
|
0xF9 |
解除堵转保护 | |
|
0xFA |
电机使能控制 | |
|
0xFB |
清除状态(堵转、刹车、失能) | |
|
0xFC |
立即停止(刹车) | |
4.1 指令格式说明
指令格式,如表4.1.1所示:
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
0xC5 |
addr |
code |
|
CHECKSUM |
0x5C |
|
| |||||
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
0xC5 |
addr |
code |
|
CHECKSUM |
0x5C |
表4.1.1 串行数据格式说明
1,帧头为0xC5,帧尾为0x5C,都是固定的
2,从机地址范围:0~255,其中0为广播地址,1~255为从机地址(默认地址为1)
3,功能码范围:0~255,用于选择执行不同的指令
4,指令数据:指令发送或者应答的真正数据,不同功能码,长度可能不同
5,校验码:采用的校验方式是8位校验和(CHECKSUM 8bit)。
校验码计算方法如下:
CHECKSUM = (帧头 + 地址 + 功能码 + 数据区所有字节) & 0xFF
例如 指令“C5 01 80 02 CHECKSUM 5C”
CHECKSUM = (0xC5 + 0x01 + 0x80 + 0x02) & 0xFF = 0x148 & 0xFF = 0x48
6,时序要求(单条指令内):主机发送指令时,整帧数据(从 0xC5 到 0x5C)必须 连续输出,字节之间不允许超过 1 个字节周期的延时,否则可能导致从机接收失败。
7,时序要求(指令间隔):两条完整指令之间应保持 至少 2ms 的时间间隔,以保证从机有足够时间完成上一条指令的解析与处理。
注意:
使用广播地址或分组地址发送命令,从机均不应答。
主机发送的从机地址,如果总线上没有匹配的从机,也不应答。
如果不想从机应答,可以使用0x6F指令回响功能码进行设置。
为了方便大家熟悉和查找相关指令,我们把指令分为了四类:系统类指令、参数类指令、运动类指令、回零类指令。详细的指令描述请看下文。
4.2 系统类指令说明
4.2.1 校准编码器指令
|
下行帧 (上位机 -->驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
01H |
无 |
C7H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
01H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
注意:校准编码器前,请确保电机是空载状态!!!
1,从机地址:01H(后续都用01H从机地址来举例,将不再赘述)
2,功能码:01H,对应校准编码器功能
3,指令数据:
下行帧:01H功能码无指令数据
上行帧:有2个字节指令数据(Byte1:表示操作结果,Byte2:表示校准结果)
下面重点介绍一下上行帧的Byte1,Byte1是上行帧指令数据部分的第一个字节,固定用来表示指令操作结果。指令操作结果有以下几种可能:
0x01,表示指令操作成功
0xE1,表示帧长度不足(小于最小帧长度)
0xE2,表示帧头错误(非0xC5)
0xE3,表示帧尾错误(非0x5C)
0xE4,表示校验和错误
0xE5,表示不支持的功能码
0xE6,表示数据不合法
可以看到只有收到0x01才表示指令操作成功,其它值都表示错误。错误码都是0xE开头,其中‘E’寓意‘Error’,方便理解。
Byte1(指令操作结果)只在这里进行介绍,其它指令都一样的,后续就不再赘述!
Byte2:表示校准结果,有以下几种结果:
0:空闲
1:校准中
2:校准失败
3:校准成功
举个例子:
主机发送 C5 01 01 C7 5C
从机空闲,应答 C5 01 01 01 00 C8 5C
从机校准中,应答 C5 01 01 01 01 C9 5C
从机校准失败,应答 C5 01 01 01 02 CA 5C
从机校准成功,应答 C5 01 01 01 03 CB 5C
4.2.2 复位重启指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
02H |
无 |
C8H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
02H |
Byte1 |
CHECKSUM |
5CH |
该指令用于复位重启驱动板,不会修改配置参数。
举个例子:
主机发送 C5 01 02 C8 5C
从机操作成功,应答 C5 01 02 01 C9 5C
4.2.3 恢复出厂设置指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
03H |
无 |
C9H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
03H |
Byte1 |
CHECKSUM |
5CH |
该指令用于恢复出厂设置,把配置参数修改为出厂默认值。
举个例子:
主机发送 C5 01 03 C9 5C
从机操作成功,应答C5 01 03 01 CA 5C
4.2.4 参数保存指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
04H |
无 |
CAH |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
04H |
Byte1 |
CHECKSUM |
5CH |
该指令用于保存所有掉电不丢失的配置参数。
举个例子:
主机发送 C5 01 04 CA 5C
从机操作成功,应答 C5 01 04 01 CB 5C
4.3 参数类指令说明
4.3.1 读取软硬件版本指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
20H |
无 |
E6H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
20H |
Byte1 |
Byte2 |
Byte3 |
CHECKSUM |
5CH |
该指令用于读取驱动器软硬件版本号。
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:表示固件版本号
Byte3:表示硬件版本号
举个例子:
主机发送 C5 01 20 E6 5C
从机操作成功,应答 C5 01 20 01 0A 0A 07 5C
上行帧的指令数据:
Byte2:0A(即十进制10),表示固件版本号为V1.0
Byte3:0A(即十进制10),表示硬件版本号为V1.0
4.3.2 读取电机磁链指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
21H |
无 |
E7H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
21H |
Byte1 |
… |
Byte5 |
CHECKSUM |
5CH |
该指令用于读取电机磁链。(float → uint8_t[4])
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:表示电机磁链参数(单位mWb)
举个例子:
主机发送 C5 01 21 E7 5C
从机操作成功,应答 C5 01 21 01 40 97 0A 3D 06 5C
上行帧的指令数据:
Byte2~ Byte5:上行帧的指令数据我们做了处理,采用大端序输出。即0x40970A3D表示电机磁链参数为4.72mWb。
整型数据怎么能读成浮点型数据?刚接触到这个的读者可能会觉得很奇怪。这其实在嵌入式开发中是非常常见且重要的技巧,下面给大家介绍一下。
STM32(小端系统)联合体存取float和uint32_t数据简明指南(后续将不再赘述)
核心概念:
联合体(union):所有成员共享同一块内存空间(大小为最大成员尺寸)。写入一个成员,会覆盖整个内存区域;读取另一个成员,会以新类型的规则重新解释这段内存中的原始二进制数据。这不是类型转换,而是数据解释方式的切换。
STM32内存模型(小端系统)
在小端模式中,多字节数据的低位字节存储在低地址,高位字节存储在高地址。
下面定义一个联合体:
typedef union
{
float f_val; /* 单精度浮点数 (4字节) */
uint32_t u32_val; /* 32位无符号整数 (4字节) */
uint8_t bytes[4]; /* 字节数组,用于观察内存布局 */
} converter_t;
假设 f_val = 4.72,其在内存中存储的十六进制数表示为0x40970A3D。
在小端系统中,内存布局如下:
|
内存地址 |
存储的数据 Hex |
对应 bytes[] 索引 |
|
低地址 |
3DH |
bytes[0] |
|
↓ |
0AH |
bytes[1] |
|
↓ |
97H |
bytes[2] |
|
高地址 |
40H |
bytes[3] |
用u32_val 读取这4个字节时,会按地址从低到高组合成 0x3D0A9740吗?不会! CPU知道这是一个32位整数,它会直接访问整个4字节字地址空间,得到正确的值 0x40970A3D。字节序的影响主要体现在字节级别的操作(如通过bytes[]数组访问或串口发送单个字节时的访问)。例如用bytes[0]读取时得到3DH,…用bytes[3]读取时得到40H。我们提供的STM32例程就是字节数组的方式,方便串口发送数据。
0x40970A3D用浮点数变量f_val读取的结果,代码实现如下:
int main()
{
converter_t u; /* 定义联合体变量 */
u.u32_val = 0x40970A3D; /* 将十六进制值 0x40970A3D 写入联合体 */
printf("Hex: 0x%08X\r\n ", u.u32_val); /* 打印u32_val的值 */
printf("Float: %.6f\r\n ", u.f_val); /* 打印f_val浮点数小数点后6位 */
return 0;
}
打印结果:
Hex: 0x40970A3D Float: 4.720000
该代码在例程00 联合体float 和uint32_t类型互换读取方法,大家可以直接使用!!!
总结:联合体提供了同一块内存的多种视图。写入一种视图,读取另一种视图,实现了对原始二进制数据的不同解释,从而在浮点数和整数的二进制表示之间建立桥梁,方便我们进行这种巧妙的转换。
注意事项:在本套自定义中,指令数据采用大端序输出。在小端系统中(如:STM32),如果想自行解析float 转 uint8_t[4]的数据,那么就要切换成小端序。方法在我们提供的STM32例程process_frame.c中有,这里贴出来:
/* 将读取到的数据转成浮点数 */
typedef union
{
float f;
uint8_t b[4];
} float_union_t;
/**
* @brief 将4个字节的数据转换为 float 类型
* @param buf 指向包含4字节数据的缓冲区(使用大端格式:高字节在前)
* @return 转换后的 float 浮点数值
*/
float bytes_to_float(uint8_t *buf)
{
float_union_t u;
/* 将字节逐一写入联合体中的字节数组(大端顺序,所以这里要反过来传值,重新变成小端) */
u.b[0] = buf[3]; /* 高字节 */
u.b[1] = buf[2];
u.b[2] = buf[1];
u.b[3] = buf[0]; /* 低字节 */
/* 返回组合后的浮点数 */
return u.f;
}
指令数据为什么采用大端序输出呢?答:符合人们从左到右的阅读习惯,方便大家阅读。
4.3.3 读取相电阻和相电感指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
22H |
无 |
E8H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
22H |
Byte1 |
… |
Byte9 |
CHECKSUM |
5CH |
该指令用于读取电机相电阻和相电感(含MOS内阻)。(float → uint8_t[4])
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:表示电机相电阻参数(单位Ω)
Byte6~ Byte9:表示电机相电感参数(单位mH)
举个例子:
主机发送 C5 01 22 E8 5C
从机操作成功,应答 C5 01 22 01 3F DC D7 D3 40 88 02 D4 4C 5C
上行帧的指令数据:
Byte2~ Byte5:0x3FDCD7D3表示电机相电阻参数为1.725Ω
Byte2~ Byte5:0x408802D4表示电机相电感参数为4.250mH
4.3.2小节有介绍:STM32(小端系统)联合体存取float和uint32_t数据简明指南。
4.3.4 读取相电流指令
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
23H |
无 |
E9H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
23H |
Byte1 |
Byte2 |
Byte3 |
CHECKSUM |
5CH |
该指令用于读取电机相电流。(类型:int16_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte3:表示电机相电流(单位mA)
举个例子:
主机发送 C5 01 23 E9 5C
从机操作成功,应答 C5 01 23 01 00 6C 56 5C
上行帧的指令数据:
Byte2~ Byte3:0x006C表示电机相电流为108mA
4.3.5 读取总线电压指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
24H |
无 |
EAH |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
24H |
Byte1 |
… |
Byte5 |
CHECKSUM |
5CH |
该指令用于读取驱动器总线电压。(float → uint8_t[4])
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:表示驱动器总线电压(单位V)
举个例子:
主机发送 C5 01 24 EA 5C
从机操作成功,应答 C5 01 24 01 41 BF C7 C0 72 5C
上行帧的指令数据:
Byte2~ Byte5:0x41BFC7C0表示驱动器总线电压为23.97V
4.3.2小节有介绍:STM32(小端系统)联合体存取float和uint32_t数据简明指南。
4.3.6 读取电流环PID参数指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
25H |
无 |
EBH |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
25H |
Byte1 |
… |
Byte17 |
CHECKSUM |
5CH |
该指令用于读取电流环PID参数。(float → uint8_t[4])
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:表示Q轴PI参数P
Byte6~ Byte9:表示Q轴PI参数I
Byte10~ Byte13:表示D轴PI参数P
Byte14~ Byte17:表示D轴PI参数I
举个例子:
主机发送 C5 01 25 EB 5C
从机操作成功,应答C5 01 25 01 37 27 C5 AC 35 86 37 BD 37 27 C5 AC 35 86 37 BD E8 5C
上行帧的指令数据:
Byte2~ Byte5: 0x3727C5AC表示Q轴PI参数p为0.00001
Byte6~ Byte9:0x358637BD表示Q轴PI参数I为0.000001
Byte10~ Byte13:0x3727C5AC表示D轴PI参数P为0.00001
Byte14~ Byte17:0x358637BD表示D轴PI参数I为0.000001
4.3.2小节有介绍:STM32(小端系统)联合体存取float和uint32_t数据简明指南。
4.3.7 读取速度环PID参数指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
26H |
无 |
ECH |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
26H |
Byte1 |
… |
Byte13 |
CHECKSUM |
5CH |
该指令用于读取速度环PID参数。(类型:uint32_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:表示PID参数P
Byte6~ Byte9:表示PID参数I
Byte10~ Byte13:表示PID参数D
举个例子:
主机发送 C5 01 26 EC 5C
从机操作成功,应答C5 01 26 01 00 00 00 03 00 00 00 04 00 00 00 00 F4 5C
上行帧的指令数据:
Byte2~ Byte5:0x00000004表示Q轴PI参数p为3
Byte6~ Byte9:0x00000004表示Q轴PI参数I为4
Byte10~ Byte13:0x00000000表示D轴PI参数P为0
4.3.8 读取位置环PID参数指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
27H |
无 |
EDH |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
27H |
Byte1 |
… |
Byte13 |
CHECKSUM |
5CH |
该指令用于读取位置环PID参数。(类型:uint32_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:表示PID参数P
Byte6~ Byte9:表示PID参数I
Byte10~ Byte13:表示PID参数D
举个例子:
主机发送 C5 01 27 ED 5C
从机操作成功,应答C5 01 27 01 00 00 01 2C 00 00 00 1E 00 00 01 7C B6 5C
上行帧的指令数据:
Byte2~ Byte5:0x0000012C表示Q轴PI参数p为300
Byte6~ Byte9:0x0000001E表示Q轴PI参数I为30
Byte10~ Byte13:0x0000017C表示D轴PI参数P为380
4.3.9 读取输入累计脉冲数指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
28H |
无 |
EEH |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
28H |
Byte1 |
… |
Byte5 |
CHECKSUM |
5CH |
该指令用于读取输入累计脉冲数。(类型:uint32_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:表示输入累计脉冲数
举个例子:
主机发送 C5 01 28 EE 5C
从机操作成功,应答C5 01 28 01 00 00 C8 00 EF 5C
上行帧的指令数据:
Byte2~ Byte5:0x0000C800表示输入累计脉冲数为51200
4.3.10 读取电机实时转速指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
29H |
无 |
EFH |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
29H |
Byte1 |
Byte2 |
Byte3 |
CHECKSUM |
5CH |
该指令用于读取电机实时转速。(类型:int16_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte3:表示电机实时转速(单位RPM)
举个例子:
主机发送 C5 01 29 EF 5C
从机操作成功,应答C5 01 29 01 00 1F 0F 5C
上行帧的指令数据:
Byte2~ Byte3:0x001F表示电机实时转速为31RPM
4.3.11 读取电机实时位置指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
2AH |
无 |
F0H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
2AH |
Byte1 |
… |
Byte5 |
CHECKSUM |
5CH |
该指令用于读取电机实时位置。(类型:int32_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:表示电机实时位置(51200代表一圈)
举个例子:
主机发送 C5 01 2A F0 5C
从机操作成功,应答C5 01 2A 01 00 07 D0 00 C8 5C
上行帧的指令数据:
Byte2~ Byte5:0x0007D000表示电机实时位置为512000
4.3.12 读取电机位置误差指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
2BH |
无 |
F1H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
2BH |
Byte1 |
… |
Byte5 |
CHECKSUM |
5CH |
该指令用于读取电机位置误差。(类型:int32_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:表示电机位置误差(51200代表一圈)
举个例子:
主机发送 C5 01 2B F1 5C
从机操作成功,应答C5 01 2B 01 00 00 00 01 F3 5C
上行帧的指令数据:
Byte2~ Byte5:0x00000001表示电机位置误差为1
4.3.13 读取电机运行状态指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
2CH |
无 |
F2H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
2CH |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于读取电机运行状态。(类型:uint8_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:表示电机运行状态,有以下可能:
0:停止状态
1:任务完成状态
2:正在运行
3:过载状态
4:堵转状态
5:欠压状态
举个例子:
主机发送 C5 01 2C F2 5C
从机操作成功,应答C5 01 2C 01 01 F4 5C
上行帧的指令数据Byte2:0x01表示电机运行状态为任务完成状态
4.3.14 读取电机堵转标志指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
2DH |
无 |
F3H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
2DH |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于读取电机堵转标志。(类型:uint8_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:表示电机堵转标志,有以下可能:
0:未堵转 1:堵转
举个例子:
主机发送 C5 01 2D F3 5C
从机操作成功,应答C5 01 2D 01 00 F4 5C
上行帧的指令数据Byte2:0x00表示电机未堵转
4.3.15 读取堵转电流指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
2EH |
无 |
F4H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
2EH |
Byte1 |
Byte2 |
Byte3 |
CHECKSUM |
5CH |
该指令用于读取堵转电流。(类型:int16_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte3:表示堵转电流(单位mA)
举个例子:
主机发送 C5 01 2E F4 5C
从机操作成功,应答C5 01 2E 01 05 DC D6 5C
上行帧的指令数据:
Byte2~ Byte3:0x05DC表示堵转电流为1500mA
4.3.16 读取电机使能状态指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
2FH |
无 |
F5H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
2FH |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于读取电机使能状态。(类型:uint8_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:表示电机使能状态,有以下可能:
0:使能电机 1:失能电机
举个例子:
主机发送 C5 01 2F F5 5C
从机操作成功,应答C5 01 2F 01 00 F6 5C
上行帧的指令数据:
Byte2:0x00表示失能电机
4.3.17 读取电机到位标志指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
30H |
无 |
F6H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
30H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于读取电机到位标志。(类型:uint8_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:表示电机到位标志,有以下可能:
0:未到位
1:到位
举个例子:
主机发送 C5 01 30 F6 5C
从机操作成功,应答C5 01 30 01 01 F8 5C
上行帧的指令数据:
Byte2:0x01表示电机到位
4.3.18 读取系统参数指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
31H |
无 |
F7H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
31H |
Byte1 |
… |
Byte41 |
CHECKSUM |
5CH |
该指令用于读取系统参数,这部分参数都是只读属性。
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:电机总线电压(单位V)(float → uint8_t[4])
Byte6~ Byte7:读取相电流(单位mA)(类型int16_t)
Byte8~ Byte11:电机磁链参数(单位mWb)(float → uint8_t[4])
Byte12~ Byte15:电机相电阻参数(单位Ω)(float → uint8_t[4])
Byte16~ Byte19:电机相电感参数(单位mH)(float → uint8_t[4])
Byte20~ Byte21:读取实时转速(单位RPM)(类型int16_t)
Byte22~ Byte25:读取目标位置(51200代表一圈)(类型int32_t)
Byte26~ Byte29:读取实时位置(51200代表一圈)(类型int32_t)
Byte30~ Byte33:读取位置误差(51200代表一圈)(类型int32_t)
Byte34~ Byte37:读取脉冲数(类型uint32_t)
Byte38:电机使能状态
0:电机使能
1:电机失能
Byte39:电机到位标志,有以下可能:
0:未到位
1:到位
Byte40:电机堵转标志,有以下可能:
0:未堵转
1:堵转
Byte41:地址模式,有以下可能:
0:从机地址模式
1:分组地址模式
举个例子:
主机发送 C5 01 31 F7 5C
从机操作成功,应答C5 01 31 01 41 C0 00 00 00 0F 40 88 5D 39 3F ED EB 28 40 8D 27 10 00 00 00 07 D0 00 00 07 D0 00 00 00 00 00 00 00 7D 02 00 01 00 D7 5C
该指令一次性读取系统参数,便于观察。用我们提供的STM32例程可以一次性在串口助手打印指令数据解析结果,如下所示:
Byte2~ Byte5:电机总线电压 24.0V
Byte6~ Byte7:读取相电流 15mA
Byte8~ Byte11:电机磁链 4.26mWb
Byte12~ Byte15:电机相电阻 1.86Ω
Byte16~ Byte19:电机相电感 4.41mH
Byte20~ Byte21:读取实时转速 0RPM
Byte22~ Byte25:读取目标位置(51200代表一圈)512000
Byte26~ Byte29:读取实时位置(51200代表一圈)512000
Byte30~ Byte33:读取位置误差(51200代表一圈)0
Byte34~ Byte37:读取脉冲数 32002
Byte38:0:电机使能
Byte39:1:到位
Byte40:0:未堵转
Byte41:0:从机地址模式
4.3.2小节有介绍:STM32(小端系统)联合体存取float和uint32_t数据简明指南。
4.3.19 读取驱动参数指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
32H |
无 |
F8H |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
32H |
Byte1 |
… |
Byte32 |
CHECKSUM |
5CH |
该指令用于读取全部配置参数。
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:电机工作模式,有以下可能:(类型uint8_t)
0:通信位置模式
1:通信速度模式
2:通信力矩模式
3:脉冲模式
4:脉宽位置模式
5:脉宽速度模式
6:脉宽力矩模式
7:回零模式
Byte3:指令回响状态,有以下可能:
0:正常回响
1:不回响
Byte4~ Byte7 串口波特率(单位bps)(类型uint32_t)
Byte8~ Byte9:CAN波特率(单位Kbps)(类型uint16_t)
Byte10:DIR正转电平,有以下可能:
0:高电平正转
1:低电平正转
Byte11:EN脚有效电平,有以下可能:
0:EN引脚低电平使能
1:EN引脚高电平使能
2:EN引脚保持有效
Byte12~ Byte13:设置的细分(类型uint16_t)
Byte14~ Byte15:位置环最大力矩(单位:mA)(类型int32_t)
Byte16~ Byte19:位置环PID参数P(类型uint32_t)
Byte20~ Byte23:位置环PID参数I(类型uint32_t)
Byte24~ Byte27:位置环PID参数D(类型uint32_t)
Byte28~ Byte29:堵转电流(单位:mA)(类型int16_t)
Byte30:电机堵转保护功能标志
0:关闭堵转保护功能
1:开启堵转保护功能
Byte31:按键上锁状态,有以下可能:
0:解锁
1:上锁
Byte32~ Byte35:速度环PID参数P(类型uint32_t)
Byte36~ Byte39:速度环PID参数I(类型uint32_t)
Byte40~ Byte43:速度环PID参数D(类型uint32_t)
Byte44:自动熄屏状态,有以下可能:
0:关闭自动熄屏
1:开启自动熄屏
Byte45:IO启停电平,有以下可能:
0:低电平启动
1:高电平启动
举个例子:
主机发送 C5 01 32 F8 5C
从机操作成功,应答C5 01 32 01 03 00 00 01 C2 00 01 F4 00 01 00 10 0B B8 00 00 01 2C 00 00 00 1E 00 00 01 7C 05 DC 01 00 00 32 5C
Byte2:3:脉冲模式
Byte3:0:正常回响
Byte4~ Byte7:串口波特率为:115200
Byte8~ Byte9:CAN速率为:500K
Byte10:0:高电平正转
Byte11:1:EN引脚高电平使能
Byte12~ Byte13:细分为:16
Byte14~ Byte15:位置环最大力矩:3000
Byte16~ Byte19:PID参数P为300
Byte20~ Byte23:PID参数I为30
Byte24~ Byte27:PID参数D为380
Byte28~ Byte29:堵转电流1500 mA
Byte30:1:开启堵转保护功能
Byte31:0:按键解锁
Byte32:0:关闭自动熄屏
4.3.2小节有介绍:STM32(小端系统)联合体存取float和uint32_t数据简明指南。
4.3.20 设置从机地址指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
60H |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
60H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于设置从机地址。(注意:总线上不能设置两个一样的从机地址,应答会冲突)
下行帧的指令数据:
Byte1:新的从机地址(范围:1~255)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:新的从机地址
举个例子:
主机发送 C5 01 60 02 28 5C
从机操作成功,应答 C5 01 60 01 02 29 5C
下行帧的指令数据Byte1:新的从机地址设置为2
上行帧的指令数据Byte2:新的从机地址成功设置为2
注意:下次再想跟这个从机通信,注意从机地址要改成2了!!!
4.3.21 设置分组地址指令
有了设置从机地址指令,为什么还要设置分组地址指令呢?电机驱动器被设置为相同的分组地址可实现多机同步通讯和控制。而从机地址是不允许被设置成一样的。下面来介绍一下它们的区别。
从机地址和分组地址的区别:在电机驱动器中,从机地址和分组地址是共用一套地址的,只有模式的区别。它们可以被视为是两种模式,当使用60H功能码设置从机地址时,该从机就被切换到从机地址模式;当使用61H功能码设置分组地址时,该从机就被切换到分组地址模式。
从机地址模式下:总线上的电机不可以设置为相同的从机地址,因为从机收到指令后都会执行指令,并应答主机,会出现总线应答冲突等问题。(可以用6FH功能码设置从机指令不回响。)
分组地址模式下:总线上的电机可以设置为相同的分组地址,因为被设置为分组地址的从机收到指令都只执行指令,不作应答。
如果想分组地址模式下,也有从机应答,怎么办?答:将其中一个从机地址的值设置等于分组地址,此过程要用60H功能码来设置。
顺便介绍一下广播地址,如果下行帧的从机地址是0,表示广播地址,那么总线上所有的从机都被同步通讯和控制。发广播地址指令,所有从机都只执行指令,不作应答,避免应答冲突。广播地址和分组地址都可以实现同步通讯和控制,广播地址是所有从机都进行的,而分组地址是部分被设置为相同分组地址的从机进行的。
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
61H |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
61H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于设置分组地址。(总线上可设置相同的分组地址,进行同步通讯和控制)
下行帧的指令数据:
Byte1:新的分组地址(范围:1~255)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:新的分组地址
举个例子:
主机发送 C5 01 61 02 29 5C
从机操作成功,应答 C5 01 61 01 02 2A 5C
下行帧的指令数据:
Byte1:新的分组地址设置为2
上行帧的指令数据:
Byte2:新的分组地址成功设置为2
注意:下次再想跟这个从机通信,注意从机地址要改成2了!!!
假设有6个电机,地址设置如下:
|
电机序号 |
广播地址 |
从机地址 |
分组地址 |
|
电机 1 |
0 |
1 |
|
|
电机 2 |
0 |
|
1 |
|
电机 3 |
0 |
|
1 |
|
电机 4 |
0 |
|
2 |
|
电机 5 |
0 |
|
2 |
|
电机 6 |
0 |
|
2 |
从机地址模式和分组地址模式是互斥的,同一时刻只能二选一!!!
主机发送C5 00 F3 00 64 07 D0 00 07 D0 00 CA 5C,电机1~6都转10圈,都不作应答
主机发送C5 01 F3 00 64 07 D0 00 07 D0 00 CB 5C,电机1~3都转10圈,只有电机1应答
主机发送C5 02 F3 00 64 07 D0 00 07 D0 00 CC 5C,电机4~6都转10圈,都不作应答
4.3.22 设置工作模式指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
62H |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
62H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于设置工作模式。
下行帧的指令数据:
Byte1:新的工作模式,有以下可能:
0x00:通信位置模式
0x01:通信速度模式
0x02:通信力矩模式
0x03:脉冲模式
0x04:脉宽位置模式
0x05:脉宽速度模式
0x06:脉宽力矩模式
0x07:回零模式
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:新的工作模式
举个例子:
主机发送 C5 01 62 00 28 5C
从机操作成功,应答 C5 01 62 01 00 29 5C
下行帧的指令数据Byte1:新的工作模式为0,即通信位置模式
上行帧的指令数据Byte2:新的工作模式为0,即通信位置模式
4.3.23 设置位置环PID参数指令
|
| |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
63H |
Byte1 |
… |
Byte12 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
63H |
Byte1 |
… |
Byte13 |
CHECKSUM |
5CH |
该指令用于设置位置环PID参数。
下行帧的指令数据:
Byte1~ Byte4:PID参数P(类型uint32_t)
Byte5~ Byte8:PID参数I(类型uint32_t)
Byte9~ Byte12:PID参数D(类型uint32_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:PID参数P(类型uint32_t)
Byte6~ Byte9:PID参数I(类型uint32_t)
Byte10~ Byte13:PID参数D(类型uint32_t)
举个例子:
主机发送 C5 01 63 00 00 01 2C 00 00 00 1E 00 00 01 7C F1 5C
从机操作成功,应答 C5 01 63 01 00 00 01 2C 00 00 00 1E 00 00 01 7C F2 5C
下行帧的指令数据:
Byte1~ Byte4:0x0000012C表示Q轴PI参数p为300
Byte5~ Byte8:0x0000001E表示Q轴PI参数I为30
Byte9~ Byte12:0x0000017C表示D轴PI参数P为380
上行帧的指令数据:
Byte2~ Byte5:0x0000012C表示Q轴PI参数p为300
Byte6~ Byte9:0x0000001E表示Q轴PI参数I为30
Byte10~ Byte13:0x0000017C表示D轴PI参数P为380
4.3.24 设置速度/位置环最大力矩限制指令
|
下行帧 ( 上位机 --> 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
64H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
64H |
Byte1 |
Byte2 |
Byte3 |
CHECKSUM |
5CH |
该指令用于设置速度/位置环最大力矩限制(范围:0~3000)(单位:mA)。
下行帧的指令数据:
Byte1~ Byte2:速度/位置环最大力矩电流限制
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte3:速度/位置环最大力矩电流限制
举个例子:
主机发送 C5 01 64 05 DC 0B 5C
从机操作成功,应答 C5 01 64 01 05 DC 0C 5C
下行帧的指令数据Byte1~ Byte2:速度/位置环最大力矩电流限制为1500mA
上行帧的指令数据Byte2~ Byte3:速度/位置环最大力矩电流限制为1500mA
4.3.25 设置细分指令
|
下行帧 ( 上位机 --> 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
65H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
65H |
Byte1 |
Byte2 |
Byte3 |
CHECKSUM |
5CH |
该指令用于设置细分(范围:1~256)。
下行帧的指令数据:
Byte1~ Byte2:细分
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte3:细分
举个例子:
主机发送 C5 01 65 00 10 3B 5C
从机操作成功,应答 C5 01 65 01 00 10 3C 5C
下行帧的指令数据Byte1~ Byte2:细分为16
上行帧的指令数据Byte2~ Byte3:细分为16
4.3.26 设置目标电流指令
|
下行帧 ( 上位机 --> 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
66H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
66H |
Byte1 |
Byte2 |
Byte3 |
CHECKSUM |
5CH |
该指令用于设置目标电流(范围:-3000~3000)(单位:mA)。
下行帧的指令数据:
Byte1~ Byte2:目标电流
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte3:目标电流
举个例子:
主机发送 C5 01 66 0B B8 EF 5C
从机操作成功,应答 C5 01 66 01 0B B8 F0 5C
下行帧的指令数据Byte1~ Byte2:目标电流为3000mA
上行帧的指令数据Byte2~ Byte3:目标电流为3000mA
4.3.27 设置串口波特率指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
67H |
Byte1 |
… |
Byte4 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
67H |
Byte1 |
… |
Byte5 |
CHECKSUM |
5CH |
该指令用于设置串口波特率(范围:0~3000000)(默认:115200)(单位bps)。
下行帧的指令数据:
Byte1~ Byte4:串口波特率
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:串口波特率
举个例子:
主机发送 C5 01 67 00 01 C2 00 F0 5C
从机操作成功,应答 C5 01 67 01 00 01 C2 00 F1 5C
下行帧的指令数据Byte1~ Byte4:设置串口波特率为115200 bps
上行帧的指令数据Byte2~ Byte5:设置串口波特率为115200 bps
注意:设置了串口波特率,上位也必须设置一样的波特率,方可通信!!!
4.3.28 设置CAN波特率指令
|
下行帧 ( 上位机 --> 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
68H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
68H |
Byte1 |
Byte2 |
Byte3 |
CHECKSUM |
5CH |
该指令用于设置CAN波特率(范围:125、250、500、1000)(单位kbps)。
下行帧的指令数据:
Byte1~ Byte2:CAN波特率
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte3:CAN波特率
举个例子:
主机发送 C5 01 68 01 F4 23 5C
从机操作成功,应答 C5 01 68 01 01 F4 24 5C
下行帧的指令数据Byte1~ Byte2:设置CAN波特率为500 kbps
上行帧的指令数据Byte2~ Byte3:设置CAN波特率为500 kbps
注意:设置了CAN波特率,上位也必须设置一样的波特率,方可通信!!!
4.3.29 设置协议指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
69H |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
69H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于设置使用正点原子自定义协议(默认)、modbus-rtu还是canopen协议。
下行帧的指令数据:
Byte1:0:使用正点原子自定义协议;1:使用modbus-rtu协议;2:使用canopen协议
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:0:使用正点原子自定义协议;1:使用modbus-rtu协议;2:使用canopen协议
举个例子:
主机发送 C5 01 69 00 2F 5C
从机操作成功,应答 C5 01 69 01 00 30 5C
下行帧的指令数据Byte1:0:使用正点原子自定义协议
上行帧的指令数据Byte2:0:使用正点原子自定义协议
注意:如果设置为1,那么正点原子自定义协议马上就不能通信了,需要通过屏幕菜单栏设置私有协议;或者恢复出厂设置;又或者用modbus-rtu协议指令设置回来!!!
4.3.30 设置堵转保护功能指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
6AH |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
6AH |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于设置堵转保护功能。
下行帧的指令数据:
Byte1:0:关闭堵转保护功能;1:开启堵转保护功能
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:0:关闭堵转保护功能;1:开启堵转保护功能
举个例子:
主机发送 C5 01 6A 01 31 5C
从机操作成功,应答 C5 01 6A 01 01 32 5C
下行帧的指令数据Byte1:1:开启堵转保护功能
上行帧的指令数据Byte2:1:开启堵转保护功能
4.3.31 设置堵转电流指令
|
下行帧 ( 上位机 --> 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
6BH |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
6BH |
Byte1 |
Byte2 |
Byte3 |
CHECKSUM |
5CH |
该指令用于设置堵转电流(范围:0~3000)(单位:mA)。
下行帧的指令数据:
Byte1~ Byte2:堵转电流
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte3:堵转电流
举个例子:
主机发送 C5 01 6B 07 D0 08 5C
从机操作成功,应答 C5 01 6B 01 07 D0 09 5C
下行帧的指令数据Byte1~ Byte2:堵转电流 2000 mA
上行帧的指令数据Byte2~ Byte3:堵转电流 2000 mA
4.3.32 设置发送CAN_ID指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
6CH |
Byte1 |
… |
Byte4 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
6CH |
Byte1 |
… |
Byte5 |
CHECKSUM |
5CH |
该指令用于设置要发送的CAN_ID(CAN固定使用标准帧,标准帧ID:11位)。
下行帧的指令数据:
Byte1~ Byte4:要发送的CAN_ID
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:要发送的CAN_ID
举个例子:
主机发送 C5 01 6C 00 00 00 01 33 5C
从机操作成功,应答 C5 01 6C 01 00 00 00 01 34 5C
下行帧的指令数据Byte1~ Byte4:要发送的CAN_ID为 0x01
上行帧的指令数据Byte2~ Byte5:要发送的CAN_ID为 0x01
4.3.33 电机正反转DIR控制指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
6DH |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
6DH |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于设置DIR引脚控制电机正反转的有效电平。(仅用于脉冲模式)
下行帧的指令数据:
Byte1:0:DIR引脚高电平正转;1:DIR引脚低电平正转
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:0:DIR引脚高电平正转;1:DIR引脚低电平正转
举个例子:
主机发送 C5 01 6D 01 34 5C
从机操作成功,应答 C5 01 6D 01 01 35 5C
下行帧的指令数据Byte1:1:DIR引脚低电平正转
上行帧的指令数据Byte2:1:DIR引脚低电平正转
4.3.34 设置EN引脚有效电平指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
6EH |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
6EH |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令设置EN引脚有效电平。(仅用于脉冲模式)
下行帧的指令数据:
Byte1:0:EN引脚低电平使能;1:EN引脚高电平使能;2:EN引脚保持有效
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:0:EN引脚低电平使能;1:EN引脚高电平使能;2:EN引脚保持有效
举个例子:
主机发送 C5 01 6E 01 35 5C
从机操作成功,应答 C5 01 6E 01 01 36 5C
下行帧的指令数据Byte1:1:EN引脚高电平使能
上行帧的指令数据Byte2:1:EN引脚高电平使能
4.3.35 指令回响指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
6FH |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
6FH |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于配置从机接收到指令后是否回响(即应答)。
下行帧的指令数据:
Byte1:从机接收到指令后是否回响,有以下可能:
0:指令回响
1:指令不回响
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:从机接收到指令后是否回响
举个例子:
主机发送 C5 01 6F 01 36 5C
从机操作成功,应答 C5 01 6F 01 37 5C
下行帧的指令数据Byte1:1:指令不回响
上行帧的指令数据Byte2:1:指令不回响
4.3.36 设置按键锁定指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
70H |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
70H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于设置按键锁定。
下行帧的指令数据:
Byte1:0:按键解锁;1:按键上锁
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:0:按键解锁;1:按键上锁
举个例子:
主机发送 C5 01 70 01 37 5C
从机操作成功,应答 C5 01 70 01 01 38 5C
下行帧的指令数据Byte1:1:按键上锁
上行帧的指令数据Byte2:1:按键上锁
注意:如果设置为1,那么按键功能马上失效,需要通过屏幕菜单栏选择恢复出厂设置或者发送设置按键解锁指令,方可恢复按键功能!!!
4.3.37 设置自动熄屏指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
71H |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
71H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于设置自动熄屏,长时间无操作会自动熄屏。
下行帧的指令数据:
Byte1:0:关闭自动熄屏;1:开启自动熄屏
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:0:关闭自动熄屏;1:开启自动熄屏
举个例子:
主机发送 C5 01 71 01 38 5C
从机操作成功,应答 C5 01 71 01 01 39 5C
下行帧的指令数据Byte1:1:开启自动熄屏
上行帧的指令数据Byte2:1:开启自动熄屏
注意:如果设置为1,那么长时间无操作时会自动熄屏,可通过屏幕菜单栏自动熄屏或恢复出厂设置,也可发送关闭自动熄屏指令,恢复屏幕常亮!!!
4.3.38 设置IO启动指令
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
72H |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
72H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于配置IO启停模式的启动电平。
下行帧的指令数据:
Byte1:启动电平,有以下可能:
0:低电平启动
1:高电平启动
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:启动电平
举个例子:
主机发送 C5 01 72 00 38 5C
从机操作成功,应答 C5 01 72 01 00 39 5C
下行帧的指令数据Byte1:0:低电平启动
上行帧的指令数据Byte2:0:低电平启动
4.3.39 设置速度环PID参数指令
|
| |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
73H |
Byte1 |
… |
Byte12 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | |||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | ||
|
C5H |
01H |
73H |
Byte1 |
… |
Byte13 |
CHECKSUM |
5CH |
该指令用于设置位置环PID参数。
下行帧的指令数据:
Byte1~ Byte4:PID参数P(类型uint32_t)
Byte5~ Byte8:PID参数I(类型uint32_t)
Byte9~ Byte12:PID参数D(类型uint32_t)
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2~ Byte5:PID参数P(类型uint32_t)
Byte6~ Byte9:PID参数I(类型uint32_t)
Byte10~ Byte13:PID参数D(类型uint32_t)
举个例子:
主机发送 C5 01 73 00 00 01 2C 00 00 00 1E 00 00 01 7C 01 5C
从机操作成功,应答 C5 01 73 01 00 00 01 2C 00 00 00 1E 00 00 01 7C 02 5C
下行帧的指令数据:
Byte1~ Byte4:0x0000012C表示Q轴PI参数p为300
Byte5~ Byte8:0x0000001E表示Q轴PI参数I为30
Byte9~ Byte12:0x0000017C表示D轴PI参数P为380
上行帧的指令数据:
Byte2~ Byte5:0x0000012C表示Q轴PI参数p为300
Byte6~ Byte9:0x0000001E表示Q轴PI参数I为30
Byte10~ Byte13:0x0000017C表示D轴PI参数P为380
4.3.40 设置到位指令是否到位回响
|
下行帧 ( 上位机 --> 驱动板 ) | |||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 |
|
C5H |
01H |
74H |
Byte1 |
CHECKSUM |
5CH |
|
上行帧 ( 上位机 <-- 驱动板 ) | ||||||
|
帧头 |
从机地址 |
功能码 |
指令数据 |
检验码 |
帧尾 | |
|
C5H |
01H |
74H |
Byte1 |
Byte2 |
CHECKSUM |
5CH |
该指令用于配置从机到位后是否上报到位指令。
下行帧的指令数据:
Byte1:从机接收到指令后是否上报到位指令,有以下可能:
0:到位不回响
1:到位回响
上行帧的指令数据:
Byte1:表示指令操作结果
Byte2:从机接收到指令后是否回响
举个例子:
主机发送 C5 01 74 01 3B 5C
从机操作成功,应答 C5 01 74 01 01 3C 5C
下行帧的指令数据Byte1:1:上报到位状态
上行帧的指令数据Byte2:1:到位上报到位状态,此时在“位置模式”下,只要电机停止运动后,会主动上报一次电机到位标志,指令格式:C5 01 30 01 xx xx 5C。具体指令介绍请查看4.3.17小节。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040860/viewspace-3175721/ ,如需转载,请注明出处,否则将追究法律责任。