UART 通讯功能使用
UART 通讯协议
- 波特率:115200
- 数据位:8bit
- 停止位:1bit
- 校验位:无
- 回复方式:一问一答
UART 通讯协议采用固定的十个字节格式:
| 设备地址 | 命令字 | 对象地址 | 错误/清除 | 数据区 | 校验 | ||||
|---|---|---|---|---|---|---|---|---|---|
| Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 | Byte8 | Byte9 | Byte10 |
| ID | CMD | AddrH | AddrL | ErrR | Data(MSB) | Data(N-1) | Data(N-2) | Data(LSB) | Check |
- ID: 本机地址,默认为 0x01。若 ID 不对,那本机将无响应。
- CMD: 命令字,分为读命令 0xA0 和写命令 0x51,0x52,0x54。
命令字具体定义如下:
-
读命令:主机读取本机相关对象地址的数
主机发送 CMD 本机回复 CMD 对应意义 0xA0 By0xA1 对象数据是 8 位:[Data(LSB)] 0xA0 0xA2 对象数据是 16 位:[Data(N-2)~Data(LSB)] 0xA0 0xA4 对象数据是 32 位:[Data(MSB)~Data(LSB)] 0xA0 0x5F 对象地址不存在,数据区无效 0xA0 0x80 校验出错, 数据区无效 -
写命令:主机往本机相关对象地址写数据
主机发送 CMD 本机回复 CMD 对应意义 0x51 0x61 对象数据是 8 位:[Data4],写成功 0x50 数据类型不匹配,写失败 0x58 对象地址不可写,写失败 0x5F 对象地址不存在,写失败 0x52 0x62 对象数据是 16 位:[Data3~Data4],写成功 0x50 数据类型不匹配,写失败 0x58 对象地址不可写,写失败 0x5F 对象地址不存在,写失败 0x54 0x64 对象数据是 32 位:[Data1~Data4],写成功 0x50 数据类型不匹配,写失败 0x58 对象地址不可写,写失败 0x5F 对象地址不存在,写失败
-
- AddrH,AddrL: 对象地址高 8 位和低 8 位
- ErrR:错误报告与清除
- 主机任何有效读/写帧中,ErrR 若为 0xCE,即清除本机错误。
- 本机返回的 ErrR 中的数据即代表本机错误信息,8bit 中代表 8 种错误,0 无错误,1 有错误.错误明细如下:
本机回应的 ErrR 错误描述 bit0: [LSB] 保留 bit1: 跟随误差超过允许值 bit2: 编码器错误 bit3: 电机过载 bit4: 驱动器温度过高 bit5: 直流母线电压过高 bit6: 直流母线电压过低 bit7: [MSB] 驱动器输出短路
- Data(MSB)~Data(LSB): 数据区,高位在前,地位在后。
- Check:校验和, Check=[Byte1~Byte9]求和取低 8 位。
UART 通讯实例
实例1:读取驱动器实际直流母线电压
通过查阅常用对象列表中的"表 F1-3 测量数据"列表,可知"实际直流母线电压"对象地址为 0x5001,且是个 16 位有符号数。假设当前实际直流母线电压值为 36V。
| 设备地址 | 命令字 | 对象地址 | 错误/清除 | 数据区 | 校验 | |||||
|---|---|---|---|---|---|---|---|---|---|---|
| 主机发送 | 0x01 | 0xA0 | 0x50 | 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0xF2 |
| 本机回应 | 0x01 | 0xA2 | 0x50 | 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x24 | 0x18 |
实例2:读取电机编码器实际位置
通过查阅常用对象列表中的"表 F1-3 测量数据"列表,可知"实际位置值"对象地址为 0x7071,且是个 32 位有符号数。
| 设备地址 | 命令字 | 对象地址 | 错误/清除 | 数据区 | 校验 | |||||
|---|---|---|---|---|---|---|---|---|---|---|
| 主机发送 | 0x01 | 0xA0 | 0x70 | 0x71 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x82 |
| 假设当前电机编码器实际位置 -8237,其十六进制为 0xFFFFDFD3 | ||||||||||
| 本机回应 | 0x01 | 0xA4 | 0x70 | 0x71 | 0x00 | 0xFF | 0xFF | 0xDF | 0xD3 | 0x36 |
| 如果驱动器有错误发生,假设发生了"跟随误差超过允许值"错误 | ||||||||||
| 本机将会回应 | 0x01 | 0xA4 | 0x70 | 0x71 | 0x02 | 0xFF | 0xFF | 0xDF | 0xD3 | 0x38 |
实例3:写目标速度 rpm
通过查阅常用对象列表中的"表 F1-2 基本模式及控制"列表,可知"目标速度 rpm"对象地址为 0x70B1,且是个 16 位有符号数。假设要写入的数据是 100,即十六进制为 0x0064。
| 设备地址 | 命令字 | 对象地址 | 错误/清除 | 数据区 | 校验 | |||||
|---|---|---|---|---|---|---|---|---|---|---|
| 主机发送 | 0x01 | 0x52 | 0x70 | 0xB1 | 0x00 | 0x00 | 0x00 | 0x00 | 0x64 | 0xD8 |
| 本机回应 | 0x01 | 0x62 | 0x70 | 0xB1 | 0x00 | 0x00 | 0x00 | 0x00 | 0x64 | 0xE8 |
实例4:写目标速度(更精细速度命令)
通过查阅常用对象列表中的"表 F1-2 基本模式及控制"列表,可知"目标速度"对象地址为 0x70B2,且是个 32 位有符号数。
假设要实现是 3.21rpm 速度命令,通过公式
U[y,x]:[DEC]=([rpm] * 512 * [反馈精度])/1875,计算出对应的 DEC 数值,这里[反馈精度]是 4096。
[DEC]=(3.21 * 512 * 4096)/1875=3590,即十六进制为 0x0E06。
| 设备地址 | 命令字 | 对象地址 | 错误/清除 | 数据区 | 校验 | |||||
|---|---|---|---|---|---|---|---|---|---|---|
| 主机发送 | 0x01 | 0x54 | 0x70 | 0xB2 | 0x00 | 0x00 | 0x00 | 0x0E | 0x06 | 0x8B |
| 本机回应 | 0x01 | 0x64 | 0x70 | 0xB2 | 0x00 | 0x00 | 0x00 | 0x0E | 0x06 | 0x9B |