5.7 KiB
5.7 KiB
指令说明
Modbus 通讯参数
| 参数 | 值 |
|---|---|
| 物理层 | RS485 半双工 |
| 串口 | UART1 (USART1) |
| 波特率 | 115200 |
| 数据位 | 8 |
| 校验位 | 无 |
| 停止位 | 1 |
| 主站地址 | 0xFE |
| 从站地址 | 0x40 + ID,ID 由 4 个 GPIO 引脚组合(范围 0~15),见 ID 指示器定义 |
| 协议 | Modbus RTU |
Modbus 功能码
| 功能 | 码值 | 说明 |
|---|---|---|
| 读保持寄存器 | 0x03 |
读取 1~125 个连续寄存器 |
| 写单个寄存器 | 0x06 |
写入 1 个寄存器 |
寄存器映射
| 地址 | 名称 | 读写 | 数据类型 | 说明 |
|---|---|---|---|---|
0x0000 |
MOTOR_CURRENT | R | uint16 | 电机电流值 |
0x0001 |
MOTOR_POSITION | R | int16 | 当前位置(步数) |
0x0002 |
MOTOR_TARGET | R/W | int16 | 目标位置(步数) |
0x0003 |
MOTOR_SPEED | R | uint16 | 当前速度 |
0x0004 |
MOTOR_STATE | R | uint16 | 步进电机状态(0=空闲,1=加速,2=匀速,3=减速,4=停止,5=标定中) |
0x0005 |
AS5600_ANGLE | R | uint16 | AS5600 角度值(0.1°精度,0~3599) |
0x0006 |
AS5600_RAW | R | uint16 | AS5600 原始值 |
0x0007 |
DI_MAX_STATE | R | uint16 | 最大值到位开关(0=未触发,1=触发) |
0x0008 |
DI_MIN_STATE | R | uint16 | 最小值到位开关(0=未触发,1=触发) |
0x0009 |
CALIBRATED_STEPS | R | uint16 | 标定的总步数 |
0x000A |
ORIGIN_STEPS | R | int16 | 原点步数(最小值位置) |
0x000B |
MAX_STEPS | R | int16 | 最大步数(最大值位置) |
0x000C |
IS_CALIBRATED | R | uint16 | 是否已标定(0=未标定,1=已标定) |
0x000D |
IS_DI_MAX_INSTALLED | R | uint16 | DI_MAX 是否安装(0=未安装,1=已安装) |
0x000E |
MODBUS_SLAVE_ADDR | R | uint16 | 当前 Modbus 从站地址(如 0x40~0x4F) |
0x000F |
DEVICE_ID | R | uint16 | 设备 ID(0~15) |
0x0020 |
MOTOR_POSITION_H | R | int16 | 当前位置高 16 位 |
0x0021 |
MOTOR_TARGET_H | R/W | int16 | 目标位置高 16 位 |
0x0022 |
CALIBRATED_STEPS_H | R | uint16 | 标定总步数高 16 位 |
0x0023 |
ORIGIN_STEPS_H | R | int16 | 原点步数高 16 位 |
0x0024 |
MAX_STEPS_H | R | int16 | 最大步数高 16 位 |
0x0042 |
CMD | W | uint16 | 指令寄存器(写入指令码触发动作) |
0x0043 |
STATUS | R | uint16 | 整机状态(读寄存器) |
0x0044 |
ANGLE_TARGET | R/W | uint16 | 角度目标值(单位 0.1°,范围 0~3600) |
注:32 位数据(如位置、步数)拆分到两个 16 位寄存器中:
- 低 16 位在主地址(如
0x0001) - 高 16 位在主地址 + 0x0020(如
0x0021) - 读写时需分别操作两个寄存器。
指令码(CMD 寄存器 0x0042)
写入 0x0042 寄存器触发动作,写完后硬件自动清零:
| 指令码 | 名称 | 说明 |
|---|---|---|
0x0001 |
GO_MAX | 运行到最大值位置 |
0x0002 |
GO_MIN | 运行到最小值位置(原点) |
0x0003 |
STOP | 立即停止运行 |
0x0004 |
GO_POSITION | 运行到指定步数(需先写入 MOTOR_TARGET) |
0x0005 |
GO_ANGLE | 运行到指定角度(需先写入 ANGLE_TARGET) |
0x0006 |
CALIBRATE | 开始标定 |
0x0007 |
CALIB_END | 结束标定 |
0x0008 |
READ_STATUS | 读取当前状态(读 STATUS 寄存器即可) |
整机状态(STATUS 寄存器 0x0043)
读取 0x0043 寄存器获取整机运行状态:
| 状态码 | 名称 | 说明 |
|---|---|---|
0x0000 |
IDLE | 待机模式,等待指令 |
0x0001 |
RUNNING | 正在运行(移动到目标位置中) |
0x0002 |
CALIB | 正在标定 |
0x0003 |
STOPPED | 已停止(执行停止指令后) |
0x0004 |
ERROR | 错误状态 |
通信示例
读当前位置
请求: FE 03 00 01 00 01 CRC_LO CRC_HI
响应: 40+ID 03 02 POS_HI POS_LO CRC_LO CRC_HI
读整机状态
请求: FE 03 00 43 00 01 CRC_LO CRC_HI
响应: 40+ID 03 02 00 01 CRC_LO CRC_HI <- 状态 = RUNNING
运行到最大值
请求: FE 06 00 42 00 01 CRC_LO CRC_HI
响应: 40+ID 06 00 42 00 01 CRC_LO CRC_HI
运行到指定步数(1000 步)
请求: FE 06 00 02 03 E8 CRC_LO CRC_HI <- 写 MOTOR_TARGET = 1000
响应: 40+ID 06 00 02 03 E8 CRC_LO CRC_HI
请求: FE 06 00 42 00 04 CRC_LO CRC_HI <- 写 CMD = GO_POSITION
响应: 40+ID 06 00 42 00 04 CRC_LO CRC_HI
运行到指定角度(45.0°)
请求: FE 06 00 44 01 C2 CRC_LO CRC_HI <- 写 ANGLE_TARGET = 450(45.0°)
响应: 40+ID 06 00 44 01 C2 CRC_LO CRC_HI
请求: FE 06 00 42 00 05 CRC_LO CRC_HI <- 写 CMD = GO_ANGLE
响应: 40+ID 06 00 42 00 05 CRC_LO CRC_HI
读取多个寄存器(当前位置+速度+状态)
请求: FE 03 00 01 00 04 CRC_LO CRC_HI
响应: 40+ID 03 08 POS_HI POS_LO TGT_HI TGT_LO SPD_HI SPD_LO STA_HI STA_LO CRC_LO CRC_HI
标定流程
请求: FE 06 00 42 00 06 CRC_LO CRC_HI <- 开始标定
响应: 40+ID 06 00 42 00 06 CRC_LO CRC_HI
(标定执行中...)
请求: FE 03 00 43 00 01 CRC_LO CRC_HI <- 查询状态
响应: 40+ID 03 02 00 02 CRC_LO CRC_HI <- 状态 = CALIB
...
请求: FE 06 00 42 00 07 CRC_LO CRC_HI <- 结束标定
响应: 40+ID 06 00 42 00 07 CRC_LO CRC_HI
停止运行
请求: FE 06 00 42 00 03 CRC_LO CRC_HI
响应: 40+ID 06 00 42 00 03 CRC_LO CRC_HI
从站地址计算
设备 ID 由 4 个 GPIO 引脚 (PB5~PB8) 读取:
| PB8 | PB7 | PB6 | PB5 | ID | 从站地址 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0x40 |
| 0 | 0 | 0 | 1 | 1 | 0x41 |
| 0 | 0 | 1 | 0 | 2 | 0x42 |
| ... | ... | ... | ... | ... | ... |
| 1 | 1 | 1 | 1 | 15 | 0x4F |
从站地址计算公式:0x40 + ID