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

158 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 指令说明
## 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`