Files
StepMotorCtrl/.trae/skills/create-project/references/command.md
T

158 lines
5.7 KiB
Markdown
Raw Normal View History

# 指令说明
## 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 | 设备 ID0~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`